Escape de comillas y comillas dobles


¿Cómo puedo escapar correctamente las comillas en el valor -param en la siguiente línea de comandos?

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

Esto por supuesto falla. Traté de escapar de las comillas (simple y doble) utilizando el carácter de escape ` e hizo varias combinaciones, pero nada está funcionando.

Author: Peter Mortensen, 2013-08-08

3 answers

Escapar parámetros como ese suele ser fuente de frustración y se siente como un tiempo perdido. Veo que estás en v2, así que sugeriría usar una técnica que Joel" Jaykul " Bennet blogueó hace un tiempo .

En resumen: simplemente envuelves tu cadena con @' ... '@ :

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

(Ten en cuenta que yoasumí qué citas son necesarias, y qué cosas intentabas escapar.) Si desea trabajar con la salida, es posible que desee agregar el -NoNewWindow interruptor.

POR cierto: este fue un tema tan importante que desde v3 puedes usar --% para evitar que el analizador de PowerShell haga nada con tus parámetros:

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

... debería funcionar bien allí (con la misma suposición).

 42
Author: BartekB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-08 14:33:33

Usar el backtick ( ' ) funciona bien para mí si los pongo en los siguientes lugares:

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

$cmd devuelve como:

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

¿Es eso lo que estabas buscando?

El error que PowerShell me dio se refería a un token inesperado 'sort1', y así es como determiné dónde colocar los backsticks.

El @' ... la sintaxis '@ se llama "here string" y devolverá exactamente lo que se ha introducido. También puede usarlos para rellenar variables en lo siguiente moda:

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

Los símbolos de apertura y cierre deben estar en su propia línea como se muestra arriba.

 62
Author: Owen B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-08 14:35:26

Hoy me encontré en una situación similar al intentar ejecutar un comando a través de un Nodo.módulo js:

Estaba usando PowerShell e intentando ejecutar:

command -e 'func($a)'

Pero con los símbolos adicionales, PowerShell estaba alterando los argumentos. Para solucionarlo, hago back-tick con comillas dobles escapadas:

command -e `"func($a)`"
 8
Author: pranspach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-05 16:40:12