Invoke-Expression
コマンドレットは、最後の手段 としてだけ使用してください。 多くのシナリオでは、より安全で堅牢な代替があります。 Stack Overflow などのフォーラムには、Invoke-Expression
の誤用の例があります。 また、PSScriptAnalyzer にはこれに対する規則もあります。 詳細については、「AvoidUsingInvokeExpression」を参照してください。
セキュリティへの影響を慎重に検討してください。 ユーザーによる入力などの信頼されていないソースから文字列を直接 Invoke-Expression
に渡すと、任意のコマンドを実行できます。 常に、最初は別のより堅牢で安全なソリューションを検討してください。
一般的なシナリオ
以下のような使用シナリオが考えられます。
PowerShell をリダイレクトして自然に何かを実行する方が簡単である。 次に例を示します。
Get-Content ./file.ps1 | Invoke-Expression
このようなケースは簡単に回避できます。 スクリプトまたはコードはファイルまたは AST 形式に既に存在するため、パラメーターを使用してスクリプトを記述し、文字列で
Invoke-Expression
を使用する代わりに直接呼び出す必要があります。信頼できるソースからのスクリプトの実行。 たとえば、PowerShell リポジトリからインストール スクリプトを実行するとします。
Invoke-WebRequest https://aka.ms/install-powershell.ps1 | Invoke-Expression
これは対話形式でのみ使用する必要があります。 これで労力は少なくなりますが、この方法はお勧めしません。
解析エラーのテスト。 PowerShell チームは、
Invoke-Expression
を使用してソース コードの解析エラーをテストします。これが、解析時エラーをランタイム エラーに変換する唯一の方法であるためです。
まとめ
他のほとんどのスクリプト言語には、文字列をコードとして評価する方法があり、PowerShell には、解釈された言語として、それ自体を動的に実行する方法が必要です。 ただし、運用環境で Invoke-Expression
を使用する正当な理由はありません。
リファレンス
- Stack Overflow ディスカッション - Invoke-Expression が使用されるように設計されているのはどのようなシナリオか
- PowerShell ブログ記事 - 有害と見なされる Invoke-Expression
PowerShell