El segundo documento citado por Peter Mortensen en su comentario sobre la respuesta de Codesmith me dejó las cosas mucho más claras. Ese documento fue escrito por windowsinspired.com. El enlace repetía: Una mejor manera de comprender las comillas y el escape de los argumentos de la línea de comandos de Windows .
Un poco más de prueba y error conduce a la siguiente guía:
Escapa de cada comilla doble "
con un símbolo de intercalación ^
. Si desea que otros caracteres con significado especial para el shell de comandos de Windows (por ejemplo, <
, >
, |
, &
) debe interpretarse como personajes regulares en su lugar, y luego escapar de ellos con un acento circunflejo, también.
Si desea que su programa foo reciba el texto de la línea de comandos "a\"b c" > d
y redirija su salida al archivo out.txt , inicie su programa de la siguiente manera desde el shell de comandos de Windows:
foo ^"a\^"b c^" ^> d > out.txt
Si foo interpreta \"
como una comilla doble literal y espera que las comillas dobles sin escape delimiten los argumentos que incluyen espacios en blanco, entonces foo interpreta que el comando especifica un argumento a"b c
, un argumento >
y un argumento d
.
Si en cambio foo interpreta una comilla doble ""
como una comilla doble literal, entonces inicie su programa como
foo ^"a^"^"b c^" ^> d > out.txt
La idea clave del documento citado es que, para el shell de comandos de Windows, una comilla doble sin escape activa el cambio entre dos estados posibles.
Un poco más de prueba y error implica que en el estado inicial, se reconoce la redirección (a un archivo o tubería) y un signo de intercalación ^
escapa a una comilla doble y el signo de intercalación se elimina de la entrada. En el otro estado, la redirección no se reconoce y un signo de intercalación no escapa a una comilla doble y no se elimina. Vamos a referirnos a estos estados como "afuera" e "adentro", respectivamente.
Si desea redirigir la salida de su comando, entonces el shell de comandos debe estar en el estado externo cuando alcanza la redirección, por lo que debe haber un número par de comillas dobles sin escape (por intercalación) antes de la redirección. foo "a\"b " > out.txt
no funcionará: el shell de comandos pasa todo "a\"b " > out.txt
a foo como sus argumentos de línea de comando combinados, en lugar de pasar solo "a\"b "
y redirigir la salida a out.txt .
foo "a\^"b " > out.txt
tampoco funcionará, porque el signo de intercalación ^
se encuentra en el estado interno donde es un carácter ordinario y no un carácter de escape, por lo que "a\^"b " > out.txt
se pasa a foo .
La única forma en que (con suerte) siempre funciona es mantener el shell de comandos siempre en el estado externo, porque entonces la redirección funciona.
Si no necesita una redirección (u otros caracteres con un significado especial para el shell de comandos), puede prescindir de los signos de intercalación. Si foo se interpreta \"
como una comilla doble literal, puede llamarlo como
foo "a\"b c"
Entonces foo recibe "a\"b c"
como sus argumentos combinados texto y puede interpretarlo como un solo argumento igual a a"b c
.
Ahora, finalmente, a la pregunta original. myscript '"test"'
llamado desde el shell de comandos de Windows pasa '"test"'
a myscript . Aparentemente, myscript interpreta las comillas simples y dobles como delimitadores de argumentos y las elimina. Debe averiguar qué acepta myscript como una comilla doble literal y luego especificarlo en su comando, utilizando ^
para escapar cualquier carácter que tenga un significado especial para el shell de comandos de Windows. Dado que myscript
también está disponible en Unix, quizás \"
funcione el truco. Tratar
myscript \^"test\^"
o, si no necesita redirección,
myscript \"test\"
myscript \"test\"