1. ホーム
  2. scripting

[解決済み】文字列から任意のネイティブコマンドを実行する方法とは?

2022-04-07 06:11:57

質問

以下のようなシナリオで、私のニーズを表現することができます。 ネイティブコマンドとして実行される文字列を受け取る関数を作成します。

社内の他のコマンドラインユーティリティと連携して、そのまま実行できるコマンドを提供するのは、それほど突飛なアイデアではないでしょう。あなたはそのコマンドをコントロールできないので、次のことが必要です。 有効なコマンドを入力として受け入れる . 以上が、私が簡単に克服できない主なヒケツです。

  1. コマンドは、スペースが含まれるパスに住んでいるプログラムを実行するかもしれません。

    $command = '"C:\Program Files\TheProg\Runit.exe" Hello';
    
    
  2. コマンドには、空白を含むパラメータを指定することができます。

    $command = 'echo "hello world!"';
    
    
  3. コマンドはシングルとダブルの両方の刻みを持つ可能性があります。

    $command = "echo `"it`'s`"";
    
    

あるのか? 任意の これを実現するきれいな方法を教えてください。私は、贅沢で醜い回避策を考案することしかできませんでしたが、スクリプト言語としては、これは非常にシンプルであるべきだと感じています。

解決方法は?

Invoke-Expression というエイリアスもあります。 iex . 2 と 3 の例では、次のようになります。

iex $command

例1のように、exeが引用符で囲まれているため、そのままでは実行できない文字列もあります。これは、文字列の内容がそのままPowershellのコマンドプロンプトから実行するものであるため、そのまま動作します。

$command = 'C:\somepath\someexe.exe somearg'
iex $command

しかし、exe が引用符で囲まれている場合、その引用符の助けを借りる必要があります。 & この例のように、コマンドラインから実行させるようにします。

>> &"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"

そして、スクリプトでは

$command = '"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"'
iex "& $command"

おそらく、コマンド文字列の最初の文字が " この素朴な実装のように。

function myeval($command) {
    if ($command[0] -eq '"') { iex "& $command" }
    else { iex $command }
}

しかし、他のケースで別の方法で呼び出さなければならないものが見つかるかもしれません。そのような場合は、次のいずれかの方法で try{}catch{} 特定の例外タイプやメッセージのために、あるいはコマンド文字列を調べてください。

相対パスではなく、常に絶対パスを受け取るようにすれば、上記2つ以外の特殊なケースは、あったとしても、あまりないはずです。