PowerShell の Move-Item Cmdlet を使ってファイルを移動する
Aug 25, 2025
The Move-Item cmdlet を使うと、PowerShell でファイル、フォルダー、レジストリ キー、およびサブキーを精密に移動できます。単一または複数のファイルを移動したり、移動中に名前を変更したり、フォルダー構造を保持またはフラット化したり、ローカル パス/ネットワーク パスの両方にまたがって作業できます。便利なパラメーターには -Recurse, -Include, -Exclude, -Filter, -Force, and -WhatIf があります。安全のため、移動と Test-Path、エラー処理(try/catch)、そしてログ記録を組み合わせて使用してください。
日常的な作業として、ユーザーはファイルやフォルダーなどのアイテムを、コンピューター上のある場所から別の場所へ移動し、データを整理して意味のある形にします。これはファイル エクスプローラー内で単純な copy and paste オプションで実現することもできますが、高度なユーザーは効率と精度のために PowerShell を好む場合があります。
定義:Move-Item Cmdlet
PowerShell の Move-Item cmdlet は、ファイル エクスプローラーで項目を 1 つの場所から別の場所へ移動し、プロパティ、内容、および子項目をそのまま維持します。使用方法は次のとおりです:
- ファイルまたはフォルダーをあるディレクトリから別のディレクトリへ移動する
- 複数のファイルまたはディレクトリを一度に移動する
- レジストリのサブキーをあるキーから別のキーへ移動する
新しい場所に追加されると、移動された項目は元の場所から削除されます。
前提として、新しい場所は同じプロバイダーによってサポートされている必要があります。
Move-Item の基本構文
Move-Item の cmdlet には、次の基本構文があります。
Move-Item -Path "sourceFilePath" -Destination "destinationFilePath"
サポートされているパラメーターを含む構文の例は次のとおりです:
Move-Item
[-Path] <String[]>
[[-Destination] <String>]
[-Force]
[-Filter <String>]
[-Include <String[]>]
[-Exclude <String[]>]
[-PassThru]
[-Credential <PSCredential>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Move-Item で単一ファイルを移動する
PowerShell で 1 つのファイルをある場所から別の場所へ移動するには、Move-Item cmdlet でソース ファイルのパスと宛先ディレクトリを指定します。例は次のとおりです:
Move-Item -Path <source file path>\<file name> -Destination <Destination path>
移動の move プロセス中にも、ファイル名を変更できます。
シナリオ 1 – ファイル名を変更せずに単一ファイルを移動する
この cmdlet は Test.txt ファイルを C:\Temp ディレクトリから C:\Backup ディレクトリへ、ファイル名を変更せずに移動します:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup
シナリオ 2 – 単一ファイルを移動し、移動の過程で名前を変更する
この cmdlet は Test.txt ファイルを C:\Temp ディレクトリから C:\Backup ディレクトリへ移動しつつ、UseCase.txt に名前を変更します:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\UseCase.txt
複数ファイルの移動
Move-Item cmdlet ではワイルドカードを使用して、一度に複数の項目(複数のファイルなど)をある場所から別の場所へ移動できます。たとえば、同じ拡張子のすべてのファイルを簡単にある場所から別の場所へ移動できます。
シナリオ 1 – ワイルドカードを使用して同じ拡張子のすべてのファイルを移動
この cmdlet は、すべてのテキスト ファイル(*.txt)を C:\Temp ディレクトリから C:\Backup ディレクトリへ移動し、他のすべてのファイルは残します:
Move-Item -Path C:\Temp\*.txt -Destination C:\Backup
シナリオ 2 – 拡張子に関係なくすべてのファイルを移動
ソース ディレクトリからフォルダーではなくすべてのファイルだけを抽出するには、-File パラメーター付きの Get-ChildItem cmdlet を使用します。次に、その結果を Move-Item cmdlet にパイプして、抽出したファイルを宛先ディレクトリへ移動し、すべてのフォルダーはそのまま残します。
次の cmdlet では、-File パラメーターによって C:\Temp ディレクトリ内のファイルのみが抽出されます。続いて Move-Item cmdlet が、それらのファイルを C:\Temp から C:\Backup ディレクトリへ移動し、C:\Temp にはフォルダーを残します:
Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
シナリオ 3 – 特定のファイルを移動する
同じ拡張子または異なる拡張子を持つ特定のファイルを移動することも可能です。その場合は、複数の値をカンマで区切って、パスの配列を指定することで複数のファイルを指定します。
この cmdlet は、名前が Test.txt と UseCase.pdf の 2 つのファイルを C:\Temp フォルダーから C:\Backup フォルダーへ移動します:
Move-Item -Path C:\Temp\test.txt, C:\Temp\UseCase.pdf -Destination C:\Backup
ディレクトリを移動する
PowerShell の Move-Item cmdlet は、ディレクトリの中身すべて(ファイル、フォルダー、サブフォルダー)を別のディレクトリへ移動できるほど強力です。あるいは、すべてのコンテンツを移動して、空のディレクトリを残すように選択することもできます。いずれの場合も、ソースのフォルダー構造が宛先へコピーされます。
シナリオ 1 – ディレクトリ全体を、その中身すべてと一緒に移動する
この cmdlet は Temp フォルダーを、その内容ごと C:\Backup フォルダーへ移動します。
Move-Item -Path C:\Temp -Destination C:\Backup
Temp フォルダーが C:\ から削除され、Backup ディレクトリに配置される点に注意してください。
シナリオ 2 – ディレクトリを残したまま、その中のすべてのコンテンツを移動する
この cmdlet は Keys ディレクトリ内のすべてのファイルとフォルダーを再帰的に C:\Backup フォルダーへ移動します。
Move-Item -Path C:\Temp\Keys\* -Destination C:\Backup
この場合、ソース ディレクトリ(Keys)はそのまま残り、すべての内容が移動される点に注意してください。この cmdlet は、ソース ディレクトリを空の状態のままにする必要があります。
ファイルをネットワークの場所へ移動する
Move-Item の cmdlet では、ファイルをネットワークの場所に移動することもできます。宛先としてネットワーク パスを指定するだけです。
次の点を確認してください。
- ネットワークの場所にアクセスするために必要な権限が必要です。
- cmdlet を実行しているマシンからネットワーク パスにアクセスできる必要があります。
- ネットワークの場所で認証が必要な場合は、次のいずれかを行う必要があります。
- まず New-PSDrive cmdlet を使用してネットワーク ドライブをマップするか、Windows エクスプローラーから手動でマップします
- ネットワーク リソースにアクセスするときに資格情報を指定します
シナリオ 1 – ファイルをネットワーク上の場所に移動する
この cmdlet は Text.txt ファイルを C:\Temp から、ネットワーク上の場所(Backup というフォルダー)へ移動します。FileServer という名前のサーバー上にあります。
Move-Item -Path C:\Temp\test.txt -Destination \\FileServer\Backup
シナリオ 2 – ファイルを移動するときに上書きを防ぐ
Move-Item cmdlet でファイルをネットワーク上の場所に移動する場合、-Force パラメーターを指定していなくても、ファイル名が同じであれば既存のファイルが上書きされます。
上書きを防ぐには、ファイルを移動する前にチェックを追加します。
if (-not (Test-Path "\\FileServer\Backup\test.txt")) {
Move-Item -Path "C:\Temp\test.txt" -Destination "\\FileServer\Backup"
}
else {
Write-Host "A file with the same name already exists in the destination."
}
Test-Path は、宛先にファイルが既に存在するかどうかを確認します。存在する場合は、ファイルを移動せず ad の代わりに通知します。
初心者向け Windows PowerShell スクリプト作成チュートリアル(PDF)
詳しく見る再帰的なファイル移動
PowerShell の Move-Item コマンドレットは、-Recurse パラメーターと一緒に使用して、あるディレクトリ内のすべてのファイル(およびその中にあるすべてのフォルダーとサブフォルダー)を別の場所へ移動できます。さらに、移動対象を特定の拡張子のファイルに限定することも可能です。
シナリオ1:同じ拡張子のすべてのファイルを再帰的に移動
このコマンドレットは、C:\Temp ディレクトリとそのサブフォルダー内のすべての PDF ファイルを、C:\Backup ディレクトリへ再帰的に移動します。
Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
ここでは、Get-ChildItem cmdlet が、C:\Temp ディレクトリおよびそのサブフォルダー内で拡張子が *.pdf の子アイテムを取得します。取得を再帰的に行うために -Recurse パラメーターを使用します。
パイプ(|)は結果を Move-Item cmdlet に渡し、Move-Item が pdf ファイルを Backup ディレクトリへ移動します。
注記: デフォルトでは、Get-ChildItem は隠しファイルを移動しません。隠しファイルを移動するには、Get-ChildItem と一緒に -Force パラメーターを使用し、その後結果を Move-Item にパイプします。
シナリオ 2 – すべてのファイルを再帰的に移動
Get-ChildItem cmdlet に -Recurse パラメーターを指定して、あるディレクトリから別のディレクトリへファイルを再帰的に移動します。
この cmdlet は C:\Temp ディレクトリおよびそのサブディレクトリ内のすべてのファイルを C:\Backup ディレクトリへ移動します。-Recurse パラメーターは指定したパスのすべてのサブディレクトリを検索するために使用され、-File パラメーターはフォルダーを除外してファイルのみを取得するように cmdlet を制限します。
Get-ChildItem -Path C:\Temp -Recurse -File | Move-Item -Destination C:\Backup
この cmdlet はファイルのみを移動する点に注意してください。フォルダーやサブフォルダーには影響しません。さらに、この cmdlet はファイルを宛先ディレクトリのルートに移動し、宛先でソースディレクトリのフォルダー構造を作成しません。
ファイルのフィルター
Move-Item cmdlet を使用して項目を移動する際に、特定の基準に基づいて項目をフィルターできます。たとえば、ソース ディレクトリ内の特定のファイルを保持したい、または特定の名前や拡張子を持つファイルだけを移動したい場合があります。このような操作には、-Filter、-Include、-Exclude パラメーターが便利です。
- -Include パラメーターは、移動するために特定の属性に一致するファイルを含めるのに使用します。たとえば、属性としてファイル名(c:\temp\test*)や拡張子(*.txt)を指定すると、指定した属性に一致するファイルだけが宛先の場所へ移動されます。
- -Exclude パラメーターは、特定の属性に一致するファイルが移動されないように除外するために使用します。たとえば、ファイル名(c:\temp\test*)または拡張子(*.txt)を属性として指定でき、その属性に一致するファイルは宛先の場所に移動されません。
- -Filter パラメーターは -Include パラメーターと似ていますが、 -Include よりも高速で効率的です。
次の点を考慮してください:
- 特定のデータを含める/除外する/フィルターするには、フォルダー内の全コンテンツを使用する必要があります。
- これらのパラメーターはワイルドカードで動作します。
注記:
以下のシナリオで提供されている cmdlet を実行する前に、最新の PowerShell バージョンを使用していることを確認してください。そうでない場合は、スムーズな操作のために PowerShell バージョンを更新してください。
シナリオ 1 – 特定の拡張子のファイルを除外する
この cmdlet は、C:\Temp フォルダー内のすべてのファイルを Backup フォルダーへ移動します(ただし .txt の拡張子を持つファイルは除きます)。
Move-Item -Path C:\Temp\* -Exclude *.txt -Destination C:\Backup
同様に、以下の cmdlet では -Filter パラメーターによって、C:\Temp から C:\Backup へすべての .docx ファイルが移動されます。
Move-Item -Path C:\Temp\* -Filter *.docx -Destination C:\Backup
シナリオ 2 – 特定の拡張子のファイルを移動する
この cmdlet は C:\Temp フォルダーからテキスト ファイル(.txt)のみを Backup フォルダーに移動します。
Move-Item -Path C:\Temp\* -Include *.txt -Destination C:\Backup
同様の機能については、「複数ファイルの移動」セクションを参照してください。
シナリオ 3 – 特定の文字列で始まる名前のファイルを移動する
この cmdlet は、名前が「log」で始まるファイルを移動します。「log」で始まらないファイルは C:\Temp から移動しません。
Move-Item -Path C:\Temp\* -Include log* -Destination C:\Backup
高度な移動シナリオ
Move-Item PowerShell コマンドレットでは、ファイル サイズ、最終更新日時などの特定の条件に基づいてファイルを移動することもできます。この目的のために、次のいずれかの方法を選択できます:
- 「-Filter」パラメーターを使用する
- 移動する前に、Get-ChildItem と Where-Object を使用して、特定の属性または日付プロパティを持つファイルを選択します。手順は 3 ステップです:
- Get-ChildItem コマンドレットは、ソースの場所からファイルを取得します。
- ファイル サイズや最終更新日時などの属性でフィルターするには、出力を Where-Object コマンドレットにパイプします。
- 次に、フィルター済みのファイルを移動するために、出力を Move-Item cmdlet にパイプします。
つまり、5 GB を超えるファイルを移動するには Get-ChildItem でファイルを見つけ、Where-Object でフィルターし、Move-Item で移動します。
シナリオ 1 – 過去 X 日間に変更されたファイルとフォルダーを移動
この cmdlet は、過去 30 日間に変更されたすべてのファイルとフォルダーを C:\Temp ディレクトリから C:\RecentFiles ディレクトリへ移動します。
Get-ChildItem -Path C:\Temp\* | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-30)} | Move-Item -Destination C:\RecentFiles
ここまでで Get-ChildItem と Move-Item の cmdlet にはすでに十分慣れているはずですが、次は Where-Object を詳しく見ていきましょう。この cmdlet は過去 30 日間に変更された項目をフィルターします。
- $_ は、Get-ChildItem から渡される各オブジェクト(ファイルまたはフォルダー)を表します。
- LastWriteTime は、ファイル/ディレクトリのプロパティで、項目が最後に変更された、または書き込まれた時刻を示します。
- (Get-Date).AddDays(-30) は現在の日付を取得し、そこから 30 日を引きます。
シナリオ 2 – 指定したサイズより大きいファイルやフォルダーを移動する
この cmdlet は、2GB を超えるすべてのファイルとフォルダーを C:\Temp ディレクトリから C:\LargeFiles ディレクトリへ移動します。
Get-ChildItem -Path C:\Temp\* | Where-Object {$_.Length -gt 2GB} | Move-Item -Destination C:\LargeFiles
フォルダー構造を維持する
Move-Item コマンドレットは、ソースから宛先パスへ、フォルダー構造全体をそのままコピーしたり再作成したりする機能を本来備えていません。とはいえ、ファイルを宛先へ移動しながらフォルダー構造を保持する方法はいくつかあります。
- Move-Item コマンドレットを、Copy-Item や検証後の Remove-Item などの他のコマンドレットと組み合わせる
- フォルダー構造を手動で再作成する
シナリオ 1 – 内容とフォルダー構造をそのまま維持した状態でディレクトリを移動する
フォルダー構造とすべての内容をそのまま維持してディレクトリを移動するには、「Move a Directory」セクションを参照してください。
シナリオ 2 — フォルダー構造を保持しながら特定のファイルを移動する
PowerShell はより複雑な機能に対応しており、移動先でフォルダー構造を再作成しながら特定のファイルを移動できます。
This script moves specific files (e.g., .pdf files) while keeping the folder structure intact:
Get-ChildItem -Path "C:\Temp" -Recurse -Filter "*.pdf" | ForEach-Object {
$destinationPath = $_.FullName.Replace("C:\Temp", "C:\Backup")
$destinationDir = Split-Path $destinationPath
if (-not (Test-Path $destinationDir)) {
New-Item -ItemType Directory -Path $destinationDir
}
Move-Item -Path $_.FullName -Destination $destinationPath
}
ここでは、Get-ChildItem -Recurse がサブフォルダーを含むソース ディレクトリ内のすべての .pdf ファイルを取得します。ForEach-Object は、見つかった各ファイルをループ処理します。
Replace(“C:\Temp”, “C:\Backup”) はソース パスを調整して、移動先に対応するパスを作成し、New-Item -ItemType Directory は移動先のディレクトリが存在しない場合にフォルダー構造を作成します。
上書きの扱い
既存のファイルを上書きする必要が生じる場合があります。そのためには、PowerShell の Move-Item cmdlet とともに -Force パラメータを使用します。
シナリオ 1 – 宛先のファイルを上書きする
この cmdlet は test.txt ファイルを C:\Temp フォルダーから C:\Backup フォルダーへ移動し、同じ名前のファイルが宛先に存在する場合はそれを上書きします。
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
シナリオ 2 – 確認後に宛先のファイルを上書きする
ファイルを上書きする前に確認プロンプトを表示するには、-Confirm パラメーターを使用します。
- この cmdlet は、宛先フォルダーに既に PDF ファイルが存在する場合に確認プロンプトを表示します。
Move-Item -Path C:\Temp\*.pdf -Destination C:\Backup -Confirm -Force
- この cmdlet は、宛先フォルダーに test.txt ファイルが既に存在する場合に確認プロンプトを表示します。
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup -Confirm -Force
「Y」と入力して Enter を押すとファイルを上書きし、「N」と入力して Enter を押すとスキップします。
実行前にコマンドをテストする
Move-Item cmdlet と -WhatIf パラメーターを一緒に使用すると、結果を確認できます。つまり、cmdlet を実行した場合に何が起こるかを事前にチェックできます。このパラメーターでは cmdlet は実行されませんが、予期される結果は表示されます。そのため、cmdlet が意図されていない項目を移動しないことを確信できます。
シナリオ 1 – cmdlet を実行せずに期待される結果を確認する
この cmdlet は、Move-Item cmdlet を使用して C:\Temp フォルダー内のすべての項目を Backup フォルダーへ移動しようとしたときに表示される結果を示します。
Move-Item -Path C:\Temp\* -Destination C:\Backup -WhatIf
エラー処理とログ記録
PowerShell の Move-Item cmdlet を使用する場合、スクリプトが期待どおりに動作することを確認し、問題が発生した際にも容易に追跡・特定できるように、エラー処理とログ記録の実装を検討してください。PowerShell は次を提供します:
- エラー処理のための Try-Catch
- Write-Log:ログファイルに書き込む
Try-Catch による基本的なエラー処理
以下は、エラー処理付きでファイルを移動するための基本的な Try-Catch ブロックです:
Try {
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -ErrorAction Stop
} Catch {
Write-Output "Error moving file: $_"
}
以下が、知っておくべきポイントです。
- Try ブロックは Move-Item cmdlet を実行しようとします。
- -ErrorAction Stop パラメーターは、問題が発生した場合(たとえばファイルが存在しない、または権限の問題がある場合)に PowerShell に対して処理を停止し、エラーをスローしてから Catch ブロックに入るように指示します。
- -Catch ブロックは、Move-Item cmdlet がスローするエラーをキャッチします。
- Write-Output はエラーメッセージを表示します($_ にはエラーの詳細が含まれます)。また、Write-Output を Write-Log のようなログ記録関数に置き換えて、エラーをログファイルに保存することもできます。
-ErrorAction パラメーターは、エラーが発生した場合にどうするかを指定します。考えられる値は次のとおりです:
- 停止 – エラーが発生すると操作が停止します
- 続行 – エラーが発生しても操作は継続されます
- サイレントに続行 – 操作は何も表示せずにエラーを無視します
- 問い合わせ – エラーが発生するとユーザーに入力を促します
- 無視 – エラーを無視します
Active Directory グループ管理のベストプラクティス
詳しく見るPowerShell によるファイル管理のベストプラクティス
cmdlet を 1 つの送信元フォルダーと 1 つの送信先フォルダーに限定する
Move-Item cmdlet は、送信先にフォルダーやディレクトリ構造を作成しません。また、同じ名前の 2 つのファイルを、2 つの別々の送信元から同時に移動することもできません。したがって、cmdlet では送信元フォルダーを 1 つ、送信先フォルダーを 1 つ指定するのが最適です。
ファイルの整理方法を計画する
特にファイルを大量に移動する前に、ファイルの整理(構成)について明確に把握しておく必要があります。まず、ソースディレクトリはファイルとフォルダーが適切に管理されている状態にしておきましょう。そうすれば、項目を移動するときに「何が移動されるのか」を把握できます。次に、宛先(デスティネーション)のフォルダー構造を明確に定義しておくことで、すべての項目が意図したとおりに移動されます。これにより、移動した各ファイルを簡単に見つけられます。
サンプルデータで cmdlet をテストする
サンプルデータで Move-Item cmdlet をテストし、結果が期待どおりであることを確認してください。これにより、上書き(overwrites)や競合(conflicts)に関する見落としを防ぐのに役立ちます。
十分なサンプルデータがない、または時間を節約したい場合は、-WhatIf パラメーターを使用して、cmdlet を実際に実行せずに移動をシミュレーションしてください。こうすれば、変更を行う前に cmdlet やスクリプトをテストして結果を確認できます。
バックアップを保持する
予防措置として、Move-Item cmdlet を使用する前に、特に上書きされるものを含めて、すべての重要なファイルとフォルダーをバックアップしてください。後で混乱しないためです。
ログ記録とエラー処理を実装する
ログ記録とエラー処理は、想定外のエラーに対処するための有効な手段です。これらを実装することで、Move-Item 操作で発生したエラーを特定し、追跡できるようになります。
エラー処理には、cmdlet 内で -ErrorAction パラメーターを使用するか、try-catch ブロックを使用できます。
結論
PowerShell の Move-Item cmdlet は、ファイルの管理と整理に関してまるで魔法使いのような力を発揮します。基本となる構文がシンプルで、初心者から上級者まで幅広いユーザーに対応しており、パラメーターやスクリプトでさらに拡張していくことも可能です。単一ファイル、複数ファイル、隠しファイル、読み取り専用ファイルを別の場所へ移動できます。ディレクトリ全体をその中身ごと別の場所へ移動することも可能です。移動しながらファイル名を変更したり、上書きの扱いを処理したりと、さまざまなことができます。この cmdlet は、ファイル移動が確実で安全であることを保証するために、ロギングとエラーハンドリングもサポートしています。
Netwrix Directory Manager
よくある質問
移動先に同じ名前のファイルがすでに存在している場合はどうなりますか?
Move-Item cmdlet を使ってファイルを移動しようとしたときに、移動先に同じ名前のファイルがすでに存在している場合、次のいずれかが起こります:
- Move-Item cmdlet を -Force パラメーターなしで実行します:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt
cmdlet がエラーをスローし、ファイルは移動されません。
- -Force パラメーターを指定した場合:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
PowerShell は確認を求めずに、宛先のファイルを上書きします。これにより、宛先のファイルが移動しているファイルに置き換えられます。
詳細は Handle Overwrites セクションを参照してください。
一度に複数のファイルを移動できますか?
はい、PowerShell の Move-Item で可能です。次のことができます:
- 同じ拡張子のファイル、異なる拡張子のファイル、そしてソース ディレクトリのルートにあるすべてのファイルを移動できます。次の cmdlet を使って、ソース ディレクトリのルートにあるすべてのファイルを移動してください:
Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
詳細は「Move Multiple Files」セクションをご覧ください。
- ソース ディレクトリから同じ拡張子のすべてのファイルを再帰的に移動するには、次の cmdlet を使用します:
Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
詳細については、「Recursive File Moving」セクションを参照してください。
- この cmdlet を使用して、ソース ディレクトリをその内容すべてとともに移動します:
Move-Item -Path C:\Temp -Destination C:\Backup
詳細については、「Move a Directory」セクションを参照してください。
特定の属性を持つファイルを移動するにはどうすればよいですか?
Move-Item の cmdlet は、ファイル サイズ、更新日時などの特定の条件に基づいてファイルを移動できます。以下は、フィルターとして使用できる一般的な属性の一覧です:
- 非表示
- 読み取り専用
- アーカイブ
- 圧縮済み
- 暗号化済み
これらを Where-Object フィルターで使用して、指定した属性を持つファイルを対象にできます。また、Where-Object で -and または -or を使って複数の条件を組み合わせることで、複数の属性を持つファイルをフィルターできます。
詳細は「Filter Files(ファイルのフィルター)」および「Advanced Moving Scenarios(高度な移動シナリオ)」のトピックをご覧ください。
Move-Item を使って、異なるドライブ間でファイルを移動できますか?
結論から言うと、はい。ファイルは、宛先として指定した場所に移動されます。宛先が元のドライブと同じでも、別のドライブでも構いません。
Move-Item を使ってファイルを移動し、上書きするにはどうすればよいですか?
宛先のファイルを、移動しているファイルで上書きしたい場合は、Move-Item の -Force パラメーターを使用します。たとえば:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
PowerShell は確認を求めずに、Backup フォルダー内の test.txt ファイルを Temp フォルダーの test.txt ファイルで置き換えます。詳細は「Handle Overwrites」セクションを参照してください。
PowerShell を使って隠しファイルを移動するにはどうすればよいですか?
フォルダー、または同じ拡張子の複数ファイルを移動する場合、Move-Item コマンドレットは隠しファイルや読み取り専用ファイルを移動しません。-Force パラメーター付きの Get-ChildItem コマンドレットを使って出力に隠しファイルやシステム ファイルを含め、結果を Move-Item にパイプします。
たとえば、このコマンドレットを使って、隠しファイルを含むすべてのファイルを移動できます。
Get-ChildItem -Path C:\Temp\ -Force | Move-Item -Destination C:\Backup\
非表示ファイル(表示されるファイルではありません)だけを特定して移動するには、この cmdlet を使用します:
Get-ChildItem -Path C:\Temp\ -Force | Where-Object { $_.Attributes -match 'Hidden' } | Move-Item -Destination C:\Backup\
非表示ファイルをフィルターする条件を追加したため、この cmdlet は「Hidden」属性が設定されているファイルのみを移動します。
Move-Item を使用する際によくあるエラーは何で、どのようにトラブルシュートできますか?
以下に、よくあるエラーとその説明および解決策を示します。
ファイルはすでに存在します
ファイルまたはフォルダーを、同じ名前のファイルがすでに存在する宛先に移動しようとすると、次のエラーが表示されます:
Move-Item : Cannot create a file when that file already exists.
既存のファイルを上書きするには、-Force パラメーターを使用します。
Access Denied
ファイルを移動するために必要な権限がない場合、次のエラーが表示されます:
Move-Item : Access to the path 'C:\Path\to\file.txt' is denied.
その理由はさまざまです。たとえば、ファイルが保護されている、宛先フォルダーに管理者権限が必要である、またはファイルが別のプロセスによって使用中であるなどです。
問題を解決するには、必要な権限があることを確認してください。PowerShell は管理者として実行することを推奨します。さらに、ファイルが別のアプリケーションによって使用されていないことを確認してください。
他のプロセスによってファイルがロックされています
移動しようとしているファイルが別のプログラムまたはプロセスによって使用されている場合、次のエラーが表示されます:
Move-Item : The process cannot access the file because it is being used by another process.
問題を解決するには、ファイルを使用しているアプリケーションをすべて閉じてください。
パスが長すぎます
デフォルトでは、Windows の最大パス長は 260 文字であり、ソース パスまたは宛先パスがこの制限を超えると Move-Item は失敗します。PowerShell は次のエラーを表示します:
Move-Item : The specified path, file name, or both are too long.
この問題を解決するには、より短いディレクトリ名またはファイル名を使用するか、Windows 10/11 または Windows Server で Group Policy またはレジストリを介して長いパスのサポートを有効にします。
無効なパスまたはファイル名
ソース パスまたは宛先パスが正しくない、スペルが間違っている、または存在しない場合、次のエラーが表示されます:
Move-Item : Cannot find path 'C:\InvalidPath\file.txt' because it does not exist.
パスをもう一度確認してください。
宛先ディレクトリが存在しません
宛先ディレクトリが存在しない場合、次のエラーが表示されます:
Move-Item : Could not find part of the path 'C:\Backup\'
宛先ディレクトリが存在することを確認してください。存在しない場合は、ファイルを移動する前に作成してください。
ディレクトリを自分自身に移動する
PowerShell は、ディレクトリをそのサブディレクトリの1つに移動することを許可していません。その操作を試みると、次のエラーが表示されます:
Move-Item : Cannot move item 'C:\Temp\' to a subdirectory of itself, 'C:\Temp\Logs\'.
宛先が、ソース ディレクトリのサブフォルダーではないことを確認してください。
ファイルの内容に基づいてファイルを移動することは可能ですか?
単体の Move-Item cmdlet では、ファイルの内容に基づいてファイルを移動できません。ただし、Get-Content やその他のファイル読み取りメソッドを、条件ロジック(例:If-Else ステートメント)と組み合わせて使い、ファイルの内容を読み取ってからMove-Item を使って適切にファイルを移動できます。
特定の単語またはフレーズがファイルに含まれているかどうかをチェックするサンプル スクリプトです。含まれていれば、ファイルを移動します。
注: スクリプトを実行する前に、次の変更を行ってください:
- フィルターしたいコンテンツに合わせて、$searchString 変数を変更します。
- $sourceDirectory と $destinationDirectory を適切なパスに変更します。
$sourceDirectory = "C:\SourceFolder"
$destinationDirectory = "C:\DestinationFolder"
$searchString = "SpecificText"
# Get all files in the source directory
Get-ChildItem -Path $sourceDirectory -File | ForEach-Object {
$filePath = $_.FullName
# Read the content of the file
$content = Get-Content -Path $filePath
# Check if the file contains the search string
if ($content -match $searchString) {
# Move the file to the destination directory
$destinationPath = Join-Path -Path $destinationDirectory -ChildPath $_.Name
Move-Item -Path $filePath -Destination $destinationPath
Write-Host "Moved file: $filePath to $destinationPath"
}
else {
Write-Host "File does not contain search string: $filePath"
}
}
Get-ChildItem はソース フォルダー内のすべてのファイルを取得し、ForEach-Object は各ファイルを順に処理します。Get-Content は各ファイルの内容を読み取り、内容が指定した文字列と一致するかどうかを確認します。次に Move-Item により、その文字列を含むファイルが宛先フォルダーへ移動されます。
移動しようとしているファイルが存在しない場合、またはソース パスが無効な場合はどうなりますか?
いずれの場合でも、PowerShell はエラーをスローします。
Move-Item : Cannot find path 'C:\Temp\AppLog.txt' because it does not exist.
同様に、宛先パスのいずれかの要素が存在しない場合、cmdlet は失敗します。不足しているディレクトリや、パス内のいずれの要素も作成しません。
ファイルが存在するかどうかを確認するには、Test-Path を実行するのがよいでしょう。この cmdlet は、パスのすべての要素が存在する場合は $true を返し、いずれかが欠けている場合は $false を返します。
Test-Path -Path C:\Backups\AppLogs
False
共有する
もっと詳しく
著者について
Jonathan Blackwell
ソフトウェア開発責任者
2012年以降、エンジニアでありイノベーターである Jonathan Blackwell は、エンジニアリングのリーダーシップを通じて Netwrix GroupID を、Active Directory および Azure AD 環境におけるグループとユーザー管理の最前線に押し上げてきました。開発、マーケティング、営業での経験により、Jonathan は Identity 市場と買い手の考え方を深く理解できています。