【PowerShell】エクスプローラーで選択中のファイルを取得して処理する方法

【PowerShell】エクスプローラーで選択中のファイルを取得して処理する方法 PowerShell

PowerShellではファイルを指定して処理を行うことが可能ですが、エクスプローラーでユーザーが選択中のファイルをそのまま取得して利用したいという場面もあります。本記事では、エクスプローラー上で選択されているファイルのパスをPowerShellで取得し、それに対して処理を行う方法を紹介します。

エクスプローラーの選択情報は基本的に取得できない

PowerShell単体では、エクスプローラーの選択中のファイルを直接取得する方法は提供されていません。理由として、PowerShellは独立したプロセスであり、エクスプローラーのインスタンスや選択状態にアクセスする手段が標準では存在しないためです。

ただし、**Shell.Application COMオブジェクト**を利用することで、ある程度の制御や情報取得が可能になります。

Shell.Applicationを使って選択中のファイルを取得する

以下のスクリプトは、エクスプローラーのウィンドウで選択中のファイルを取得し、そのパスを出力する例です。

$shellApp = New-Object -ComObject Shell.Application
$explorerWindows = $shellApp.Windows()

foreach ($window in $explorerWindows) {
    $selectedItems = $window.Document.SelectedItems()
    foreach ($item in $selectedItems) {
        Write-Output $item.Path
    }
}

このスクリプトでは、現在開いているすべてのエクスプローラーウィンドウを走査し、選択されているファイル・フォルダのパスを取得します。取得したファイルに対して、さらに処理を加えることが可能です。

取得したファイルに対して任意の処理を行う

たとえば、取得したファイルをバックアップフォルダにコピーしたい場合、以下のように処理を追加します。

$backupDir = "C:\Backup"

foreach ($window in $shellApp.Windows()) {
    foreach ($item in $window.Document.SelectedItems()) {
        $sourcePath = $item.Path
        $fileName = [System.IO.Path]::GetFileName($sourcePath)
        $destPath = Join-Path $backupDir $fileName
        Copy-Item -Path $sourcePath -Destination $destPath -Force
        Write-Host "Copied: $sourcePath to $destPath"
    }
}

このように、選択中のファイルを対象にした自動処理も可能となります。

注意点と制限事項

この方法には以下のような注意点があります。

  • PowerShellスクリプトは**ユーザーと同じセッションで実行する必要**があります(リモートや管理者セッションでは動作しないことがある)
  • エクスプローラーが複数開いている場合、それぞれのウィンドウの選択内容を取得します
  • 何も選択されていないウィンドウでは処理は行われません

まとめ

PowerShellでは標準機能としてエクスプローラーの選択情報を取得することはできませんが、Shell.Application COMオブジェクトを活用することで可能になります。この方法を活用すれば、ファイル操作の自動化やユーザー操作との連携が実現でき、より実用的なスクリプトを構築できます。