Você precisa de delayedexpansion ao definir e usando uma variável dentro de um (bloco de código)
Isso gerará eat
pontos de exclamação no seu texto.
:: Q:\Test18\SU_1334338.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=*" %%A in (test.txt) do (
set "line=%%A"
Echo=!line:[B]=!
)
EDIT apenas para lembrar que o uso de for /f
tem algumas armadilhas:
- Processe o seguinte arquivo
test.txt
com o lote acima
This line contains [ B ] here :[B]:
this line is indented
there is an empty line following
; this line starts with a ;
:: this is the last line
Exemplo de saída:
> .\SU_1334338.cmd
This line contains [ B ] here ::
this line is indented
there is an empty line following
:: this is the last line
Então o que aconteceu:
- a substituição de [B] foi feita, mas
- o recuo é perdido,
- a linha vazia desapareceu
- a linha que começa com o ponto e vírgula também.
Existe uma diferença entre "delims="
e "tokens=*"
- ao definir o delimitador como nada, a linha inteira é processada inalterada.
- usar todos os tokens (*) faz o que parece, mas o delimitador padrão Espaço na frente do primeiro token é removido (ou vários, pois são contados como um), então isso explica por que a indentação é removida.
- a remoção de linhas vazias é um comportamento geral que pode ser contornado - com linhas numeradas - veja o próximo arquivo de lote
-
for /f
suporta um characerend of line
, que por padrão é o ponto-e-vírgula na primeira coluna. Se isso for um problema, defina umEol=
que provavelmente não interferirá no texto, como uma barra vertical|
Esse arquivo em lote, que não é muito diferente, evita as armadilhas listadas usando a localização com / V e o mais improvável de ocorrer string no texto e numera todas as linhas, portanto elas não estão vazias para for /f
; para remover o número, o delimitador é definido como ]
, o que incorre no risco de que esse caractere na primeira coluna seja removido.
:: Q:\Test18\SU_1334338_2.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=1* eol=|delims=]" %%A in (
'find /N /V "#+§-*;" ^< test.txt'
) do (
set "line=%%B"
if defined line (Echo(!line:[B]=!) else Echo(
)
Exemplo de saída:
> .\SU_1334338_2.cmd
This line contains [ B ] here ::
this line is indented
there is an empty line following
; this line starts with a ;
:: this is the last line