名前にアンパサンドを含むアイテムに対してエクスプローラーのコンテキスト メニューから PowerShell スクリプトを実行する

名前にアンパサンドを含むアイテムに対してエクスプローラーのコンテキスト メニューから PowerShell スクリプトを実行する

私は、この答えWindows のファイル エクスプローラーにコンテキスト メニュー項目を作成し、特定のフォルダーに対して PowerShell スクリプトを実行できるようにします。

コマンドは次のようになります。

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \"%1\" | clip" 

これは、フォルダー名にアンパサンド (&) が含まれている場合を除いて正常に動作します。その場合、次のエラーが発生します (ターゲット フォルダーの名前は ですTesting & Testing)。

The string starting:
At line:1 char:37
+ C:\PowerShellScript\folder_script.ps1  <<<< "E:\tmp\Testing
is missing the terminator: ".
At line:1 char:53
+ E:\Dropbox\PowerShell\namefixer.ps1 "E:\tmp\Testing  <<<<
    + CategoryInfo          : ParserError: (E:\tmp\Testing :String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

明らかに何かがアンパサンドを特殊文字として解釈していますが、これを修正する方法がわかりません。フォルダー名からアンパサンドを削除することは、私にとっては実行可能な解決策ではありません。

バッチ スクリプトを必要としないソリューションが望ましいでしょう。

PowerShell 2 を搭載した Windows 7 Enterprise (64 ビット) を使用しています。

答え1

あなたは逐語的マーカーPowershell の : は--%、その後に続くものを解釈しないよう Powershell に指示します。

この場合、コマンドは次のようになります。

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 --% \"%1\" | clip" 

ファイル名に二重引用符が含まれていなければ、問題ありません。

このマーカーは Powershell 3.0 の新機能なので、必ず最新の状態にしてください。

答え2

PowerShell スクリプトを変更してみてください。そして、コマンド ラインをバッチ ファイルに変更します...

バッチ (runner.cmd)

set ps_arg="%~1"
@cd /d %~dp0
PowerShell "folder_script.ps1 | clip"

2 行目は、runner.cmd ファイルがあるフォルダーを現在のフォルダーとして設定し、フル パスなしで PowerShell スクリプトを実行できるようにすることを意味します。runner.cmd ファイルを編集する必要がないため、移動が簡単になります。

スクリプト内で次のようにパスにアクセスします。

$value = $env:ps_arg -replace """",""

バッチ ファイルからの引用符は PowerShell スクリプトに渡されるようで、削除する必要があるため、 となります-replace """",""。二重引用符は Windows ファイル名では無効であるため、これによって重要なものが削除されることはありません。

コマンドラインは次のようになります

cmd /K runner.cmd "%1"

答え3

これは引用符の問題です。エスケープされた二重引用符をエスケープされた一重引用符に置き換えて、コマンドを次のようになります。

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \'%1\' | clip"

2 つの異なるプログラム (cmd と powershell) を使用して、引数を取ることができる 3 つの異なるコード (cmd、powershell、および .ps1 スクリプト) を実行しています。

cmd には、/K Powershell と powershell の引数の 3 つの引数が必要です。powershell の引数は 1 つの文字列である必要があるため、引用符で囲みます。

Powershell には、実行するコマンド ラインという 1 つの引数が必要です。

.ps1 スクリプトには、実行対象のフォルダーという引数が必要です。Powershell はパスを単一の文字列として解釈する必要があるため、引用符で囲む必要があります。

コマンドを実行すると、cmd は Powershell を起動し、変数が展開され、引用符やエスケープ文字が削除された引用符付き文字列を送信します。C:\PowerShellScript\folder_script.ps1 "Testing & Testing" | clip

引用符により、スクリプトは 3 つの引数ではなく 1 つの引数を認識するようになります。

(異なるタイプの引用符で異なる結果が生成された理由はわかりませんが (私の知る限り、異なる結果になるはずはありません)、テストしたときに結果が生成されたため、私のシステムで機能したソリューションを提供しました。詳細を提供していただければ、あなたにも機能するソリューションを提供できるかもしれません。)

関連情報