Usando barra invertida para escapar de caracteres em cmd.exe (comando runas como exemplo)

4

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?

    
por barlop 30.08.2010 / 11:40

3 respostas

4

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.

    
por 30.08.2010 / 12:00
6

Em cmd, \ não não escapam " . Aqui está uma prova rápida e explicação:

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

  2. 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 & .

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

    
por 26.08.2015 / 03:33
3

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.

    
por 30.08.2010 / 15:48