Escapando o sinal com ^ não funciona no arquivo .bat

1

Estou tentando gravar um arquivo em lotes que pode gerar alguns arquivos de configuração XML, mas escapando do < e > sinais não parece funcionar. No início do meu script eu escrevi um teste:

SET test=^<foo^>^<bar what="cat"^>^</foo^>
ECHO %test%

A saída é assim:

Z:\mypath>SET test=<foo><bar what="cat"></foo>
< was unexpected at this time.

Z:\mypath>ECHO <foo><bar what="cat"></foo>

O restante do script não é executado, pois nenhum dos últimos ECHOs é disparado.

O que estou fazendo de errado? Como consertar isto? Estou trabalhando no Windows 8.1.

    
por K.L. 30.07.2015 / 11:57

2 respostas

3

A fuga está funcionando, exceto que você não está escapando com frequência suficiente.

Com seu código, você deve escapar duas vezes: uma vez para o comando SET e uma segunda vez para o ECHO. O código para o SET tem escapa dupla. Após a execução, o valor do teste conterá as únicas fugas para que o ECHO funcione corretamente.

SET test=^^<foo^^>^^<bar what="cat"^^>^^</foo^^>
ECHO %test%

Você pode conviver com escapa simples se ECO o valor diretamente:

ECHO test=^<foo^>^<bar what="cat"^>^</foo^>

Ou se você usar a expansão atrasada:

setlocal enableDelayedExpansion
SET test=^<foo^>^<bar what="cat"^>^</foo^>
ECHO !test!

Você pode eliminar todas as fugas se você colocar a atribuição entre aspas:

setlocal enableDelayedExpansion
SET "test=<foo><bar what="cat"></foo>"
ECHO !test!

Lembre-se de que, no exemplo acima, "cat" não é mais citado durante a atribuição, então você teria que escapar de todos os caracteres suspeitos que possam aparecer lá.

Se você tiver muito texto para escrever, talvez valha a pena usar meu utilitário PrintHere.bat que emula o unix aqui documentar recurso. Supondo que você tenha PrintHere.bat em uma pasta que aparece dentro do seu PATH, então você pode usar:

call PrintHere :test
<foo><bar what="cat"></foo>
:test
    
por 30.07.2015 / 12:53
2

Escapando o < assine com ^ não funciona no arquivo .bat

Você pode contornar isso citando todos os argumentos set :

SET "test=<foo><bar what="cat"></foo>"

Isso definirá o valor de test corretamente:

F:\test>set test
test=<foo><bar what="cat"></foo>

Você pode fazer o eco do valor de test , citando-o:

F:\test>echo "%test%"
"<foo><bar what="cat"></foo>"

Se você ecoa test sem as aspas, receberá um erro:

F:\test>echo %test%
< was unexpected at this time.
    
por 30.07.2015 / 12:50