
Mir ist gerade aufgefallen, dass ich beim Start eine Bat-Datei mit diesem Registrierungsschlüssel ausführe, die echo running abc
und einige andere irrelevante Dinge hatte
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun
Also habe ich hier die Bat-Datei geändert. Sie enthält nur eine Zeile und nichts Relevantes.
Sie sehen den Inhalt der Bat-Datei.
Hier ist eine Ausgabe aus der Eingabeaufforderung, die die aktuelle Situation zeigt. Es handelt sich um dasselbe grundlegende Problem, aber Sie sollten in der Lage sein, das Problem zu reproduzieren.
Die Frage ist nun,
- Warum steht dort „echo sss“ und nicht „echo sss ttt“?
- Wie kann ich die Ausführung von cmd oder dieser Initialisierungs-Bat-Datei mit FOR unterdrücken? Die FOR-Anweisung sollte eigentlich nur „echo g“ anzeigen, nicht „echo sss“ oder „echo sss ttt“.
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
sss ttt
C:\Documents and Settings\Administrator>cd\
C:\>type \blah\startfile.bat <ENTER>
@echo sss ttt
C:\>
C:\>for /f %f in ('echo g ^| findstr "g"') do echo %f <ENTER>
C:\>echo sss
sss
C:\>echo g
g
C:\>
Antwort1
Warum steht dort „echo sss“ und nicht „echo sss ttt“?
Weil die Zeile sss ttt
ein Leerzeichen enthält. Der for
Befehl tokenisiert es und speichert die erste Hälfte sss
und %f
die zweite Hälfte ttt
in %g
einer Variablen.
Wie kann ich die Ausführung von cmd oder dieser Initialisierungs-Bat-Datei mit FOR unterdrücken? Die FOR-Anweisung sollte eigentlich nur „echo g“ anzeigen, nicht „echo sss“ oder „echo sss ttt“.
Scheint so, als ob zur Auswertung echo g ^| findstr "g"
ein neuer Befehlsinterpreter initialisiert wird und Ihr Befehl \blah\startfile.bat
automatisch ausgeführt wird. Sorgen Sie dafür, dass Ihr Batch nichts ausgibt.
Antwort2
%f
Wenn Sie es in einer Batchdatei verwenden möchten , müssen Sie es mit einem anderen maskieren %
:
for /f %%f in ('echo g ^| findstr "g"') do echo %%f
Fügen Sie das in Ihre Batchdatei ein und Sie sollten die gewünschten Ergebnisse erhalten.
Antwort3
Um Vlastimils Antwort noch ein wenig zu erweitern …
Wenn dasFOR
Der Befehl führt den"echo g"
und leitet die Ausgabe weiter anfindstr
,FÜRmuss zunächst ein neuer Kommandoprozessor gestartet werden, was dazu führt,\blah\startfile.bat
ermordet werden.
\blah\startfile.batgibt eine Zeile aus mitsss ttt
. Diese Zeile wird verarbeitet vonFÜRund istNICHTweitergereicht anSuche.
Nach der Hilfe fürFÜR:
Die Verarbeitung besteht aus ..., dem Aufteilen in einzelne Textzeilen und dem anschließenden Parsen jeder Zeile in null oder mehr Token. Der Hauptteil der For-Schleife wird dann aufgerufen, wobei die Variablenwerte auf die gefundenen Token-Zeichenfolgen gesetzt werden. Standardmäßig übergibt /F das erste durch Leerzeichen getrennte Token aus jeder Zeile ...
Die Standardtrennzeichen fürFÜRSind:" ,;"(Leerzeichen, Komma und Semikolon).
Die erste Zeile, dieFÜRProzesse enthalten die Zeichenfolge:sss ttt. Diese Zeichenfolge enthält eine" "
(Leerzeichen), das ein Standardtrennzeichen fürFÜR, das die Zeile analysiert und die erste Token-Zeichenfolge zuweist:"sss"Zu"%F". Also die"echo %f"gibt eine Zeile aus mit nur:"sss". Das ist die erste Zeile, die Sie gedruckt sehen."ttt"wird einfach verworfen, weil die„FÜR … echo %f“Der Befehl hat nicht angegeben, dass mehr als das erste Token eingeschlossen werden soll.
Wenn dasFÜRBefehl anders geschrieben wäre, hätte man die ganze Zeile gesehen"sss ttt"hallte.
Hier sind 3 Möglichkeiten, dieFÜRDer entsprechende Befehl hätte geschrieben werden können.
Die erste Möglichkeit, mit dem"delims="
Option, legt das Trennzeichen fürFÜRzu "leeren", alsoFÜRgibt die gesamte Zeile als 1 Token zurück. Die Token werden weiterhin analysiert und alle Trennzeichen (" ,;") entfernt werden, dann werden alle Token erneut mit einem Leerzeichen zwischen den Token kombiniert. Dieser kombinierte Wert wird in der Variable"%F"
C:\>for /f "delims=" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "delims=" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\>echo mm nn oo ss tt
mm nn oo ss tt
Dieser nächste Weg, mit dem"tokens=*"
Option, sagtFÜRum alle gefundenen Token in den Wert der angegebenen Variable zu setzen ("%F"). Die Token werden weiterhin analysiert und alle Trennzeichen werden entfernt. Anschließend werden alle Token erneut mit einem Leerzeichen zwischen den einzelnen Token kombiniert.
C:\>for /f "tokens=*" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\Users\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt
Dieser dritte Weg, mit dem"tokens=1,*"
Option, sagtFÜRum das erste (1) gefundene Token in den Wert der angegebenen Variable zu setzen ("%F"). Die verbleibenden Token werden analysiert und alle Trennzeichen entfernt. Anschließend werden alle verbleibenden Token erneut mit einem Leerzeichen zwischen den einzelnen Token kombiniert. Dieser kombinierte Wert wird in der Variablen zurückgegeben, die den Buchstaben hat, der auf den angegebenen Variablennamen folgt (in diesem Fall also die Variable"%G").
C:\>for /f "tokens=1,*" %f in ('echo sss ttt') do echo %f %g
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=1,*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo "%f" "%g"
C:\>echo "mm" "nn oo ss tt"
"mm" "nn oo ss tt"
Beachten Sie, dass das Folgende nicht funktioniert, da für Variablen jenseits der angegebenen Variable keine "Tokens=" definiert sind."%F":
C:\>for /f %f in ('echo sss ttt') do echo %f %g
C:\>echo sss %g
sss %g
Wenn Sie in Ihrem Beispiel also die"delims="
Option würden Sie Folgendes sehen:
C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f
C:\>echo sss ttt
sss ttt
C:\>echo g
g
C:\>