Um dos exemplos em RUNAS /?
mostra essa sintaxe. O cursor é o caractere de escape para CMD.EXE
, mas, no Windows, os programas individuais são gratuitos para implementar seus próprios caracteres de escape e globbing.
Eu vejo que o cursor é o caractere de escape documentado.
Mas, eu tenho um exemplo mostrando que para o caracter de aspas duplas, ^
não funciona e você tem que usar \
C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""
Por que isso e onde está documentado?
Em cmd, \
não não escapam "
. Aqui está uma prova rápida e explicação:
Execute echo "" & echo 1
. ( &
é um caractere especial em cmd, left & right
significa execução left
e, em seguida, execução right
.) Podemos ver que echo ""
e echo 1
são executados com êxito.
Em seguida, execute echo " & 1234
. Podemos ver que a saída é " & 1234
. Isso ocorre porque a abertura "
não foi fechada e, portanto, tudo depois dela é interpretado como uma string, incluindo o caractere especial &
.
Executar echo "\" & 1234
.
Se \
escapar do seguinte "
, a abertura "
não será fechada e os caracteres & 1234
serão interpretados como parte da sequência.
Se \
não conseguir escapar do seguinte "
, esse seguindo "
fechará a string e & 1234
não será interpretado como parte da string.
Na saída, não vemos & 1234
interpretado como parte da string. Isso prova que \
não escapou de "
.
Então, o que escapa de "
entre aspas para passagem de argumentos? Embora o ^
funcione fora das cotações (facilmente comprovado por echo ^" & echo 1
), ele não perde as cotações entre aspas.
De fato, como podemos fazer algo tão simples como echo """
&
echo 1
funcionar?
O ^
char? ... Não, echo "^"" & echo 1
outputs "^""
e não """
.
O que acha do próprio "
char? ... Não, echo """" & echo 1
outputs """"
e não """
.
O fato é que não há nada que escape de "
entre aspas para passagem de argumentos . Você pode refletir sobre isso por um par de anos e chegar a nenhuma solução. Estas são apenas algumas das limitações inerentes do script cmd.
No entanto, a boa notícia é que você provavelmente nunca irá se deparar com uma situação na qual você precisa fazer isso. Claro, não há como fazer com que echo """
&
echo 1
funcione, mas isso não é grande coisa, porque é simplesmente um problema artificial que você provavelmente nunca encontrará.
Por exemplo, considere runas
. Ele funciona bem sem precisar escapar de "
entre aspas porque runas
sabia que não há como fazer isso e fez ajustes internos para contornar o problema. runas
inventou suas próprias regras de análise ( runas /flag "anything even including quotes"
) e não interpreta argumentos cmd da maneira usual. A documentação oficial para essa sintaxe especial é bastante esparsa (ou inexistente). Além de /?
e help
, é principalmente tentativa e erro.
O sinal \
faz o intérprete interpretar o próximo sinal como um caractere em vez de um identificador .
Você também vê muito no código:
"Hello \"World\""
isto é interpretado como
Hello "World"
no seu exemplo, para passar os argumentos para cmd
, ele precisa ser colocado em "". Mas como os argumentos para cmd
contêm "(e isso encerraria o gabinete) eles são anexados por \
. Se o" "não estivesse lá, o /k dir \"%userprofile%\"
teria sido interpretado como argumentos para runas
, não para cmd
.
O motivo pelo qual eles estão colocando o% userprofile% é porque esta é uma variável de ambiente e será substituída pelo texto que pode conter espaços, que (pelo mesmo motivo acima) tornariam o argumento cmd
incorreto.