Экранирование кавычек и двойных кавычек


Как мне правильно избежать кавычек в -param значение в следующей командной строке?

$cmd="servertoto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd 

Это, конечно, не удается. Я попытался избежать кавычек (одинарных и двойных), используя escape-символ ` и сделал различные комбинации, но ничего не работает.

3 60

3 ответа:

экранирование таких параметров обычно является источником разочарования и очень похоже на потерянное время. Я вижу, что вы находитесь на v2, поэтому я бы предложил использовать технику, которую Джоэл "Джейкул" Беннет блог о некоторое время назад.

короче говоря: вы просто обернуть строку с @' ... '@ :

Start-Process \server\toto.exe @'
-batch=B -param="sort1;parmtxt='Security ID=1234'"
'@

(имейте в виду, что я предположить какие цитаты необходимы, и какие вещи вы пытались избежать.) Если вы хотите работать с выводом, вы можете хотите добавить -NoNewWindow переключатель.

кстати: это был настолько важный вопрос, что с V3 вы можете использовать --% чтобы парсер PowerShell ничего не делал с вашими параметрами:

\server\toto.exe --% -batch=b -param="sort1;paramtxt='Security ID=1234'"

... там должно работать нормально (с тем же предположением).

использование backtick ( ` ) отлично работает для меня, если я помещаю их в следующие места:

$cmd="\server\toto.exe -batch=B -param=`"sort1;parmtxt='Security ID=1234'`""

$cmd возвращает как:

\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"

это то, что вы искали?

ошибка PowerShell дала мне ссылку на неожиданный токен "sort1", и именно так я определил, куда поместить обратные палочки.

в @' ... '@синтаксис называется "здесь строка" и вернет именно то, что было введено. Вы также можете использовать их для заполнения переменных в следующим образом:

$cmd=@'
"\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
'@

символы открытия и закрытия должны располагаться в отдельной строке, как показано выше.

я оказался в аналогичном затруднительном положении сегодня, пытаясь запустить команду через узел.модуль на JS:

Я использовал PowerShell и пытался запустить:

command -e 'func($a)'

но с дополнительными символами PowerShell искажал аргументы. Чтобы исправить, я отступил назад, избежав двойных кавычек:

command -e `"func($a)`"