O segundo documento citado por Peter Mortensen em seu comentário sobre a resposta de Codesmith deixou as coisas muito mais claras para mim. Esse documento foi escrito por windowsinspired.com. O link se repetia: Uma maneira melhor de entender como citar e escapar de argumentos de linha de comando do Windows .
Algumas outras tentativas e erros levam à seguinte diretriz:
Fuja de todas as aspas duplas "
com um circunflexo ^
. Se você quiser outros caracteres com significado especial para o shell de comando do Windows (por exemplo, <
, >
, |
, &
) deve ser interpretado como personagens regulares em vez disso, em seguida, fugir-los com um acento circunflexo, também.
Se você deseja que seu programa foo receba o texto da linha de comando "a\"b c" > d
e redirecione sua saída para o arquivo out.txt , inicie seu programa da seguinte maneira no shell de comando do Windows:
foo ^"a\^"b c^" ^> d > out.txt
Se foo interpretar \"
como aspas duplas literal e esperar aspas duplas sem escape para delimitar argumentos que incluem espaços em branco, então foo interpretará o comando como especificando um argumento a"b c
, um argumento >
e um argumento d
.
Se, em vez disso, foo interpretar aspas duplas ""
como aspas literais, inicie o seu programa como
foo ^"a^"^"b c^" ^> d > out.txt
A principal ideia do documento citado é que, para o shell de comando do Windows, uma aspa dupla sem escape aciona a alternância entre dois estados possíveis.
Algumas outras tentativas e erros implicam que, no estado inicial, o redirecionamento (para um arquivo ou canal) é reconhecido e um acento circunflexo ^
escapa de uma aspa dupla e o acento circunflexo é removido da entrada. No outro estado, o redirecionamento não é reconhecido e um acento circunflexo não escapa a uma aspa dupla e não é removido. Vamos nos referir a esses estados como 'fora' e 'dentro', respectivamente.
Se você quiser redirecionar a saída de seu comando, o shell de comando deve estar no estado externo quando atingir o redirecionamento, portanto, deve haver um número par de aspas duplas sem escape (por circunflexo) antes do redirecionamento. foo "a\"b " > out.txt
não funcionará - o shell de comando passa tudo "a\"b " > out.txt
para foo como seus argumentos de linha de comando combinados, em vez de passar apenas "a\"b "
e redirecionar a saída para out.txt .
foo "a\^"b " > out.txt
não funcionará, também, porque o acento circunflexo ^
é encontrado no estado interno onde é um caractere comum e não um caractere de escape, então "a\^"b " > out.txt
é passado para foo .
A única maneira que (felizmente) sempre funciona é manter o shell de comando sempre no estado externo, porque então o redirecionamento funciona.
Se você não precisa de redirecionamento (ou outros caracteres com significado especial para o shell de comando), você pode fazer sem os circunflexos. Se foo interpretar \"
como uma aspa dupla literal, você pode chamá-lo de
foo "a\"b c"
Em seguida, foo recebe "a\"b c"
como seu texto de argumentos combinados e pode interpretá-lo como um único argumento igual a a"b c
.
Agora - finalmente - à pergunta original. myscript '"test"'
chamado do shell de comando do Windows passa '"test"'
para myscript . Aparentemente, o myscript interpreta as aspas simples e duplas como delimitadores de argumento e as remove. Você precisa descobrir o que myscript aceita como aspas duplas literais e, em seguida, especificar isso em seu comando, usando ^
para escapar quaisquer caracteres que tenham um significado especial para o shell de comando do Windows. Dado que myscript
também está disponível no Unix, talvez \"
funcione. Experimentar
myscript \^"test\^"
ou, se você não precisa de redirecionamento,
myscript \"test\"
myscript \"test\"