existe uma fuga para o caractere '&' no prompt de comando?

11

Estou tentando algo como:

set pwd = abc&123
echo password %pwd%

Eu recebo o resultado como ...

'123' is not recognized as an internal or external command, operable program or batch file. 
password abc

O sistema é assim ou existe uma fuga para esses personagens?

deostroll
fonte
11
A mesma pergunta no SO Como faço para escapar de "e" comercial em arquivos em lotes?
Michael Freidgeim 5/09/16

Respostas:

9

O que você precisa fazer é colocar sua senha entre aspas duplas da seguinte forma:

set pwd="abc&123"
echo %pwd%

Deixe-me saber como vai.

Carlos
fonte
11
Outra opção que pode ser preferível em alguns cenários éset "pwd=abc&123"
Harry Johnston,
11
-1 é chocante que isso tenha tido 5 votos positivos, está errado. O Windows usa% var% ou! Var! você poderia ter testado você mesmo com tanta facilidade. $ var está em linux, se você echo $ var em janelas ele apenas diz literalmente $ var
barlop
11
@ Barlop: como é a outra linha que trata da questão, não vejo que isso importe.
Harry Johnston
7

Descobri que funciona melhor com uma combinação das respostas de martineau e mastashake57.

set pwd=abc^&123
echo %pwd%

Ainda falha e

set pwd="abc&123"
echo %pwd%

Adiciona aspas a ele (você não pode remover as aspas com um forloop ou manipulação de sequência, porque ela falhará novamente, graças ao e comercial), o que não é tão bom.

Contudo,

set "pwd=abc^&123"
echo %pwd%

Funciona perfeitamente.

Espero que ajude.

BDM
fonte
+1. Esteja ciente de que isso deixa o quilate na variável de ambiente, ou seja, define pwdcomo abc^&123. Na maioria das vezes, isso provavelmente é exatamente o que você precisa fazer, mas isso pode te surpreender se você não estiver ciente do que está acontecendo.
Harry Johnston
@HarryJohnston Devo corrigir seu erro de ortografia. É cuidado. btw eu sei que ntcmds.chm menciona, mas onde em cmd /? documentação é mencionada sobre o sinal de intercalação como o caractere de escape?
barlop
@ Barlop: assim é; Eu estava confundindo com o homônimo. Como regra geral, /?fornece apenas um resumo, uma documentação não abrangente.
Harry Johnston
@barlop,? O sinal de intercalação é o caractere de escape.
Pacerier
@ Pacerier sim, o sinal de intercalação é o caractere de escape, ninguém discorda disso. e é mencionado que é o caractere de escape, em ntcmds.chm (o ntcmds.chm veio com o XP e está em um equivalente online microsoft.com/resources/documentation/windows/xp/all/proddocs/… e talvez de alguma maneira mais atualizado online - talvez mais comandos). Eu só estava perguntando onde em /? (se em qualquer lugar), ele diz que acento circunflexo é o caractere de escape
barlop
7

No arquivo de ajuda de referência da linha de comandos:

O e comercial (&), o pipe (|) e os parênteses () são caracteres especiais que devem ser precedidos pelo caractere de escape (^) ou aspas quando você os passa como argumentos.

Parece que colocar a senha inteira entre aspas seria mais fácil do que escapar de caracteres individuais se houver mais de dois caracteres nela que precisem de tratamento.

Martineau
fonte
E citações entre aspas?
Pacerier
4

O que você realmente precisa é:

set pwd=abc^^^&123
echo %pwd%

Ou:

set "pwd=abc^&123"
echo %pwd%

Explicação:

Como &é um caractere especial, você deve evitá-lo ^, resultando em ^&.

A execução set pwd=abc^&123definirá a variável para o valor abc&123. Depois disso, se echo %pwd%você estiver executando, estará efetivamente executando echo abc&123.

No entanto echo abc&123, não funciona como o esperado, porque &é um caractere especial. Você pode evitar isso adicionando aspas: echo "abc&123"mas sua saída também conterá os caracteres das aspas. Em outras palavras, usar aspas não é exatamente uma solução adequada.

O que você precisa é escapar do &char quando você executa o echocomando:

echo abc^&123

Assim, a variável deve conter o valor abc^&123. Para definir a variável para o valor abc^&123, você precisaria escapar dos caracteres especiais ^e &, resultando em:

set pwd=abc^^^&123
Pacerier
fonte
+1 por apontar a necessidade de escapar do acento circunflexo
jmcg
Funciona muito bem, obrigado. Este caractere de escape não é mencionado no doc em alguma razão docs.microsoft.com/en-us/windows-server/administration/...
Sergey Smolnikov