Você tem alguns problemas:
-
A expansão
-
%var%
ocorre quando a instrução é analisada e o bloco de código inteiro entre parênteses é analisado em uma passagem, antes que quaisquer comandos sejam executados. Portanto, o valor é o valor que existia antes do início do loop. A solução é a expansão atrasada, que ocorre quando cada comando dentro do loop está sendo executado. -
Sua lógica está errada - a atribuição de _newp deve ser baseada no valor de _srcp
O processador CMD é um animal complicado (e também mal documentado). Existem vários pontos em que vários tipos de variáveis são expandidos e você deve compreendê-los completamente se realmente quiser aproveitar ao máximo a programação em lote. Tudo é explicado no link, mas em resumo, a ordem de expansão é:
1)% expansion - Parâmetro: echo %1
ou Variável de ambiente: echo %var%
---- A maioria da análise já foi concluída ----
2) PARA expansão de variável: for %%A in (*) do echo %%A
3) Expansão da variável de ambiente atrasada: echo !var!
4) Expansão% CALL - Parâmetro: call echo %%1
ou Variável de ambiente: call echo %%var%%
5) Expansão da variável de ambiente SET / A: valor 'set / a' = var + 1 "
Observe que a expansão atrasada exige que a expansão atrasada seja ativada por meio de SETLOCAL EnableDelayedExpansion
O código a seguir usando a expansão atrasada fornecerá o resultado que você procura:
@echo off
for /D %%G in (*) do (
setlocal enableDelayedExpansion
echo G is: %%G
set "_srcp=%%G"
echo _srcp is !_srcp!
set "_newp=!_srcp:ai=_01_!"
echo _newp is: !_newp!
endlocal
)
Observe que a expansão atrasada ocorre após a expansão da variável FOR, portanto, o resultado será corrompido se %%G
for !
. Isso pode ser evitado por SETLOCAL adicional:
for /D %%G in (*) do (
setlocal disableDelayedExpansion
echo G is: %%G
set "_srcp=%%G"
setlocal enableDelayedExpansion
echo _srcp is !_srcp!
set "_newp=!_srcp:ai=_01_!"
echo _newp is: !_newp!
endlocal
endlocal
)
Você também pode obter o resultado desejado usando CALL com porcentagens duplas, mas isso é muito mais lento. A velocidade não é importante se executada algumas vezes, mas se torna muito significativa se executada milhares de vezes em um loop.
@echo off
for /D %%G in (*) do (
setlocal
echo G is: %%G
set "_srcp=%%G"
call echo _srcp is %%_srcp%%
call set "_newp=%%_srcp:ai=_01_%%"
call echo _newp is: %%_newp%%
endlocal
)