2013-08-08 5 views
50

Я довольно новичок в Powershell ... и мне было интересно, как я уверенно скрываю кавычки в значении -param.Escaping цитаты и двойные кавычки

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

Это, конечно, не удалось, я пытался избежать кавычки (одинарные и двойные) с помощью экранирующего символа `и сделал различные комбинации, но ничего не работает. Пожалуйста, помогите

ответ

35

Эквивалентные параметры, как правило, являются источником разочарования и очень похожи на время, потраченное впустую. Я вижу, что вы на v2, так что я предложил бы использовать технику, Joel «Jaykul» Беннет blogged about a while ago

Короче говоря: вы просто обернуть вам строку с @ «...» @:

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

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

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

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

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

+0

Спасибо вам за ответ. начальный процесс, независимо от того, как я пытался всегда жаловаться. Я сделал cmd/C $ cmd (где $ cmd - моя вся команда, включая .exe.). Я использую powershell 2.0. Даже эта строка не срабатывала, если я правильно помню. – eetawil

+0

Это кажется излишне сложным по сравнению с использованием backtick ('), чтобы избежать двойных кавычек. – saille

+4

Это прекрасно работает, если вы следуете правилам, которые он ожидает. Первый символ @ должен находиться в строке 1, ваш параметр должен быть в строке «2», а финал «@ должен быть включен» в строке 3 ». Финал '@ не может иметь пробелов перед ним. Человек этот синтаксис придирчивый! –

47

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

$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', вот как я определил, куда поместить обратные выходы.

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

[email protected]' 
"\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"" 
'@ 

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

+0

Извините за задержку ... так, как я это сделал, это, наконец, вызвать cmd/C «MYCOMMAND» из powershell. Он не работал напрямую с powershell. – eetawil

6

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

я использую PowerShell и пытается запустить:

command -e 'func($a)' 

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

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

Надеюсь, это поможет кому-то.

+0

интересно: '' '' [''"] [^' '"] ['' "]' '' 'работает ... но' '' '[' '"] [^'' "] [' '"] «' '' 'не делает! сводил меня с ума –

Смежные вопросы