bem, no meu sistema há um problema com o script em lote que descreverei, mas não sei por que o seu w está vazio depois da execução, mas se você remover o @echo, verá o que está acontecendo. e a partir desta explicação, talvez veremos porque está vazio. Deve ser a última configuração de w está definindo para nada.
@echo off
for /r %%f in (*.bat) do (
set w=%%~nxf
echo %w%
)
pause
Existe um problema acima, em que você está usando %...%
em um loop for e o que acontece com %var%
em um loop for, por exemplo %w%
em arquivos batch, é muito estranho comparado a qualquer outra linguagem! O %w%
será substituído por qualquer %w%
e, depois, não novamente.
Você poderia tentar testar isso, definindo w = abcdefg e, em seguida, executar seu arquivo em lote e ver se w ainda é isso.
Mas na minha máquina, depois que ele estiver em execução, defina w=%%~nxf
e, em seguida, você tenha eco %w%
que %w%
no eco, é definido como o valor atual de %%~nxf
, que é seu primeiro Arquivo. E é isso. Permanece assim. Não é o que você pretende, sem dúvida, mas é o que acontece.
Aqui está o seu arquivo bat que eu removi @echo off.
for /r %%f in (*.bat) do (
set w=%%~nxf
echo %w%
)
Aqui está a saída mostrando o que acontece, que é o que eu descrevi. O% w% mantém seu primeiro valor.
C:\crp>spo <Return>
C:\crp>for /R %f in (*.bat) do (
set w=%~nxf
echo spo2.bat
)
C:\crp>(
set w=a.bat
echo spo2.bat
)
spo2.bat
C:\crp>(
set w=b.bat
echo spo2.bat
)
spo2.bat
C:\crp>(
set w=spo.bat
echo spo2.bat
)
spo2.bat
C:\crp>(
set w=spo2.bat
echo spo2.bat
)
spo2.bat
C:\crp>
Você precisa adicionar setlocal .... e substitua% var% por! var! então você tem um comportamento normal!
@echo off
setlocal enableextensions enabledelayedexpansion
for /r %%f in (*.bat) do (
set w=%%~nxf
echo !w!
)
C:\crp>spo2
a.bat
b.bat
spo.bat
spo2.bat
C:\crp>