首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理文件以解压缩和重命名文件

批处理文件以解压缩和重命名文件
EN

Stack Overflow用户
提问于 2016-11-11 13:41:13
回答 1查看 2.4K关注 0票数 0

我有一个批处理文件,它从目录中解压缩档案,并重命名提取的文件。我的批处理文件的内容如下:

代码语言:javascript
复制
for /F %%I IN ('dir /b /s *.zip *.rar') DO (
"C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I" -aoa
 ) 
 DEL *.zip
 @echo off
 set i=1
 for %%f in (*.xml) do call :renameit "%%f"
 goto done

 :renameit
 ren %1 FileName%i%_Msd.xml
 set /A i+=1

 :done

我希望这些文件被重命名为

代码语言:javascript
复制
 FileName1.xml
 FileName2.xml
 FileName3.xml
 ...

但是,重命名的文件名似乎从2开始,而不是从1开始。如果在批处理文件从2开始提取并被错误地重新命名之后,它会纠正这个命名错误并从一个开始。

当重命名的文件正确地从1开始时,我如何纠正这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-11 17:53:12

给你一个解释,如果你看到你的代码执行,你就会明白地看到这一天。

FOR命令正在迭代当前文件夹中的文件,每次一个文件。例如,如果文件夹中有三个文件名为A.txt、B.txt和Z.txt,则for命令首先处理A.txt并将其重命名为File1.txt。然后它将看到B.txt,因为它是按字母顺序排列的下一个文件,并将其重命名为File2.txt。现在,因为您将A.txt重命名为File1.txt,所以它接下来会看到这个文件,并将其重命名为File3.txt。在此之后,它将看到Z.txt并将其重命名为File4.txt。所以问题不在于计数器变量,而是FOR命令如何处理文件夹中的文件。

如果你测试这段代码。

代码语言:javascript
复制
@echo off
dir /b *.txt

set i=1
for %%f in (*.txt) do call :renameit "%%f"
pause
GOTO :EOF

:renameit
@ECHO ON
ren %1 FileName%i%.txt
@ECHO OFF
set /A i+=1

您的输出将如下所示。

代码语言:javascript
复制
A.txt
B.txt
Z.txt

C:\test>ren "A.txt" FileName1.txt

C:\test>ren "B.txt" FileName2.txt

C:\test>ren "FileName1.txt" FileName3.txt

C:\test>ren "Z.txt" FileName4.txt
Press any key to continue . . .

现在,如果您更改为使用FOR /F命令来解析DIR命令的输出,您将得到所需的结果。在FOR命令接管并开始处理输出之前,DIR命令将首先完成它的所有处理。

因此,修改代码:

代码语言:javascript
复制
@echo off
dir /b *.txt

set i=1
for /F "delims=" %%f in ('dir /a-d /b *.txt') do call :renameit "%%f"
pause
GOTO :EOF

:renameit
@ECHO ON
ren %1 FileName%i%.txt
@ECHO OFF
set /A i+=1

您的输出现在是这样的。

代码语言:javascript
复制
A.txt
B.txt
Z.txt

C:\test>ren "A.txt" FileName1.txt

C:\test>ren "B.txt" FileName2.txt

C:\test>ren "Z.txt" FileName3.txt
Press any key to continue . . .
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40549240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档