Como escapar do e comercial em um arquivo em lotes (ou na linha de comando do Windows) para usar o start
comando 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.
windows
batch-file
escaping
ampersand
Peter Mortensen
fonte
fonte
start
qual 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á.+
o que devo colocar na frente para escapar dela?start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
funciona porque o PowerShellRespostas:
De um cmd :
&
é escapado assim:^&
(com base na resposta de @Wael Dalloul )%
não precisa ser escapadoUm exemplo:
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:
fonte
%
, não precisa ser escapado, porque quem seria tolo o suficiente para definir20and
como uma variável de ambiente? Se você fez,start http://www.google.com/search?q=ampersand%20and%20percentage
poderia vincular aohttp://www.google.com/search?q=ampersandsomething-silly20percentage
invés disso. Usando^%
para escapar no cmd, o exemplo funciona conforme o esperado.&
é usado para separar comandos. Portanto, você pode usar^
para escapar do&
.fonte
+
o que devo colocar na frente para escapar dela?^
seria inestimável.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
start
tratará 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):fonte
start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
no PowerShellfonte
O comando
funciona como esperado, produzindo
O comando
também funciona, escrevendo a string no arquivo "tmp". No entanto, antes de um tubo
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
colocará as strings "this" e "that" na área de transferência.
Sem o ^:
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
Se você colocar a string em uma variável
então
irá produzir
mas o óbvio
falha porque, depois que o Windows substitui a variável, resultando em
ele analisa isso como um novo comando e tenta executar "aquilo".
Em um arquivo em lotes, você pode usar a expansão atrasada :
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%:
Na linha de comando, "cmd / v" permite expansão atrasada:
Isso funciona mesmo ao gravar em um pipe
Simples.
fonte
echo this ^^^& that | clip
funciona 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?Se você precisar de
echo
uma sequência que contenha um e comercial, as aspas não ajudarão, porque você também as verá na saída. Nesse caso, usefor
:... em um script em lote:
ou
fonte
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.
O
^
personagem escapa as aspas caso contrário.fonte