Windows批处理文件循环运行一次额外的迭代

时间:2013-04-11 13:28:42

标签: windows batch-file

我正在使用Windows批处理文件一次性重命名大量文件。重命名只是为文件名添加前缀。除最后一个文件外,该文件执行正常,前缀以某种方式应用于该文件两次。我不确定我做错了什么。任何人都可以向我指出这个问题吗?

for %%i in (*.csv) do ren %%i myprefix_%%i

2 个答案:

答案 0 :(得分:2)

@echo off
SETLOCAL
DEL *.csv
XCOPY ..\*.csv .
(
for %%i in (*.csv) do (
echo ====================
echo %%i
dir *.csv
ren %%i x%%i
dir *.csv
echo ====================

)
)>u:\junk.txt&edit u:\junk.txt

我在包含一些.CSV的目录下的干净目录中运行上述批处理。它所做的只是删除当前目录的.csvs,从父目录中复制那些,然后通过前缀重命名。它显示了很多。

(U:是RAMDRIVE,EDIT执行EDITPLUS; NOTEPAD也可以在这里执行)

操作取决于添加的前缀。以“a”开头的前缀与以“x”开头的前缀的工作方式不同。并且结果取决于正在使用的文件系统。 NTFS按字母顺序显示文件名,但RAMDRIVE上的FAT系统不对名称进行排序。

我认为问题是由于'findnext'文件名机制未按预期更改文件名列表而引起的。当它改变一个时,该名称可能会在列表中移动,因此可能会重新处理该文件,因为它的新名称会再次遇到 - 可能是多次。

治愈方法是用

替换for选项
for /f "delims=" %%i in ('dir /b *.csv') do (

创建DIR列表并处理那么,因此更改不会影响它。

答案 1 :(得分:0)

您的文件名中可能有一些空格。 在文件名周围使用双引号。请尝试以下操作:

for %%i in (*.csv) do ren "%%I" "myprefix_%%I"

这将执行:

ren "tmp - Copy.csv" "myprefix_tmp - Copy.csv"

此外,您应该查找任何隐藏文件。