Estou tentando adquirir o nome do arquivo da primeira parte de um loop aninhado
@ECHO OFF
EnableDelayedExpansion
for /r d:\ %%j in (*.zip) do (
set FileExt="%%~ni"
"c:\program files (x86)\winzip\wzunzip.exe" -d "%%j" C:\AllDWG\
for /r C:\AllDWG\ %%i in (*.dwg) do ren "%%i" "%%~ni.%FileExt%"
)
Existem vários erros no seu arquivo de lote.
EnableDelayedExpansion
Esta é a sintaxe errada (veja delayedexpansion ), deve ser setlocal enabledelayedexpansion
.
set FileExt="%%~ni"
A variável i
é indefinida neste momento (seu primeiro for
loop está usando %%j
), então deve ser set FileExt="%%~nj"
.
for /r C:\AllDWG\ %%i in (*.dwg) do ren "%%i" "%%~ni.%FileExt%"
Você precisa usar a expansão atrasada aqui, pois %FileExt%
tem um diferente valor em cada passagem pelo loop for
envolvente, por isso deve ser !FileExt!
.
Tente o seguinte arquivo em lote (não testado, pois não tenho um arquivo zip apropriado):
@echo off
setlocal enabledelayedexpansion
for /r d:\ %%j in (*.zip) do (
set FileExt="%%~nj"
"c:\program files (x86)\winzip\wzunzip.exe" -d "%%j" C:\AllDWG\
for /r C:\AllDWG\ %%i in (*.dwg) do ren "%%i" "%%~ni.!FileExt!"
)
endlocal
Leitura Adicional
- Um índice A-Z da linha de comando do Windows CMD - Uma excelente referência para todas as coisas relacionadas à linha do Windows cmd.
- enabledelayedexpansion - Expansão com atraso fará com que as variáveis sejam expandidas em tempo de execução e não no tempo de análise.
- para / f - Comando Loop: contra um conjunto de arquivos - condicionalmente executar um comando em cada item.
- para / r - Fazer um loop pelos arquivos (criar subpastas).