次の方法で共有


Invoke-Expression の使用を避ける

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 を使用する正当な理由はありません。

リファレンス