Como escapar do e comercial em arquivos em lotes?

146

Como escapar do e comercial em um arquivo em lotes (ou na linha de comando do Windows) para usar o startcomando para abrir páginas da Web com e comercial no URL?

Aspas duplas não funcionarão start; isso inicia uma nova janela de linha de comando.

Atualização 1 : A solução de Wael Dalloul funciona. Além disso, se houver caracteres codificados em URL (por exemplo, o espaço é codificado como% 20) no URL e ele estiver em um arquivo em lotes , '%' deverá ser codificado como '%%'. Este não é o caso no exemplo.

Exemplo, na linha de comando ( CMD.EXE):

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

vai resultar em

http://www.google.com/search?client=opera 

sendo aberto no navegador padrão e esses erros na janela da linha de comandos:

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

Plataforma: Windows XP SP2 de 64 bits.

Peter Mortensen
fonte
1
Eu editei a resposta do belugabob para que funcione agora. É apenas uma peculiaridade na startqual causa falha na citação do argumento se aplicada sem pensar. E, no geral, acho que encerrar o argumento entre aspas é mais fácil e menos propenso a erros do que escapar a todos os caracteres que precisam escapar lá.
214 Joey
Que tal sinal de mais, +o que devo colocar na frente para escapar dela?
william
No PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"funciona porque o PowerShell
retira

Respostas:

91

De um cmd :

  • &é escapado assim: ^&(com base na resposta de @Wael Dalloul )
  • % não precisa ser escapado

Um exemplo:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

De um arquivo em lotes

  • &é escapado assim: ^&(com base na resposta de @Wael Dalloul )
  • %é escapado assim: %%(com base na atualização dos OPs)

Um exemplo:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8
Lasse Christiansen
fonte
Também pode incluir um exemplo de escape de "%" - para que eu possa limpar minha pergunta.
Peter Mortensen
@PeterMortensen Definitivamente - atualizei minha resposta.
Lasse Christiansen
2
Quais personagens também devo escapar? Notei que tenho que escapar "|" por "^ |".
quer
Nesse caso %, não precisa ser escapado, porque quem seria tolo o suficiente para definir 20andcomo uma variável de ambiente? Se você fez, start http://www.google.com/search?q=ampersand%20and%20percentagepoderia vincular ao http://www.google.com/search?q=ampersandsomething-silly20percentageinvés disso. Usando ^%para escapar no cmd, o exemplo funciona conforme o esperado.
TamaMcGlinn
145

&é usado para separar comandos. Portanto, você pode usar ^para escapar do &.

Wael Dalloul
fonte
3
Que tal sinal de mais, +o que devo colocar na frente para escapar dela?
william
Esta é a solução aplicável mais geral. Também funciona se um parâmetro de um programa de linha de comando tiver um ou mais e comerciais. Acabei de encontrar isso - o parâmetro era CGW5COMM & 10C4 & 8301 .
22813 Peter Mortensen
Citar um e comercial com o caractere de intercalação ^ parece não funcionar em todas as circunstâncias. Por exemplo, tentar executar o msdeploy.exe com a opção / p: para passar uma senha com um e comercial não parece funcionar com nenhuma permutação que eu tentei (aspas, aspas duplas, primeiro argumento fictício).
Derek Greer
3
Um exemplo de uso ^seria inestimável.
precisa saber é
2
@ jpmc26 Adicionei um exemplo nesta resposta .
Lasse Christiansen
29

Você pode colocá-lo entre aspas, se fornecer um primeiro argumento fictício.

Observe que você precisa fornecer um primeiro argumento fictício nesse caso, pois starttratará o primeiro argumento como um título para as novas janelas do console, se ele estiver entre aspas. Portanto, o seguinte deve funcionar (e funciona aqui):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
belugabob
fonte
OK, eu admito que o título não corresponde completamente à pergunta interna. (Você acha que eu deveria fazer o título mais tempo?)
Peter Mortensen
Não é tão 'Doh', afinal - incluir aspas era a idéia certa - simplesmente não sabia sobre o título da janela do console. Obrigado Johannes!
belugabob
O PowerShell retira aspas dos argumentos , portanto isso falhará. Você precisa usar apenas start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"no PowerShell
phuclv
20
explorer "http://www.google.com/search?client=opera&rls=...."
adatapost
fonte
12

O comando

echo this ^& that

funciona como esperado, produzindo

this & that

O comando

echo this ^& that > tmp

também funciona, escrevendo a string no arquivo "tmp". No entanto, antes de um tubo

echo this ^& that | clip

o ^ é interpretado de maneira completamente diferente. Ele tenta gravar a saída dos dois comandos "echo this" e "that" no canal. O eco funcionará e "isso" causará um erro. Dizendo

echo this ^& echo that | clip

colocará as strings "this" e "that" na área de transferência.

Sem o ^:

echo this & echo that | clip

o primeiro eco será gravado no console e apenas a saída do segundo eco será canalizada para clipe (da mesma forma para o redirecionamento "> tmp"). Portanto, quando a saída está sendo redirecionada, o ^ não cita o &, mas faz com que seja aplicada antes do redirecionamento e não depois.

Para canalizar um &, você deve citá-lo duas vezes

echo this ^^^& that | clip

Se você colocar a string em uma variável

set m=this ^& that

então

set m

irá produzir

m=this & that

mas o óbvio

echo %m%

falha porque, depois que o Windows substitui a variável, resultando em

echo this & that

ele analisa isso como um novo comando e tenta executar "aquilo".

Em um arquivo em lotes, você pode usar a expansão atrasada :

setlocal enableDelayedExpansion
echo !m!

Para enviar para um canal, precisamos substituir todos os & s no valor da variável por ^ &, o que podemos fazer com a sintaxe% VAR: FROM = TO%:

echo !m:^&=^^^&! | clip

Na linha de comando, "cmd / v" permite expansão atrasada:

cmd /v /c echo !m!

Isso funciona mesmo ao gravar em um pipe

cmd /v /c echo !m! | clip

Simples.

Denis Howe
fonte
Sua solução para tubos funciona, mas suas conclusões são mais ou menos erradas. Btw. um simples echo this ^^^& that | clipfunciona também. Para entender o manuseio do pipe mágico, você pode ler SO: Por que a expansão atrasada falha quando dentro de um bloco de código canalizado?
jeb
1

Se você precisar de echouma sequência que contenha um e comercial, as aspas não ajudarão, porque você também as verá na saída. Nesse caso, use for:

for %a in ("First & Last") do echo %~a

... em um script em lote:

for %%a in ("First & Last") do echo %%~a

ou

for %%a in ("%~1") do echo %%~a
Jaroslav Záruba
fonte
0

Se você tiver espaços no nome do arquivo e tiver um caractere, precisará escapar:

Você pode usar aspas simples AND duplas para evitar equívocos no comando.

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

O ^personagem escapa as aspas caso contrário.

be-ns
fonte