スクリプトと同じ場所にCSVを置いたのに、起動するフォルダーを変えたら「見つかりません」と出る。相対パスの基準がスクリプトの場所ではなく、現在の作業場所になっている可能性があります。
PowerShellの$PSScriptRootは、実行しているスクリプトが置かれたフォルダーを示す自動変数です。そこへJoin-Pathでファイル名をつなげれば、起動する場所が変わっても、同じ入力先を指定できます。
スクリプトと入力例を置く
練習用の新しいフォルダーへread-practice.ps1とpractice.csvを置きます。CSVは次の2行です。顧客などの実データは使わず、架空のIDと名前にします。
id,name
A01,練習データ
read-practice.ps1には次の内容を保存します。対話画面へ1行ずつ貼る例ではなく、.ps1ファイルとして実行するためのコードです。
$inputFile = Join-Path $PSScriptRoot 'practice.csv'
if (-not (Test-Path -LiteralPath $inputFile -PathType Leaf)) {
throw 'スクリプトと同じ場所にpractice.csvを置いてください'
}
$rows = @(Import-Csv -LiteralPath $inputFile -Encoding UTF8)
if ($rows.Count -ne 1 -or $rows[0].id -ne 'A01') {
throw '練習用CSVの内容を確認してください'
}
$rows[0].name
期待する表示は「練習データ」です。存在確認を先に行い、ファイルがなければ別の場所にある同名ファイルへ進みません。-LiteralPathを使い、パスに含まれる記号をワイルドカードとして読み替えないようにもしています。
起動する場所を二つ変える
まずスクリプトのある場所から起動し、次に別のフォルダーへ移って、スクリプトのフルパスを指定して起動します。どちらでも同じ入力CSVを読めるかを確認してください。PowerShellでパスに空白がある実行ファイルを呼ぶときは、引用符と呼び出し演算子&を使います。
& 'C:\練習場所\read-practice.ps1'
このパスは説明用です。自分が練習ファイルを置いた場所に替えて使います。スクリプト内でSet-Locationを繰り返して場所を合わせるより、読むファイルの絶対パスを作ることで、他の処理の作業場所へ影響を与えずに済みます。
対話画面とファイルの違い
$PSScriptRootはスクリプトの場所を表すための値です。対話画面へ断片だけを貼ったとき、同じように使えると決めないでください。起動方法を調べる際は、現在地を表すGet-Locationの結果と、スクリプトの所在を区別して見ます。
日本語を含む.ps1をWindows PowerShell 5.1で使う場合は、スクリプトの文字コードにも注意します。この例を両方の環境で試すため、練習用のスクリプトはUTF-8のBOM付きで保存します。CSV側はImport-Csv -Encoding UTF8と読み方を指定しています。
実行ユーザーの権限は残る
パスが同じになっても、その場所を読む権限があるとは限りません。タスクスケジューラから実行する場合は、起動するユーザーとアクセスできる場所も確かめます。共有フォルダーが接続されているか、ネットワークの状態が同じかという条件も別です。
この確認はローカルの練習ファイルを二つの作業場所から読んだ範囲です。入力先を固定できたら、同名ファイルの取り違えがないかと、保存先が別の場所へずれていないかも確認します。読み取りと書き出しの両方を、実際に使う起動方法で見比べてください。
関連する記事
pathlib入門|Windowsでも迷いにくいファイルパスの扱い方
WindowsタスクスケジューラでPythonを定期実行する方法
公式資料
about_Automatic_Variables – PowerShell | Microsoft Learn
Get-Item (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
