我正在尝试从嵌套循环的第一部分获取文件名以用于最后一部分,即(从“09-10-15.zip”中提取的所有文件将被命名为“file1.09-10-15”,“file2.09-10-15”...
但是,如果我将值设置为静态作为测试,则使用 set FileExt=%%~ni 时得到 null,我发现它没有到达最后一行。
我现在正式陷入彻底的迷茫,任何帮助都将不胜感激。
@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%"
)
答案1
我正在尝试从嵌套循环的第一部分获取文件名
@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%"
)
您的批处理文件中有几个错误。
EnableDelayedExpansion
这是错误的语法(见延缓扩张), 它应该是setlocal enabledelayedexpansion
。
set FileExt="%%~ni"
i
此时变量未定义(您的第一个for
循环正在使用%%j
),因此应该是set FileExt="%%~nj"
。
for /r C:\AllDWG\ %%i in (*.dwg) do ren "%%i" "%%~ni.%FileExt%"
你需要使用这延迟扩张这里,由于%FileExt%
每次通过封闭循环时都有不同的值for
,所以应该是!FileExt!
。
尝试以下批处理文件(由于我没有合适的 zip 文件,因此未经测试):
@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
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 启用延迟扩展- 延迟扩展将导致变量在执行时而不是在解析时扩展。
- 对于/f- 循环命令:针对一组文件 - 有条件地对每个项目执行命令。
- 对于/r- 循环遍历文件(递归子文件夹)。