0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerShellで`cmd`を使ったスペースを含むパスの正しいエスケープ方法

Posted at

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を利用し、スペースを含むパスを扱う際は、以下のポイントを守るとエラーを防げます:

  1. バッククォート (`) を使用してダブルクォートをエスケープ
  2. スペースを含むパス全体をダブルクォートで囲む

これにより、コマンドが正しく解釈され、エラーなく実行されるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?