Rename-Item コマンドレットとは?
PowerShell の Rename-Item コマンドレットは、項目の名前を変更するために使用できます。この項目は、ファイル、ディレクトリ、またはパス内の任意のオブジェクトになります。このコマンドレットは、ローカル環境だけでなくネットワーク環境でも項目の名前を変更するのに使用できます。ユーザーは、バッチの名前変更操作を実行したり、自動化のために名前変更タスクをスクリプトに組み込んだり、ワイルドカード文字や正規表現を使って複雑な名前変更要件を管理したりすることも可能です。たとえば、ファイル名や拡張子を簡単に変更したり、タイムスタンプやその他の識別情報を名前に組み込んでファイルを整理したりできます。
他にも参考になる PowerShell のコンテンツ:
PowerShell ファイルを削除する方法
PowerShell ファイルを作成する方法
PowerShell ファイルをコピーする方法
Rename-Item コマンドレット:構文
以下は PowerShell の Rename-Item コマンドレットの構文と、その補助パラメーターです。これにより、名前変更プロセスを柔軟に制御できます。
Rename-Item -Path <String> -NewName <String> [-Force] [-PassThru] [-WhatIf] [-Confirm] [<CommonParameters>]
以下は Rename-Item の基本コマンドレットです。このコマンドは、現在のディレクトリ内のファイルを「Report.txt」から「Report-26-09-2024.txt」にリネームします。
Rename-Item -Path "C:\Temp\Report.txt" -NewName "Report-26-09-2024.txt"
初心者向け Windows PowerShell スクリプト入門(PDF)
詳しく見るRename-Item: パラメーター
Rename-Item のパラメーターを理解すると、項目の名前変更にこの cmdlet を効果的に使えるようになります。以下は、PowerShell でこの cmdlet と一緒に使用されるすべてのパラメーターの説明です。
|
Parameters |
Description |
|
-Path |
Specifies the path of the item to be renamed. This can be the full path or relative to the current directory. The item at the path can be a file, folder, or any other type supporting renaming. This parameter is mandatory. |
|
-LiteralPath |
Provides an alternative to -Path. It is used to specify the path when the item names include special characters that PowerShell might otherwise interpret differently, such as “[“ or “]”. Unlike -Path, wildcard characters are not allowed, and the specified string is used exactly as it is. |
|
-NewName |
This mandatory parameter represents the new name for the item. It is important to note that this should be just the item’s name, not a path. If you are renaming a file and wish to keep its file type, ensure that the appropriate file extension is included in the new name. |
|
-Credential |
Although not commonly used in scripts for local file management, this optional parameter allows the cmdlet to execute using a set of user-specified credentials. This can be useful when working with files on a network share or in any scenario requiring specific permissions. |
|
-Force |
This parameter enables the cmdlet to rename read-only, hidden, or otherwise protected items. It overrides restrictions that would generally prevent the operation from succeeding. |
|
-PassThru |
By default, Rename-Item does not output any object. When the -PassThru parameter is used, the cmdlet returns the object that has been renamed. This can be useful for piping the renamed item into further commands or for immediate operation verification. |
|
-WhatIf |
This safety feature simulates the execution of the cmdlet without performing the rename operation. It shows what would happen if the cmdlet were to run, providing a preview of the results. This can be particularly useful in scripts or batch operations where you want to avoid unintended consequences. |
|
-Confirm |
Prompts the user for confirmation before executing the cmdlet. This can be useful in interactive scripts or when making significant changes, providing an extra layer of safety against unintended actions. |
パラメーターを使った Rename-Item の使用例
以下に、さまざまなパラメーターを使用した Rename-Item の例を示します。これらの例では、条件に応じて項目の名前を変更する方法を説明し、実際のシナリオでこの cmdlet を適用する方法を実践的に理解できるようにします。
以下は基本的な例の cmdlet で、単一のファイルを “Design.txt” から “Report.txt” に名前変更します。
Rename-Item -Path "C:\Backups\Design.txt" -NewName "Report.txt"
以下の例のとおり、-Force パラメーターは読み取り専用または非表示のファイル名を変更します。
Rename-Item -Path "C:\Backups\Design.txt" -NewName "Report.txt" -Force
-PassThru パラメーターは、リネームされた項目を表すオブジェクトを返します。そのオブジェクトは、別の cmdlet にパイプすることができます。リネーム後は、リネームされた項目の完全な詳細情報がすぐに得られます。
Rename-Item -Path "C:\Backups\Design.txt" -NewName "Report.txt" -PassThru | Get-Item
リネームを実行せずに、何が起こるかを確認するには -WhatIf パラメーターを使用します。これはスクリプトでのテストに特に役立ちます。結果を確認したら、実際のリネーム処理のために -WhatIf パラメーターなしで cmdlet を実行してください。
Rename-Item -Path "C:\Backups\Design.txt" -NewName "C:\Backups\NewDesign.txt" -WhatIf
出力は実行内容を説明しますが、実際には実行しません。
リネームが実行される前に確認のプロンプトを表示したい場合は、Confirm パラメーターを使用します。誤ってリネームしてしまうと大きな影響につながり得るシナリオで有用です。
Rename-Item -Path "C:\Backups\Design.txt" -NewName "Report.txt" -Confirm
操作が進行する前に、アクションを確認するよう求められます。
Path と LiteralPath のパラメータ
ファイルやディレクトリの操作を伴う cmdlet を扱うときは、-Path と -LiteralPath の2つのパラメータに出会うことがよくあります。この2つのパラメータの違いを理解することは、特に特殊文字や予約語が含まれるファイル名またはパスを扱う場合に、ファイルシステムのタスクを効果的に管理するうえで不可欠です。
-Path
-Path は、アイテムの場所を指定する際により一般的に使われるパラメータです。ワイルドカード (*) をサポートしており、パターン マッチングを行って、1つのコマンドで複数のアイテムを選択できます。PowerShell は、ワイルドカード文字を含む特殊文字を解釈します。つまり、ファイル名やパスに “[],(),{}” のような文字が含まれている場合、PowerShell がそれらをワイルドカード パターンの一部として扱い、予期しない動作につながる可能性があります。
例
Rename-Item -Path C:\Logs\*
-LiteralPath
-LiteralPathは、文字をワイルドカードとして解釈せずに、項目の場所を指定するために使用します。特殊文字を含むファイル名やパスを扱う場合は、このパラメーターを入力できます。これにより、PowerShellが入力文字列を文字通りに扱い、パターンマッチングを試みないようにできます。
例
Rename-Item -LiteralPath “C:\Files\[Design].txt”
Rename-Itemのよくある使用例
ファイルの名前変更と移動
PowerShell で Rename-Item cmdlet を使ってファイルの名前を変更し、同時に別の場所へ移動することはできません。その操作を行うと、以下のエラーが表示されます。
ファイルを移動し、同時に移動先でファイル名も名前変更するには、Move Item cmdlet を使用する必要があります。
以下は、cmdlet を使ってファイルを移動し、名前を変更する方法です。
Move-Item -Path "C:\Backups\Design.txt" -Destination "C:\Archive\NewDesign.txt"
隠しファイルおよび読み取り専用ファイルの名前変更
隠しファイルまたは読み取り専用ファイルの名前を変更するには、Rename-Item cmdlet と併せて -Force パラメーターを使用します。このパラメーターにより、PowerShell は名前変更の処理中に読み取り専用属性を回避できます。
Rename-Item -Path "C:\Documents\ReadOnlyFile.txt" -NewName "RenamedFile.txt" -Force
ファイルを一括で名前変更
PowerShell を使ったファイルの一括名前変更は、大規模なデータセットの管理、アーカイブの整理、または単にディレクトリの掃除を行うときによくある作業です。
たとえば “.txt” から “.log” へ、複数のファイルの拡張子を変更する必要がある場合は、次のスクリプトを使用できます。
Get-ChildItem -Path "C:\Documents" -Filter "*.txt" | ForEach-Object {
$newName = [io.path]::ChangeExtension($_.Name, ".log")
Rename-Item -Path $_.FullName -NewName $newName
}
または、下記の PowerShell の「複数のファイルおよびファイル拡張子の名前変更」cmdlet を使用すれば、各ファイルごとにループを追加せずに済みます。
Get-ChildItem -Path "C:\Documents\*.txt" | Rename-Item -NewName { $_.Name -replace ".txt",".log" }
接頭辞と接尾辞の追加
PowerShell の「ディレクトリ内のすべてのファイルをリネームする」コマンドを使うと、ファイル名に接頭辞や接尾辞を追加できます。これは、ファイルを整理したり、ドキュメントのバージョン管理を行ったり、アーカイブ用にデータを準備したりするときに、よくある作業です。PowerShell では、Get-ChildItem と Rename-Item の cmdlet を使って、接頭辞や接尾辞を付けることができます。
次のスクリプトを使って、特定のディレクトリ内のすべてのファイルに接頭辞を追加できます。
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
Rename-Item -Path $_.FullName -NewName ("Project_" + $_.Name)
}
同様に、次のスクリプトを使って、ファイル拡張子の直前に接尾辞を追加できます。
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
Rename-Item -Path $_.FullName -NewName ($_.BaseName + "_Final" + $_.Extension)
}
すべての .txt ファイルに接頭辞「Backup_」と接尾辞「_2024」を追加します。
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
Rename-Item -Path $_.FullName -NewName ("Backup_" + $_.BaseName + "_2024" + $_.Extension)
}
タイムスタンプ付きでファイル名を変更する
ファイル名にタイムスタンプを含めてリネームすることは、バックアップの作成、アーカイブの整理、ファイルのバージョン追跡に非常に役立ちます。
この例では、特定のディレクトリ内のすべての「.txt」ファイルに対して、「yyyyMMdd_HHmmss」形式のタイムスタンプを接尾辞として追加する方法を示します。
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$newName = $_.BaseName + "_" + $timestamp + $_.Extension
Rename-Item -Path $_.FullName -NewName $newName
}
タイムスタンプをファイル名の先頭に置きたい場合は、以下のようにスクリプトを少しだけ変更できます。
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$newName = $timestamp + "_" + $_.Name
Rename-Item -Path $_.FullName -NewName $newName
}
C:\Documents ディレクトリ内のすべての .txt ファイルの名前を変更したい場合は、先頭に作成タイムスタンプを追加します。
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
$timestamp = $_.CreationTime.ToString("yyyyMMdd_HHmmss")
Rename-Item -Path $_.FullName -NewName ("$timestamp" + "_" + $_.Name)
}
すべての .txt ファイルに、修正(変更)タイムスタンプを接尾辞として追加したい場合。
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
$timestamp = $_.LastWriteTime.ToString("yyyyMMdd_HHmmss")
Rename-Item -Path $_.FullName -NewName ($_.BaseName + "_" + $timestamp + $_.Extension)
}
すべての .docx ファイルに、作成タイムスタンプを接頭辞として、最終更新タイムスタンプを接尾辞として追加したい場合。
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
$creationTimestamp = $_.CreationTime.ToString("yyyyMMdd_HHmmss")
$modifiedTimestamp = $_.LastWriteTime.ToString("yyyyMMdd_HHmmss")
Rename-Item -Path $_.FullName -NewName ("$creationTimestamp" + "_" + $_.BaseName + "_$modifiedTimestamp" + $_.Extension)
}
ファイル名の競合への対処
ファイル名の競合への対処は、ファイルのリネームや移動などのファイル操作を自動化する際に重要です。既存のファイルを意図せず上書きしてしまわないためです。新しい名前のファイルが既に存在するかどうかを確認できます。存在する場合は、新しい名前を変更できます(例:カウンターや追加のタイムスタンプを末尾に付ける)。
例:競合がある場合はカウンターと作成日を追記する
Get-ChildItem -Path "C:\Documents\*.txt" | ForEach-Object {
$baseName = $_.BaseName
$extension = $_.Extension
$creationTimestamp = $_.CreationTime.ToString("yyyyMMdd_HHmmss")
$newName = "$baseName" + "_$creationTimestamp" + "$extension"
# Initialize a counter for collisions
$counter = 1
# Check if the new name already exists
while (Test-Path -Path (Join-Path -Path $_.DirectoryName -ChildPath $newName)) {
$newName = "$baseName" + "_$creationTimestamp" + "_$counter" + "$extension"
$counter++
}
Rename-Item -Path $_.FullName -NewName $newName
}
説明
上記のスクリプトは、すべての .txt ファイルを取得します。次に、ファイルの作成日としてタイムスタンプを使用して新しい名前を作成し、その新しい名前がすでに存在するかどうかを確認します。存在する場合は、“_1”、“_2” などのカウンターを付けて、固有の名前が見つかるまで繰り返します。
レジストリキーの名前変更
PowerShell を使ってレジストリキーの名前を変更するには、Rename-Item コマンドレットを使用し、実行する前に変更予定のキーをエクスポートします。これは、何か問題が起きた場合に備えてバックアップを確実にするための予防措置です。
Rename-Item -Path "HKLM:\Software\MyCompany\Advertising" -NewName "Marketing"
Microsoft 365 チュートリアル:完全な管理ガイド
詳しくはこちら複雑なリネームには正規表現を使用する
PowerShell:フォルダー内のファイル名を変更するコマンド
-replace 演算子を使うと、正規表現(regex)パターンを適用してフォルダー内のファイル名を変更できます。これは、特定のパターンに基づいてファイル名やディレクトリ名の一部を追加・削除・変更する必要がある一括リネーム作業に有効です。
たとえば、「report1_2023-04-01.txt」「report2_2023-04-02.txt」などのような名前のファイルが多数あり、それらの名前から日付スタンプを、アンダースコア(_)も一緒に削除したいとします。
以下のコマンドは、「report*」で始まり、その後に日付スタンプが付いたすべての .txt ファイルを見つけ、日付スタンプを削除して名前を変更します。番号はそのまま保持し、「report.txt」だけが残る形になります(例:「report1.txt」「report2.txt」)。
Get-ChildItem -Path "C:\Backups"-Filter "report*.txt" | Rename-Item -NewName {$_.Name -replace '_\d{4}-\d{2}-\d{2}', ''}
連番の付与
Rename-Item cmdlet を使ってファイル名に連番を追加するには、ファイルを順に処理しながらカウンターを実装するためのスクリプトが必要です。これは、ファイルを特定の順序で整理したり、重複を防いで一意性を確保したりするのに特に役立ちます。
ファイル名に連番を含めるようにリネームしたい場合(例:「Image_1.jpg」「Image_2.jpg」)は、以下のスクリプトを使用できます。
$counter = 1
Get-ChildItem -Path "C:\Images" -Filter "*.jpg" | ForEach-Object {
Rename-Item -Path $_.FullName -NewName ("Image_$counter.jpg")
$counter++
}
Rename-Item でよくあるエラーとトラブルシューティング
ファイル、ディレクトリ、レジストリキーの名前変更を PowerShell で行う際に、よくあるエラーや問題に遭遇することがあります。これらの潜在的な落とし穴とトラブルシューティング方法を理解することで、ファイルやディレクトリの名前変更タスクをスムーズに進められます。以下に、よくあるエラーとトラブルシューティングのヒントを示します。
ファイルが見つからないエラー
PowerShell がパスを見つけられなかったのは、そのパスが存在しないためです。ファイル パスに誤字がないか確認してください。名前を変更する前に Test-Path cmdlet を使用して、ファイルが存在するかどうかを確認します。
if (Test-Path "C:\Backups\design.txt") {
Rename-Item -Path "C:\Backups\Design.txt" -NewName "NewDesign.txt"
} else {
Write-Host "File does not exist."
}
ファイルが使用中
別のプロセスがファイルを使用しているため、cmdlet はそのファイルにアクセスできません。名前を変更しようとしているファイルが別のアプリケーションで開かれている場合に、このエラーが発生します。ファイルを使用している可能性のある他のアプリケーションで、そのファイルを閉じてください。問題が解決しない場合は、ファイルをロックしているプロセスを終了するか、ファイルのロックを解除するためにシステムを再起動する必要があるかもしれません。
アクセス拒否エラー
指定したパスへのアクセスが拒否されたか、ファイルまたはレジストリキーを変更するための権限が不足しています。
このエラーを回避するには、PowerShell を管理者として実行するか、ファイルまたはキーの権限を確認し、必要に応じて調整してください。
パスが長すぎるエラー
指定したパス、ファイル名、またはその両方が長すぎます。Windows には最大パス長の制限があります(通常 260 文字)。ファイルをより上位のディレクトリ階層に移動して、パスを短くしてください。
宛先が既に存在するエラー
宛先がすでに存在するため、名前を変更できません。新しいファイル名は宛先ディレクトリ内で既に存在します。Test-Path を使用して、宛先ファイルが存在するかどうか確認してください。サフィックスを付ける、または数値をインクリメントするなど、競合を管理するようにスクリプトを変更します。
無効な文字エラー
ファイル、ディレクトリ、またはレジストリ名が正しくありません。新しいファイル名に無効な文字が含まれています。新しい名前に無効な文字が含まれていないことを確認してください。名前変更の前に、正規表現を使って無効な文字を削除または置換してください。
結論
PowerShell の Rename-Item コマンドを使用すると、ファイル、ディレクトリ、またはファイル システム上のその他の項目の名前を変更できます。このコマンドは項目そのものは変更せず、名前のみを変更します。PowerShell では、現在のパスと新しい名前を指定して項目の名前を変更できます。さらに、このコマンドには、操作を強制的に実行するオプション、実際に項目の名前を変更せずに何が起こるかを表示するオプション、名前変更の前に確認を求めるプロンプトを表示するオプションも用意されています。このコマンドは、ファイルやディレクトリの管理タスクを自動化するのに役立ちます。たとえば、ファイルに接頭辞、接尾辞、連番を追加する処理を自動化できます。
Netwrix Directory Manager
よくある質問(FAQ)
PowerShell の Rename-Item cmdlet とは何ですか?
Rename-Item cmdlet は、PowerShell を使用して項目の名前を変更するために使います。たとえばファイルやレジストリ キーなどです。-Path、-Force、-WhatIf、-Confirm、-Passthru など、さまざまな対応パラメーターが用意されており、異なる状況に応じて使い分けられます。
Rename-Item を使ってファイルを移動しながら同時に名前を変更できますか?
いいえ。Rename-Item では、ファイルを同時に移動してリネームすることはできません。まず Move-Item を使ってファイルを移動し、新しいファイル名とともに移動先を指定する必要があります。
共有する
もっと詳しく
著者について
Kevin Horvatin
リード ソフトウェア アーキテクト
Kevin Horvatin は Netwrix のリード ソフトウェア アーキテクトであり、Netwrix Privilege Secure を担当しています。20 年以上のソフトウェア開発経験があり、PowerShell と C# が登場して以来、それらを扱ってきました。