Invoke-Expression PowerShellコマンドレットは、使用する場合と使用しない場合を誤解しやすいものです。この記事では、いくつかのトップFAQをまとめました。それらを分解し、必要に応じて参照できるように、たくさんの有用な例を含めました。ですので、今すぐこのページをブックマークしてください!
このようなヒントがもっと欲しいですか?私の個人的なPowerShellブログもチェックしてみてください:https://www.nkasco.com/
Invoke-Expression
とは何ですか?
公式の説明(Microsoftによる)によると、「Invoke-Expression
コマンドレットは、指定した文字列を評価または実行し、式またはコマンドの結果を返します。 Invoke-Expression
を使用しないと、コマンドラインに提出された文字列は変更されずに返されます(エコーされます)」となっています。
言い換えると、スクリプト内のコードを呼び出すためや、後で実行するためのコマンドを構築するために便利です。また、ユーザーからの入力と慎重に組み合わせて使用することもできます。
Invoke-Expression
の使用のもっとも基本的な例は、スクリプトを定義し、その文字列をCommand
パラメータに渡すことです。そして、Invoke-Expression
はその文字列を実行します。
スクリプトのパスにスペースがある場合はどうすれば良いですか?
文字列をシングルクォーテーションまたはダブルクォーテーションで囲んでください。
例えば、パスにスペースが含まれる文字列を実行したい場合、これらのオプションは機能しません:
なぜなら、これはPowerShellコンソールに直接入力するのとまったく同じだからです:
ただし、パスの部分をシングルクォーテーションまたはダブルクォーテーションで囲み、全体の文字列を引用符で囲むと、Invoke-Expression
は期待どおりにスクリプトを実行します。
Q. How do you pass parameters to scripts invoked with Invoke-Expression
?
Invoke-Expression
にはCommand
という唯一のパラメーターがあります。パラメーターをInvoke-Expression
で直接渡す方法はありません。ただし、代わりに、Command
パラメーターに渡す文字列にパラメーターを含めることができます。
たとえば、Path
とForce
という2つのパラメーターを持つスクリプトがあるとします。このスクリプトを通常のコンソール経由で呼び出す場合、
次のような形でスクリプトを呼び出す場合、
その行全体を文字列で囲み、その文字列をCommand
パラメーターに渡す必要があります。
Invoke-Expressionとtry/catch文を組み合わせて使用することはあまり意味がありません。
代わりに、エラーハンドリングはCommand
パラメータ内で行う必要があります。
例:
Invoke-Expressionと呼び出し演算子(&
)の違いは何ですか?
呼び出し演算子(&)は、コマンド、スクリプト、またはスクリプトブロックを素早く実行するために使用できます。ただし、呼び出し演算子はコマンドを解析できません。これに対して、Invoke-Expressionはコマンドパラメータを解釈することができます。
例えば、Get-Process
コマンドレットを使用してPowerShell Coreプロセスを取得したい場合、Get-Process -ProcessName pwsh
というコードを使用します。呼び出し演算子を使用してGet-Process
とパラメータを連結すると、期待どおりに動作しません。
しかし、Invoke-Expression
を使ってこの文字列を実行すると、期待どおりに動作します。
Invoke-ExpressionとStart-Processの違いは何ですか?
Start-Process
コマンドレットは、返されたオブジェクトに戻り値または終了コードを提供します。呼び出されたプロセスが完了するのを待つことができ、異なるWindowsの資格情報でプロセスを起動することもできます。Invoke-Expression
は素早く簡単ですが、Start-Process
は実行されたプロセスの結果を解釈するのにより便利です。
Invoke-Expression
とInvoke-Command
の違いは何ですか?
Invoke-Expression
は文字列を実行可能なコードに「変換」するだけです。一方、Invoke-Command
はPowerShellリモーティングを活用し、ローカルまたはリモートのコンピュータ上でコードを実行する能力を提供します。
Invoke-Command
は、実行するコマンドを今書いている場合に好まれます。IDEでインテリセンスが保持されるためです。一方、Invoke-Expression
は現在のスクリプト内から別のスクリプトを呼び出す場合に好まれます。
例:
Invoke-Expression
とInvoke-Item
の違いは何ですか?
Invoke-Item
コマンドは、デフォルトアクションでドキュメントを複数のパスで開くためのインラインサポートを提供します。追加のセキュリティのための確認や、含める、除外する、資格情報を追加するためのパラメータも用意されています。
Invoke-Expressionは安全ですか?
A. If someone had malicious intent they might be able to trick some virus programs by masking malicious code that constructs itself during runtime. Invoke-Expression
will happily execute whatever text is passed to it’s Command
parameter.
例:
複数のコマンド/式を実行するためのベストプラクティスは何ですか?
複数のコマンドを実行する場合は、Invoke-Expression
は文字列ではなく配列を受け入れることはできませんが、PowerShellパイプラインを使用してオブジェクトを1つずつパイプラインに送信することができます。
例:
Invoke-Expression
をユーザー入力とともに使用する方法はどうすればいいですか?
ユーザー入力とInvoke-Expression
を安全に組み合わせるためには注意が必要です。ユーザーにプロンプトを提供し、意図したコマンドの範囲外にアクセスできるようにすると、望ましくない脆弱性が発生する可能性があります。次のようにして、Invoke-Expression
を安全に実装する方法があります。
結論
各コマンドレットにはそれぞれの役割があり、Invoke-Expression
もほぼすべての人がある時点で遭遇するものです。よく使用されるコマンドレットの利点と欠点を理解し、成功への道筋を立てる方法で実装することが重要です。あなた自身の課題を解決するためにInvoke-Expression
をどのように使用したか興味がありますので、以下にコメントを残してストーリーを共有してください!
このようなヒントをもっと見たいですか?私の個人的なPowerShellブログをチェックしてください:https://www.nkasco.com/