¿Cómo puedo escapar correctamente de las comillas en el -param
valor en la siguiente línea de comando?
$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 (simples y dobles) usando el carácter de escape `e hice varias combinaciones, pero nada funciona.
powershell-2.0
eetawil
fuente
fuente
$someCommandStringWithDoubleQuotes | cmd
. En realidad, esto funciona desde scripts de PowerShell (por ejemplo, invocando CMake (que requiere las comillas dobles (de lo contrario, fallará silenciosamente))). Una alternativa a CMD es bash.exe ( MinGW ), pero su inicio puede ser muy, muy lento en algunas circunstancias.Respuestas:
Escapar de parámetros como ese suele ser una fuente de frustración y se siente como una pérdida de tiempo. Veo que estás en la v2, así que te sugiero que uses una técnica sobre la que Joel "Jaykul" Bennet escribió en su blog hace un tiempo .
En pocas palabras: simplemente envuelve tu cadena con @ '...' @:
(Tenga en cuenta que asumí qué comillas son necesarias y qué cosas intentaba escapar). Si desea trabajar con la salida, es posible que desee agregar el
-NoNewWindow
modificador.Por cierto: este fue un problema tan importante que, desde la versión 3, puede usar
--%
para evitar que el analizador de PowerShell haga algo con sus parámetros:... debería funcionar bien allí (con la misma suposición).
fuente
@"
y en su"@
lugar.Usar la comilla invertida (`) funciona bien para mí si los coloco en los siguientes lugares:
$cmd
devuelve como:¿Es eso lo que estabas buscando?
El error que me dio PowerShell se refería a un token inesperado 'sort1', y así fue como determiné dónde colocar las comillas invertidas.
La sintaxis @ '...' @ se denomina "cadena aquí" y devolverá exactamente lo que se ingresó. También puede usarlos para completar variables de la siguiente manera:
Los símbolos de apertura y cierre deben estar en su propia línea como se muestra arriba.
fuente
Invoke-Expression
quita las comillas dobles de$cmd
cuando se invoca? ¿O cómo lo usaste$cmd
sin usarInvoke-Expression
?Hoy me encontré en una situación similar mientras intentaba ejecutar un comando a través de un módulo Node.js:
Estaba usando PowerShell y tratando de ejecutar:
Pero con los símbolos adicionales, PowerShell estaba destrozando los argumentos. Para solucionarlo, marqué hacia atrás las comillas dobles escapadas:
fuente
"['`"][^'`"]['`"]"
funciona… ¡pero'[`'"][^`'"][`'"]'
no! me estaba volviendo loco