Пакет: Выполнить команду с кавычками для цикла for с конвейером, чтобы найти

Не могли бы вы посоветовать, как исправить команду ниже, которая удаляет неверсированные элементы из SVN

rem @echo off
for /f "tokens=2*" %%i in ('"c:\Program Files\TortoiseSVN\bin\svn.exe" status --no-ignore ^| find "?"') do echo %%i

Вариант ниже без пути работает:

rem @echo off
for /f "tokens=2*" %%i in ('svn.exe status --no-ignore ^| find "?"') do echo %%i

но мне нужно пройти весь путь с svn.exe. В этом случае он выводит C:\Program не является допустимой программой

2 ответа

Решение

попробуйте с этим:

   for /f "usebackq tokens=2*" %%i in (`"c:\Program Files\TortoiseSVN\bin\svn.exe" status --no-ignore ^| find "?"`) do echo %%i

Когда я столкнулся с этой проблемой, я попытался использовать "usebackq", как предложено в справочнике команд Windows [1]:

Указывает на выполнение строки в кавычках в качестве команды и строки в одинарных кавычках в качестве команды литеральной строки. Также позволяет именам файлов в наборе заключаться в кавычки.

Я обнаружил, что это все еще выдает ошибку о том, что C:\Program не является исполняемым.

Затем я вспомнил, что в Windows cmd.exe есть действительно странные правила цитирования, где, если первый и последний символ в исполняемой строке - это кавычки, они будут удалены [2].

Я попробовал это, и это сработало для меня:

for /F usebackq %%d in (`""path to command" arg arg "quoted arg""`) do @echo %%d

[1] http://technet.microsoft.com/en-us/library/cc754900.aspx

[2] http://technet.microsoft.com/en-us/library/cc771320.aspx

Исходя из ответа Бена выше ( /questions/5397404/paket-vyipolnit-komandu-s-kavyichkami-dlya-tsikla-for-s-konvejerom-chtobyi-najti/5397416#5397416), приведенный ниже пример сработал для меня:

for /f "usebackq delims=" %%j in (`^""C:\Perl64\bin\perl" -e "print(qq(foo))"^"`) do (
    echo LINE: %%j 
)

Похоже, мне нужно избегать внешних кавычек с помощью ^( https://ss64.com/nt/syntax-esc.html).

Другие вопросы по тегам