2013-06-18 87 views
1
Set fso = CreateObject("Scripting.FileSystemObject") 
sFolder = "." 

Set folder = fso.GetFolder(sFolder) 
Set files = folder.Files 
Set index = 1 
For each folderIdx In files 
File.Move Replace(File.Path,folderIdx ,index) 
index = index + 1 
Next 

这不工作..这个脚本中的问题是什么?VB脚本重命名目录中的所有文件以索引开始

编辑: 工作脚本。我需要的文件名是“001”,“002”,...等,而不是仅仅“1”,“2” ..

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") 
    Dim sDir : sDir  = "C:\Users\Computer\Desktop\icons\" 
    Dim nIdx : nIdx  = 1 
    Dim oFile 
    For Each oFile In oFS.GetFolder(sDir).Files 
     If oFS.FileExists(oFS.BuildPath(sDir, nIdx&"."&oFile.Name)) Then 
     WScript.StdOut.WriteLine " already exists" 
     Else 
     oFile.Name = nIdx&"."&oFile.Name 
     End If 
     nIdx  = nIdx + 1 
    Next 

回答

3

的问题:您使用File的.Move并在替换呼叫,但您的For Each循环会为您提供名为folderIdx的变量中的当前文件对象。

您的替换会导致只是想要的文件名,并可能将文件移动到当前文件夹(如FS所示)。 (我没有测试这种猜测)

要重命名/重新编号,根据增加的索引文件夹中的所有文件,我会用:

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") 
    Dim sDir : sDir  = "..\testdata\17165630" 
    Dim nIdx : nIdx  = 1 
    Dim oFile 
    For Each oFile In oFS.GetFolder(sDir).Files 
     WScript.Echo "bad idea:", Replace(oFile.Path, oFile, nIdx) 
     WScript.StdOut.Write oFile.Name 
     If oFS.FileExists(oFS.BuildPath(sDir, nIdx)) Then 
     WScript.StdOut.WriteLine " already exists" 
     Else 
     oFile.Name = nIdx 
     WScript.StdOut.WriteLine " => " & oFile.Name 
     End If 
     nIdx = nIdx + 1 ' Thanks, @Ansgar! 
    Next 

输出:

bad idea: 1 
5 => 1 
bad idea: 2 
6 => 2 
bad idea: 3 
8 => 3 
bad idea: 4 
7 => 4 

应让你在重新编号之前和之后的顺序保持谨慎。

更新:

要前置零,使用somethink像:

>> For Each nIdx In Array(1, 5, 10, 99, 100, 999) 
>>  WScript.Echo Right(1000 + nIdx, 3) 
>> Next 
>> 
001 
005 
010 
099 
100 
999 

要保持一个特定的顺序,你必须处理的顺序的文件。我会开始炮轰dir /o:<your choice>

更新II:

一个.FileExists检查不能避免重编已经重新编号的文件。您必须查看当前文件的oFile.Name并跳过它(如果已经处理过)。如果你在开始有非数字的文件名,你可以使用IsNumeric()

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") 
    Dim sDir : sDir  = "..\testdata\17165630" 
    Dim nIdx : nIdx  = 1 
    Dim oFile 
    WScript.Echo "----- Given:" 
    For Each oFile In oFS.GetFolder(sDir).Files 
     WScript.Echo oFile.Path 
    Next 
    WScript.Echo "----- Rename:" 
    For Each oFile In oFS.GetFolder(sDir).Files 
     WScript.StdOut.Write oFile.Name 
     If IsNumeric(Left(oFile.Name, 3)) Then 
     WScript.Stdout.WriteLine " is already numbered" 
     Else 
     Dim sNewName : sNewName = Right(1000 + nIdx, 3) & "." & oFile.Name 
     If oFS.FileExists(oFS.BuildPath(sDir, sNewName)) Then 
      WScript.StdOut.WriteLine " already exists" 
     Else 
      oFile.Name = sNewName 
      WScript.StdOut.WriteLine " => " & oFile.Name 
     End If 
     nIdx = nIdx + 1 
     End If 
    Next 
    WScript.Echo "----- Result:" 
    For Each oFile In oFS.GetFolder(sDir).Files 
     WScript.Echo oFile.Path 
    Next 

两个运行的输出:

----- Given: 
M:\lib\kurs0705\testdata\17165630\c.png 
M:\lib\kurs0705\testdata\17165630\a.png 
M:\lib\kurs0705\testdata\17165630\b.png 
M:\lib\kurs0705\testdata\17165630\d.png 
----- Rename: 
c.png => 001.c.png 
a.png => 002.a.png 
b.png => 003.b.png 
d.png => 004.d.png 
----- Result: 
M:\lib\kurs0705\testdata\17165630\002.a.png 
M:\lib\kurs0705\testdata\17165630\003.b.png 
M:\lib\kurs0705\testdata\17165630\004.d.png 
M:\lib\kurs0705\testdata\17165630\001.c.png 

----- Given: 
M:\lib\kurs0705\testdata\17165630\002.a.png 
M:\lib\kurs0705\testdata\17165630\003.b.png 
M:\lib\kurs0705\testdata\17165630\004.d.png 
M:\lib\kurs0705\testdata\17165630\001.c.png 
----- Rename: 
002.a.png is already numbered 
003.b.png is already numbered 
004.d.png is already numbered 
001.c.png is already numbered 
----- Result: 
M:\lib\kurs0705\testdata\17165630\002.a.png 
M:\lib\kurs0705\testdata\17165630\003.b.png 
M:\lib\kurs0705\testdata\17165630\004.d.png 
M:\lib\kurs0705\testdata\17165630\001.c.png 
+1

'nIdx'应该有条件的,否则增量外递增将停止一次遇到名称冲突。 –

+0

感谢您的回复。它的抛出错误在“oFile.Name = nIdx”..错误是“句柄无效” – user2432627

+0

@ user2432627 - 那么你不使用(相当于)我发布的代码;仔细检查和/或发布您的代码。 –

相关问题