2012-10-27 95 views
1

我一直在Windows 7中查找一个.bat文件,该文件给出一个名称和一个文件目录,将该目录中的所有文件重命名为用户传递连接到一个数字的名称从0到9. 例如: 假设我有一个包含两个文件a.txt和b.txt的目录,我想将它们的名称更改为documentX.txt(X是从0到9的数字) ,所以在最后的脚本将改变名称,以document1.txt和document2.txt使用.bat重命名多个文件

我已经试过这样的事情,但没有sucess:

@echo off 
    @set a=1 
    @set pref=hola 

    for /D %%f in (C:\*.txt) 
    do 
    rename *.txt %pref%%a% 
    @set /A a = %a%+1 

回答

1

FOR命令不能跨越多行,除非使用括号或行连续^。第一个左括号必须与IN相同,而第二个与DO相同。

不能在括号内的代码块中使用正常扩展,因为扩展发生在分析时间,并且整个块被一次解析。所以价值将会是你设置之前的价值!解决方案是使用延迟扩展。执行该行时会发生这种情况。必须启用setlocal enableDelayedExpansion

延迟扩展会导致问题,因为!在文件名中是有效的,如果包含!而延迟扩展被启用,则变量扩展将被破坏。解决方案是在循环内开启和关闭延迟扩展。

你想要一个简单的FOR没有任何选项。 /D选项查找目录而不是文件。

您不需要在SET /A语句内展开数值变量。

最后一件事 - 使用ECHO OFF后无需@

@echo off 
setlocal disableDelayedExpansion 
set "n=0" 
set "pref=document" 

for %%F in (c:\*.txt) do (
    set "file=%%F" 
    set /a n+=1 
    setlocal enableDelayedExpansion 
    ren "!file!" "%pref%!n!.txt" 
    endlocal 
) 

有一种更简单的方法来完成任务。使用DIR /B列出所有.txt文件并将结果传送到FINSTDR /N "^"。 FINDSTR将匹配所有文件,并以每个值为前缀,后跟一个冒号。使用FOR/F将结果解析为数字和文件名,以便您可以再RENAME。

@echo off 
setlocal 
set "pref=document" 
for /f "tokens=1* delims=:" %%A in ('dir /b /a-d *.txt^|findstr /n "^"') do (
    ren "%%B" "%pref%%%A.txt" 
) 
+0

谢谢你,如果你的问题已回答让您满意,那么你应该接受一下附近的答案左上角的复选标记的答案完全 – JCastilloLirio

+0

工作。该行动让其他人知道该问题已得到解答,它会授予您2个声望,并向答案提供者授予15个重要点。只能接受1个答案。一旦你达到15个重点,你将有权投票回答。你可以投多少你认为有用的答案,甚至可以回答其他人的问题。一个投票可以给答案提供者10分。 – dbenham