Пакет: Выполнить команду с кавычками для цикла 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).