PowerShell ファイル名の一括置換【初実験編04】

2018-07-17PowerShell

PowerShellで、ファイル名を一括置換するには、下記のようにすれば良いようです。

Get-ChildItem <対象ファイル> | Rename-Item -NewName {$_.Name -replace '変更前文字列','変更後文字列'}

「cd c:\実験」にて、実験用ディレクトリーに、カレントを移動、内容を確認します。

PS C:\実験> Get-ChildItem


    ディレクトリ: C:\実験


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/07/16     22:07                dir1
d-----       2018/07/16     21:47                dir2
-a----       2018/05/15     21:38            172 test - コピー - コピー.txt
-a----       2018/05/15     21:38            172 test - コピー.txt
-a----       2018/05/15     21:38            172 test.txt
-a----       2018/05/09     20:46           8860 新規 Microsoft Excel ワークシート.xlsx

文字列"test"を、"@@@"に変えてみます。

Get-ChildItem | Rename-Item -NewName {$_.Name -replace 'test','@@@'}

エラーになりました。

PS C:\実験> Get-ChildItem | Rename-Item -NewName {$_.Name -replace 'test','@@@'}
Rename-Item : ソース パスとターゲット パスを同じにすることはできません。
発生場所 行:1 文字:17
+ Get-ChildItem | Rename-Item -NewName {$_.Name -replace 'test','@@@'}
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\実験\dir1:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

Rename-Item : ソース パスとターゲット パスを同じにすることはできません。
発生場所 行:1 文字:17
+ Get-ChildItem | Rename-Item -NewName {$_.Name -replace 'test','@@@'}
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\実験\dir2:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

置換対象にならなかった場合に、ソースファイル名とターゲットファイル名が同じになるため

エラーが出ました。(エラーが2つしか出ていないのが不可解なのですが。。。)

エラーは出ましたが、確認してみます。

PS C:\実験> Get-ChildItem

    ディレクトリ: C:\実験


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/07/16     22:07                dir1
d-----       2018/07/16     21:47                dir2
-a----       2018/05/09     20:46           8860 新規 Microsoft Excel ワークシート.xlsx
-a----       2018/05/15     21:38            172 @@@ - コピー - コピー.txt
-a----       2018/05/15     21:38            172 @@@ - コピー.txt
-a----       2018/05/15     21:38            172 @@@.txt

testが@@@に変わってました。

意図せすに、ディレクトリー名を置換しないために、Get-ChildItemには-Fileオプションを指定した方が良さそうです。

Get-ChildItem -File | Rename-Item -NewName {$_.Name -replace 'test','@@@'}

 

PowerShell Treeをファイルにリダイレクトしてみた【初実験編01】
PowerShell 同一階層のファイル名一覧をテキストファイルにリダイレクトしてみる【初実験編02】
PowerShell 起動方法(Windows10)【初実験編03】
PowerShell ファイル名の一括置換【初実験編04】
PowerShell ファイル検索【初実験編05】
PowerShell 文字列検索【初実験編06】
PowerShell VBAでPowerShellを実行して結果を取得する(Exec編)【初実験編07】
PowerShell VBAでPowerShellを実行して結果を取得する(Run編)【初実験編08】
PowerShell UNIXのシェルやDOSコマンド【初実験編09】