Escapando citas y comillas dobles

Soy bastante nuevo en Powershell … y me preguntaba cómo escapo correctamente las citas en el valor de -param.

$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) usando el carácter de escape `e hice varias combinaciones, pero nada está funcionando. Por favor ayuda

Escapar parámetros como ese suele ser una fuente de frustración y se siente como un tiempo perdido. Veo que estás en la v2, así que te sugiero que uses una técnica que Joel “Jaykul” Bennet blogueó hace un tiempo .

Para resumir, simplemente envuelve tu cadena con @ ‘…’ @:

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

(tenga en cuenta que asumí qué comillas son necesarias y qué cosas estaba intentando evitar) Si desea trabajar con la salida, puede agregar el interruptor -NoNewWindow.

Por cierto: este era un tema tan importante que desde v3 puedes usar --% para detener el analizador de PowerShell de hacer algo 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).

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

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

$cmd regresa 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’, así es como determiné dónde colocar los backticks.

La syntax @ ‘…’ @ se llama “cadena aquí” y devolverá exactamente lo que se ingresó. También puede usarlos para rellenar variables de la siguiente manera:

 $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.

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

Estaba usando PowerShell y tratando de ejecutar:

 command -e 'func($a)' 

Pero con los símbolos adicionales, PowerShell estaba destruyendo los argumentos. Para corregirlo, hago una copia de seguridad de las comillas dobles escapadas:

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