Eindeutige Kennung für einen DOS-Prozess auf einer einzelnen Maschine

602
Francky Leyn

Ich verwende einen Win 10-Computer mit verschiedenen Benutzern, und alle diese können dieselbe Bat-Datei verwenden.

In den bat-Skripten benötige ich eine temporäre Datei mit einem eindeutigen Namen, bestehend aus einem Identifikator für den Prozess, der derzeit auf diesem Computer verfügbar ist. Es können also mehrere solcher Prozesse gleichzeitig sein.

Als Dateiname möchten Sie C: \ Windows \ Temp \ ???. Txt verwenden.

Die Frage ist was ??? muss sein.

1
Sie sollten niemals Ihre eigenen Dateien in C: \ Windows ablegen. Warum legen Sie diese Dateien nicht in% USERPROFILE% ab? Jamie Hanrahan vor 5 Jahren 2
Oder einen ganz anderen Ordner, auf den jeder zugreifen kann. Was bedeutet "derzeit verfügbarer Prozess"? Warum können Sie die Datei nicht mit der gewünschten eindeutigen Kennung benennen? Aulis Ronkainen vor 5 Jahren 0
Der Befehl ist i_view64.exe, der 64-Bit-Bitmap-Bildeditor Irfanview. Ich verwende es wie folgt: `i_view64.exe inputfile.jpg / info = ???. Txt`. ??? Sie müssen verschiedene Benutzer auf demselben Computer abdecken und auch mehrere solcher Befehle von demselben Benutzer auf demselben Computer ausführen. Unter * NIX / POSIX ist dies $$. Ich weiß nicht was es unter DOS ist. Francky Leyn vor 5 Jahren 0
Ich möchte auch `C: \` verwenden, da sich diese Partition auf dem Multitask / Multiuser-PC auf einem SSD-Laufwerk befindet und dies schneller ist als die anderen Festplatten dieses PCs. Unter * NIX hat man / tmp / $$ für eine schnelle Fahrt. Auf dieser PC-Maschine ist die SSD die schnellste. Der Befehl i_view64.exe ist Bestandteil von bat-Skripts, die FOR-Befehle für z. B. 380 .png-Dateien enthalten. Dies dauert leicht 10 Minuten. Ich habe einen virtuellen * NIX auf diesem PC, möchte ihn aber nicht verwenden. Ich möchte DOS verwenden, da dieser Win 10 PC hauptsächlich auf DOS basiert. Francky Leyn vor 5 Jahren 0
Die Verwendung von `C: \ Windows \ Temp \ IrfanView \% USERPROFILE% \ info _ ???. Txt` wäre also ein erster Versuch. In diesem Fall muss man nur berücksichtigen ??? für die verschiedenen Prozesse, die von demselben Benutzer gleichzeitig auf diesem Computer gestartet werden. Francky Leyn vor 5 Jahren 0
Auf diesem System befindet sich mein Konto bei% USERPROFILE%, was gleich "C \ Users \ Francky Leyn" ist, und somit auf dieser C: \ SSD dieses Computers. "% USERPROFILE% \ tmp \ IrfanView \ info _ ???. Txt" würde also die Aufgabe erledigen, wenn ich weiß, was ??? muss sein. Francky Leyn vor 5 Jahren 0

1 Antwort auf die Frage

0
HackSlash

Die Antwort

Wenn Sie die PID von cmd.exe verwenden möchten, gehen Sie folgendermaßen vor:

title=uniqueTitle for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do set ourPID=%f i_view64.exe inputfile.jpg /info=%temp%\%ourPID%.txt 

Ich wandere, weil ich die Frage nicht verstanden habe:

Im Kontext einer Batch-Datei ist der "aktuelle Prozess" der des Befehlsinterpreters (conhost.exe oder cmd.exe). Wenn Sie die Prozess-ID der i_view64.exe abrufen möchten, müssen Sie sie zuerst ausführen und dann die Prozess-ID (die nicht trivial ist) abrufen. In Ihrem Fall fragen Sie nach der Prozess-ID, bevor sie erstellt wurde. Es gibt keine Möglichkeit vorherzusagen, was es zu dem Zeitpunkt sein wird, an dem Sie dem Prozess ein Befehlszeilenargument zuführen, da es noch nicht gestartet wurde.

Wenn Sie nur einen eindeutigen temporären Dateinamen an einem sicheren und zuverlässigen Ort wünschen, sollten Sie diese Frage prüfen:

https://stackoverflow.com/questions/27802376/create-unique-file-name-windows-batch

Es gibt eine Reihe von Lösungsvorschlägen.

Im Allgemeinen verwenden Sie% TEMP%, um die temporäre Position im System abzurufen. Dann generieren Sie Ihren Dateinamen.

So etwas könnte für Sie funktionieren:

%temp%\%username%-%date%-%random%.txt 

Passen Sie nach Bedarf an. Jede dieser Variablen wird erweitert, um einen vollständigen Pfad zu einer Datei zu erstellen.

Ich verwende es in der bat-Datei `get_resolution.bat`, die Folgendes enthält: Francky Leyn vor 5 Jahren 0
`i_view64.exe jpg_inputfile.jpg / info = textfile.txt`. Ich brauche also nicht die Prozess-ID von `i_view64.exe`. Ich brauche die Prozess-ID des aufrufenden Skripts `get_resolution.bat`. Francky Leyn vor 5 Jahren 0
Muss ich% USERNAME% verwenden? "echo% TEMP%" ist gleich "C: \ Users \ FRANCK ~ 1 \ AppData \ Local \ Temp". Was bedeutet das "~" überhaupt? "" echo% USERNAME% "liefert" "Francky Leyn" " Francky Leyn vor 5 Jahren 0
`CALL i_view64.exe" input.jpg "/ info =% TEMP% \ IrfanView \ info_% DATE% -% TIME% -% RANDOM% .txt" liefert "CALL i_view64.exe" input.jpg "/ info =" C: \ Users \ FRANCK ~ 1 \ AppData \ Local \ Temp \ IrfanView \ info_Fri 11/16 / 2018-9: 44: 27.14-13375.txt "`. Warum das Leerzeichen nach '% DATE% -`?' Francky Leyn vor 5 Jahren 0
K: \ test> ECHO% TIME% 12: 38: 21.00 Francky Leyn vor 5 Jahren 0
Dies kann nie funktionieren, da ":" kein gültiger NTFS-Dateiname ist. Francky Leyn vor 5 Jahren 0
@FranckyLeyn verstehe ich jetzt. Ich füge die Antwort, die Sie brauchen, oben in meinem Beitrag ein. HackSlash vor 5 Jahren 0