PowerShellのファイルパスにスペースが含まれると処理が失敗する場合、文字列の引用符と、実行コマンドの引数区切りを確認します。パスのスペース自体が禁止されているわけではありません。

パスのスペースとワイルドカードを区別する

  • スクリプト内部でC:\Program Files\...のようなパスを引用符なしで書いていないか確認します。
  • コマンドを文字列連結で組み立てていないか調べます。
  • ワイルドカードを意図して使うPathと、文字どおりに扱うLiteralPathを区別します。
  • タスクスケジューラの「プログラム」と「引数」に別々の値を入れているか確認します。

LiteralPathや呼び出し演算子を選ぶ

  1. テスト用ファイルをスペースのあるフォルダへ置きます。
  2. PowerShellの引数には-LiteralPath "C:\Work Files\data.csv"のように、値を1つの文字列として渡します。
  3. 外部プログラムを起動する場合、PowerShellの呼び出し演算子&や引数配列を使って意図を明確にします。
  4. タスクスケジューラでは実行ファイル、-File引数、スクリプトパスの引用符を確認します。
  5. エラーログへ実際に解決されたパスを記録し、対象ファイルの存在を確認します。

パスをInvoke-Expressionで文字列実行しない

  • パス全体を単純につなげた文字列をInvoke-Expressionで実行する方式は避けます。
  • 正しい引用符でも、アクセス権がない場合は失敗します。
  • スクリプトファイルと対象データファイルが別の場所にある場合、相対パスを使わない方が安全です。

スペースを含むフォルダーでパス解決する

  • スペースあり・なし両方のフォルダで同じ処理が成功するか確認します。
  • 本番処理が書き込む前に読み取り専用でパス解決できることを確認します。

スペースを含むパスの例

C:\Users\利用者名\My Documents\report.csvのようにスペースを含むパスを扱う場合は、文字列として引用符で囲みます。PowerShellでファイル名を文字列として指定するコマンドレットなら**-LiteralPathでワイルドカード展開を抑える**方法が使えます。*や[がファイル名に含まれる場合も、単なる-Pathより意図を明確にできます。

実行ファイルのパスを変数に格納して起動する場合は、文字列をそのまま書くだけでは実行されないため、必要に応じ呼び出し演算子&と引数を分けます。エラーの直前にパスとコマンドの解釈結果をログへ出し、引用符不足なのかアクセス権不足なのかを見分けてください。

引用符と実行演算子の違い

文字列のパスを読み取るならGet-Item -LiteralPath 'C:\Work Files\data.csv'などを使います。PowerShellの実行ファイルパスが変数に入っている場合は、たとえば$exe = 'C:\Program Files\MyTool\tool.exe'とした上で、& $exe --helpのように呼び出し演算子で起動します。これは使うソフトが--helpに対応する場合だけの例です。変数をInvoke-Expressionで組み立て直して実行しないでください。

参考資料

おすすめの記事