Wie verwende ich ein "(Anführungszeichen) als FOR / F-Trennzeichen in CMD.exe unter Windows 7?


6

Ich möchte, dass eine .bat-Datei eine Liste aller * .XML-Dateien in einem Visual Studio-Projekt abruft. Bisher habe ich versucht, zunächst eine alte Version von GREP zu verwenden:

SET TempName=%temp%\TEMP%RANDOM%.bat
c:\bin\grep.exe -i \.xml\^" MyProject.vcxproj  >> %TempName%

aber dann muss ich die Dateinamen von dieser temporären Datei erhalten

Ich habe Dinge ausprobiert wie

FOR /F "tokens=2 delims="" %%F IN (%TempName%) DO ECHO %%F
FOR /F "tokens=2 delims=^"" %%F IN (%TempName%) DO ECHO %%F
FOR /F 'tokens=2 delims="' %%F IN (%TempName%) DO ECHO %%F

aber keiner von ihnen funktioniert. Es scheint, als würde das Trennzeichen "als abschließendes Anführungszeichen der Optionsliste behandelt, weshalb ich ^beim zweiten Versuch versucht habe, es zu umgehen.


Was ist mit Backslash \"?
Woche

Backslash ist der Verzeichnisbegrenzer in Windows. Verwenden Sie einen Schrägstrich, um das Anführungszeichen zu umgehen.
Ian Atkin

Nicht generell zBfindstr \.
Woche

Antworten:


5

Normalerweise werden FOR-Optionen in Anführungszeichen gesetzt. Wenn Sie ein Zitat als Teil einer Option verwenden möchten, müssen die einschließenden Zitate gestrichen werden. Das bedeutet, dass alle Zeichen, die der CMD-Interpreter als Token-Trennzeichen verwendet, einschließlich Leerzeichen und Gleichheitszeichen maskiert werden müssen. Auch das Zitat muss maskiert werden.

for /f tokens^=2^ delims^=^" %%F in ...

Dieselbe Technik wird verwendet, um ein anderes allgemeines Problem zu lösen - wie man FOR / F verwendet und die gesamte Zeile beibehält, unabhängig davon, mit welchem ​​Zeichen eine bestimmte Zeile beginnt. Das Problem ist die EOL-Option (standardmäßig Semikolon). Um die Erhaltung der gesamten Leitung zu gewährleisten, muss die EOL deaktiviert werden. Auch hier werden die umschließenden Anführungszeichen entfernt und Token-Trennzeichen müssen entfernt werden.

for /f delims^=^ eol^= %%F in ....

DELIMS wird auf nichts gesetzt, da in der DELIMS-Option niemals ein Leerzeichen enthalten ist, es sei denn, es ist die letzte angegebene Option. Das nächste nachfolgende Optionszeichen EOL= wird als EOL-Zeichen verwendet. In diesem Fall gibt es jedoch kein nächstes Zeichen, da das Leerzeichen nicht maskiert oder in Anführungszeichen gesetzt wird. Die obige Syntax deaktiviert also sowohl DELIMS als auch EOL.


0

Anführungszeichen kennzeichnen die Grenzen von Literalzeichenfolgen, in denen Metazeichen nicht analysiert werden. Dies schließt Escape-Zeichen ein, in der Regel das Caret, sodass das zweite Vorkommen der doppelten Anführungszeichen nicht maskiert werden kann. Im Allgemeinen endet das Symbol, das das Ende einer Literalzeichenfolge kennzeichnet, immer die Literalzeichenfolge.

Wenn Sie das Parsen des "-Zeichens verhindern wollen, müssen Sie es mit einem nicht zitierten Caret maskieren. Leider enthält fors options string oft eine ganze Reihe von Zeichen, die maskiert werden müssen, und die Lesbarkeit leidet deutlich. Ohne die Verwendung von temporären Dateien leidet das Befehl würde erweitern auf:

for /F usebackq^ tokens^=2^ delims^=^" %i in (`findstr /I /R \.cpp\^" MyProj.vcxproj`) do @echo %i

Beachten Sie, dass dies nicht zu korrekten Ergebnissen führt, wenn das gewünschte Token nicht das zweite ist. Eine weitere Verschachtelung einer for-Schleife und eines findstr-Befehls könnte dies leicht korrigieren, aber die Syntax wäre äußerst unsauber und würde möglicherweise den Rahmen dieser Frage sprengen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.