私のPSスクリプトでは、次のようにして、別のPSインスタンスで別のスクリプトを実行できるようにしたいと考えています。
$filepath = Resolve-Path "destruct.ps1"
start-process powershell.exe "$filepath"
destruct.ps1は、このスクリプトと同じフォルダーにあります
ただし、スペースを含む場所( "C:\ My Scripts \")でこのスクリプトを実行すると、次のエラーが発生します。
「C:\ My」という用語は、コマンドレット、関数、操作可能なプログラム、またはスクリプトファイルとして認識されません。用語を確認して再試行してください。
Invoke-Expressionメソッドで「&」を使用するとこの問題が解決することを知っていますが、start-processメソッドを使用して同じことを行うにはどうすればよいですか?
助けてくれてありがとう!
これを試して:
start-process -FilePath powershell.exe -ArgumentList "-file `"$filepath`""
コメント後に編集:
start-process -FilePath powershell.exe -ArgumentList "-file `"$($filepath.path)`""
サイドノート:
$filepath
は[pathinfo]
タイプであり、[string]
タイプではありません。
エスケープされた二重引用符を追加して、引用符で囲まれた引数を渡すことができます。
"`"$filepath`""
私はここで一般的なシナリオに答えています。
PowerhsellからC:\Program Files
などのフォルダに移動する必要がある場合、次のコマンドはパスの間に空白があるため機能しません。
cd C:\Program Files
代わりに、以下のように二重引用符でパスを埋め込みます。
cd "C:\Program Files"
ファイル名にはスペースが含まれている可能性があるため、フルパスでスペースを保持します。
Notepad ++ execコマンド:
"C:\ Windows\system32\WindowsPowerShell\v1.0\powershell.exe" "&\" $(FULL_CURRENT_PATH)\ ""
コマンドプロンプトから同じ:
"C:\ Windows\system32\WindowsPowerShell\v1.0\powershell.exe" "&\" C:\ a_work\Systems\name with space.ps1\""
[string] $ shipno(パスとファイル名)がスペースを含めて入力された場合に備えて、次の方法で-FilePathに正常に渡すことができます。
if ($shipno.contains(" ") -eq $true) {
$shipno = """" + $shipno + """"
}