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.
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).
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.
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)`"
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