Questão Escapar do sinal

Eu estou tentando escrever um arquivo em lotes que pode gerar alguns arquivos de configuração XML, mas escapar os sinais <e> parece não 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 resto do script não é executado, pois nenhum dos últimos ECHOs é disparado.

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


1


origem


Eu seriamente recomendo considerar outra linguagem de script. qualquer outro, realmente. - njzk2
@ njzk2 Sim, eu sei. Eu também recomendei outras linguagens de script. Infelizmente, não foi assim que as coisas aconteceram. - K.L.


Respostas:


A fuga está funcionando, exceto que você não está escapando com freqüê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. Ater a execução, o valor do teste conterá as únicas fugas de modo que o ECO trabalhe 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!

Tenha em mente que no exemplo acima, "cat" não é mais citado durante a atribuição, então você teria que escapar de qualquer caractere venenoso que possa aparecer lá.

Se você tem muito texto para escrever, então pode valer a pena usar o meu Utilitário PrintHere.bat que emula o recurso de documento aqui do unix. 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

3



Você tem certeza do último exemplo? SET "test=<foo><bar what="cat"></foo>" Seguido por set test mostre as citações estão ao redor cat -> test=<foo><bar what="cat"></foo> - DavidPostill♦
@DavidPostill - Sim, as cotações estão lá, mas não protegem o conteúdo durante a atribuição. Por exemplo: set "test= quoted " unquoted " quoted ". Então a atribuição falharia se "cat" deveriam ser alterados para "this&that". - dbenham


Escapar do sinal <com ^ não funciona no arquivo .bat

Você pode contornar isso citando todo o set argumentos:

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

Isto irá definir o valor de test corretamente:

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

Você pode ecoar o valor de test citando:

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

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

F:\test>echo %test%
< was unexpected at this time.

2