2017-07-06 19 views
1

フォルダ内のファイルの名前を再帰的に変更するためのvbscriptを作成しようとしています。 私の最終的な計画は、フォルダをZIPファイルにコピーすることですが、ファイルにvbscript regexを使用してファイルの名前を再帰的に変更する

(a-z)または(0-9)または "_"、 ""以外の文字が含まれていると失敗します。

たとえば、ファイル名に英語以外の文字が含まれている場合、そのファイルをzipにコピーすることはできません。私はさまざまなウェブサイトを見ており、バッチでも答えが出る可能性があります。

私は正規表現にかなり慣れており、昨日それについて学び始めました。

エラーは「ファイルは既に存在しています」です。

マイスクリプト:

Const ForReading = 1 
Const ForWriting = 2 
Const ForAppend = 8 
Const OverwriteExisting = TRUE 

scriptdir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) 

Set objFSO = CreateObject("Scripting.FileSystemObject") 

objStartFolder = scriptdir & "\Fragments" 

Set objFolder = objFSO.GetFolder(objStartFolder) 

Set colFiles = objFolder.Files 

Set objRegEx = CreateObject("VBScript.RegExp") 

objRegEx.Global = True 

objRegEx.Pattern = "[^A-Za-z_0-9-\n\r]" 

For Each objFile in colFiles 

If regEx.test(objFile.Name) = true Then 

FirstlevelNewFileName = objRegEx.Replace(objFile.Name, "_") 

objFSO.MoveFile objFile, FirstlevelNewFileName 

End If 
Next 

ShowSubfolders objFSO.GetFolder(objStartFolder) 


Sub ShowSubFolders(Folder) 

For Each Subfolder in Folder.SubFolders 

Set objFolder = objFSO.GetFolder(Subfolder.Path) 

Set colFiles = objFolder.Files 

For Each objFile in colFiles 

     NewFileName = objRegEx.Replace(objFile.Name, "_") 

objFSO.MoveFile objFile.Path, NewFileName 

    Next 

    ShowSubFolders Subfolder 

Next 

End Sub 

はお時間をいただき、ありがとうございます!

+0

私はあなたがしていることを理解していません。ファイル名に不正な文字が含まれていると、Windowsは最初にファイルを作成することを許可しないので、正規表現では何もしないでください。だからあなたは 'FirstlevelNewFileName'に何も割り当てず、決してファイルを移動しようとしません(' if'は決して入力されません)。 –

+0

@KenWhiteたとえば、ファイル名に中国語の文字などを使用すると、名前を付けることができますが、名前を変更せずにファイルをzipファイルにコピーすることはできません。 – theperfectcucumber

+0

それでも論理的な欠陥があります。 '@'は何百という中国語やその他の無効な文字*のどれかを表していて、 'ABC @ .txt'というファイルを持っているとします(' @ 'は何十万という文字のどれかになります)と 'ABC @ .txt'(ここで' @ 'は数十万の文字のうちの別のものです)と同じ文字をすべて同じ' _'で置き換えています。同じ名前のファイルが2つありますが、それらのファイルは最初から始まっていません。 –

答えて

1

あなたのコードはMovefileステートメント(ファイルの名前を変更しようとしている)に問題があると思います。 Destinationパラメーターとしてファイル名のみを指定しています。そこに完全なパスを提供する必要があります。私は以下のように変更を加えました。

注:Logicを変更しませんでした。

Const ForReading = 1 
Const ForWriting = 2 
Const ForAppend = 8 
Const OverwriteExisting = TRUE 

scriptdir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) 

Set objFSO = CreateObject("Scripting.FileSystemObject") 

objStartFolder = scriptdir & "\Fragments" 

Set objFolder = objFSO.GetFolder(objStartFolder) 

Set colFiles = objFolder.Files 

Set objRegEx = new Regexp 

objRegEx.Global = True 

objRegEx.Pattern = "[^\w.]"  'looks for non-word characters and also not .(for the extension) 

For Each objFile in colFiles 

    If objRegEx.test(objFile.Name) = true Then     'Changed this. You had only used the variable RegEx here instead of objRegEx 

     FirstlevelNewFileName = objRegEx.Replace(objFile.Name, "_") 

     objFile.Move objStartFolder&"\"&FirstlevelNewFileName 'Provided the full file path here. Used the File Object itself 

EndIf 
Next 

ShowSubfolders objFSO.GetFolder(objStartFolder) 


Sub ShowSubFolders(Folder) 

For Each Subfolder in Folder.SubFolders 

    Set objFolder = objFSO.GetFolder(Subfolder.Path) 

    Set colFiles = objFolder.Files 

    For Each objFile in colFiles 

     NewFileName = objRegEx.Replace(objFile.Name, "_") 

     objFile.Move Subfolder.Path&"\"&NewFileName  'passed the full path here again 

    Next 

    ShowSubFolders Subfolder 

Next 

End Sub 
関連する問題