Preciso repetir uma string contendo colchetes angulares (<e>) para um arquivo em uma máquina Windows. Basicamente, o que eu quero fazer é o seguinte:
echo some string < with angle > brackets >>myfile.txt
Isso não funciona, pois o interpretador de comandos se confunde com os colchetes angulares. Eu poderia citar toda a string assim:
echo "some string < with angle > brackets" >>myfile.txt
Mas tenho aspas duplas em meu arquivo que não quero.
Escapar os colchetes ala unix também não funciona:
echo some string \< with angle \> brackets >>myfile.txt
Ideias?
Respostas:
O caractere de escape do Windows é ^, por algum motivo.
fonte
echo some string ^< with angle ^> brackets >>con
resulta em: alguns colchetes <com ângulos> de stringÉ verdade que o caractere de escape oficial é
^
, mas tome cuidado porque às vezes você precisa de três^
caracteres. Às vezes é assim :Um truque desse absurdo é usar um comando diferente de
echo
fazer a saída e aspas com aspas duplas:Observe que isso não preservará os espaços à esquerda no texto do prompt.
fonte
^^^
também são necessários para escapar dos comandos no console DOS / Kudu do Azure.Existem métodos que evitam
^
sequências de escape.Você pode usar variáveis com expansão atrasada. Abaixo está uma pequena demonstração de script em lote
Ou você pode usar um loop FOR / F. Na linha de comando:
Ou de um script em lote:
A razão destes métodos de trabalho é porque tanto a expansão atrasada e para a expansão variável ocorrer após operadores especiais, como
<
,>
,&
,|
,&&
,||
são analisados. Consulte Como o Windows Command Interpreter (CMD.EXE) analisa scripts? para mais informações.sin3.14 aponta que os tubos podem exigir vários escapes . Por exemplo:
O motivo pelo qual os tubos requerem vários escapes é porque cada lado do tubo é executado em um novo processo CMD, de modo que a linha é analisada várias vezes. Consulte Por que a expansão atrasada falha quando dentro de um bloco de código canalizado? para obter uma explicação das muitas consequências estranhas da implementação do pipe do Windows.
Existe outro método para evitar vários escapes ao usar tubos. Você pode instanciar explicitamente seu próprio processo CMD e proteger o escape único com aspas:
Se você quiser usar a técnica de expansão retardada para evitar escapes, então há ainda mais surpresas (você pode não se surpreender se for um especialista no design do CMD.EXE, mas não há documentação oficial da MicroSoft que explique essas coisas)
Lembre-se de que cada lado do tubo é executado em seu próprio processo CMD.EXE, mas o processo não herda o estado de expansão atrasado - o padrão é OFF. Portanto, você deve instanciar explicitamente seu próprio processo CMD.EXE e usar a opção / V: ON para ativar a expansão atrasada.
Observe que a expansão atrasada está DESLIGADA no script de lote pai.
Mas tudo se perde se a expansão atrasada for habilitada no script pai. O seguinte não funciona:
O problema é que
!test!
está expandido no script pai, de modo que o novo processo CMD está tentando analisar<
e desprotegido>
.Você pode escapar do
!
, mas isso pode ser complicado, porque depende se o!
está citado ou não.Se não estiver entre aspas, é necessário um escape duplo:
Se estiver entre aspas, um único escape é usado:
Mas há um truque surpreendente que evita todas as fugas - fechar o lado esquerdo do tubo evita que o script pai se expanda
!test!
prematuramente:Mas suponho que mesmo isso não seja um almoço grátis, porque o analisador de lote introduz um espaço extra (talvez indesejado) no final quando os parênteses são usados.
Aint batch scripting divertido ;-)
fonte
Para usar caracteres especiais, como '>' no Windows com echo, você precisa colocar um caractere de escape especial antes dele.
Por exemplo
não funcionará, pois '>' deve ser escapado por '^':
Veja também sequências de escape .
Existe um pequeno arquivo em lote, que imprime um conjunto básico de caracteres especiais e suas sequências de escape.
fonte
A barra invertida seria considerada o início de um nome de caminho absoluto.
fonte
echo \
por exemplo, funciona conforme o esperado. - Mas sim, o "\" seria uma má escolha para um caractere de escape da linha de comando, já que cada comando / programa que necessitasse de um caminho ou nome de arquivo você teria que digitar `\` ao invés.Você também pode usar aspas duplas para escapar de caracteres especiais ...
fonte
echo some string "<" with angle ">" brackets >>con
resulta em: alguns colchetes "<" com ângulo ">" de string,