Как использовать " (кавычки) в качестве разделителя FOR /F в CMD.exe в Windows 7

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

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

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

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

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-я попытка.

24
задан Karan
23.03.2023 21:40 Количество просмотров материала 3288
Распечатать страницу

2 ответа

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

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

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

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

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

4
отвечен dbenham 2023-03-25 05:28

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

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

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

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

0
отвечен Marcks Thomas 2023-03-25 07:45

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх