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).