PowerShellでcmd
を利用してスペースを含むパスを使用する際、適切にエスケープしないと以下のようなエラーが発生することがあります:
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
これは、パス中のスペースがある箇所が適切に処理されず、cmd
がそれを1つの引数として認識できないために起こります。本記事では、この問題の解決方法を解説します。
例: PostgreSQL のサービスを起動する場合
問題のスクリプト例
以下は、問題のあるスクリプトの例です:
cmd /c "C:\Program Files\PostgreSQL\16\bin\pg_ctl.exe" -D "C:\Program Files\PostgreSQL\16\data" start
このスクリプトでは、C:\Program Files
のようなスペースを含むパスが適切にエスケープされていないため、エラーが発生します。
解決策
PowerShellでは、バッククォート (`) を使ってダブルクォートをエスケープする 必要があります。修正したスクリプトは以下のようになります:
cmd /c "`"C:\Program Files\PostgreSQL\16\bin\pg_ctl.exe`" -D `"C:\Program Files\PostgreSQL\16\data`" start"
解説
エスケープのルール
-
**バッククォート (
)**: PowerShellでは、ダブルクォート (
"`) を文字列として扱う場合、バッククォートを使ってエスケープします。- 例:
"
→`"
- 例:
-
cmd コマンド内のスペース:
cmd
に渡すパスや引数にスペースが含まれる場合、全体をダブルクォート ("
) で囲む必要があります。
コマンド全体の構成
修正後のスクリプトを実行すると、以下のコマンドが cmd
に正しく渡されます:
"C:\Program Files\PostgreSQL\16\bin\pg_ctl.exe" -D "C:\Program Files\PostgreSQL\16\data" start
cmd
はスペースを含むパスを1つの引数として正しく認識し、エラーが解消されます。
応用: 他のコマンドでも活用
この方法は、PostgreSQLに限らず、cmd
を使用してスペースを含むパスを渡すすべてのシナリオで有効です。たとえば、以下のようなケースにも応用できます:
cmd /c "`"C:\Program Files\SomeApp\app.exe`" /arg1 /arg2"
まとめ
PowerShellでcmd
を利用し、スペースを含むパスを扱う際は、以下のポイントを守るとエラーを防げます:
- バッククォート (`) を使用してダブルクォートをエスケープ。
- スペースを含むパス全体をダブルクォートで囲む。
これにより、コマンドが正しく解釈され、エラーなく実行されるようになります。