2013-06-18 59 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 - 那麼你不使用(相當於)我發佈的代碼;仔細檢查和/或發佈您的代碼。 –

相關問題