6

Я хочу, чтобы файл .bat получил список всех *.XML-файлы в проекте Visual Studio То, что я пробовал до сих пор, это сначала использовать старую версию GREP:

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

но тогда мне нужно получить имена файлов из этого временного файла

Я пробовал такие вещи, как

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

но никто из них не работает. Похоже, что символ разделителя " трактуется как заключительная кавычка списка опций, поэтому я попытался избежать его с помощью ^ со 2-й попытки.

2 ответа2

5

Обычно опции FOR заключаются в кавычки. Если вы хотите использовать кавычку как часть опции, тогда заключенные в кавычки должны быть исключены. Это означает, что все символы, которые интерпретатор CMD использует в качестве разделителей токенов, должны быть экранированы, включая пробел и знак равенства. Также цитата должна быть экранирована.

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

Этот же метод используется для решения другой распространенной проблемы - как использовать FOR /F и сохранить всю строку независимо от того, какой символ начинает данную строку. Проблема в опции EOL (точка с запятой по умолчанию). Чтобы гарантировать сохранение всей линии, EOL должен быть отключен. Здесь снова заключенные в кавычки отбрасываются, а разделители токенов должны быть экранированы.

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

Для параметра DELIMS ничего не установлено, потому что пробел никогда не включается в параметр DELIMS, если это не последний заданный параметр. Следующий символ строки опции после EOL= принимается как символ EOL. Но в этом случае не существует следующего символа, потому что пробел не экранирован и не заключен в кавычки. Таким образом, приведенный выше синтаксис отключает как DELIMS, так и EOL.

0

Кавычки отмечают границы буквенных строк, в которых метасимволы не анализируются. Это включает в себя escape-символы, как правило, каретку, поэтому второе вхождение двойных кавычек не может быть экранировано. Обычно символ, который будет обозначать конец буквальной строки, всегда будет заканчиваться буквальной строкой.

Если вы хотите предотвратить синтаксический разбор символа "-характер", вам придется избежать его с помощью кавычек без кавычек. К сожалению, строка опций for часто содержит довольно много символов, которые нужно экранировать, и разборчивость явно страдает. Без использования временных файлов команда будет расширена до:

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

Обратите внимание, что это не даст правильных результатов, если нужный токен не является вторым. Дальнейшее вложение цикла for и команды findstr может легко исправить это, но синтаксис будет очень грязным и может оказаться за рамками этого вопроса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .