Sdílet prostřednictvím


Jak se vyhnout používání výrazu Invoke

Rutina Invoke-Expression by se měla používat jenom jako poslední možnost. Ve většině scénářů jsou k dispozici bezpečnější a robustnější alternativy. Fóra, jako je Stack Overflow, jsou naplněna příklady Invoke-Expression zneužití. Všimněte si také, že PSScriptAnalyzer má pravidlo pro toto. Další informace naleznete v tématu AvoidUsingInvokeExpression.

Pečlivě zvažte důsledky zabezpečení. Pokud je řetězec z nedůvěryhodného zdroje, jako je vstup uživatele, předán přímo Invoke-Expression, lze spustit libovolné příkazy. Vždy nejprve zvažte jiné, robustnější a bezpečnější řešení.

Obvyklé scénáře

Zvažte následující scénáře použití:

  • Je jednodušší přesměrovat PowerShell tak, aby prováděl něco přirozeně. Příklad:

    Get-Content ./file.ps1 | Invoke-Expression
    

    Tyto případy se dají triviálně vyhnout. Skript nebo kód již existuje ve formátu souboru nebo AST, takže byste měli napsat skript s parametry a vyvolat ho přímo místo použití Invoke-Expression v řetězci.

  • Spuštění skriptu z důvěryhodného zdroje Například spuštění instalačního skriptu z úložiště PowerShellu:

    Invoke-WebRequest https://aka.ms/install-powershell.ps1 | Invoke-Expression
    

    Měli byste ho používat jenom interaktivně. A i když to usnadňuje život, měla by být tato praxe odrazována.

  • Testování chyb analýzy Týmový tým PowerShell testuje chyby ve zdrojovém kódu pomocí, Invoke-Expression protože je to jediný způsob, jak převést chybu parse-time na modul runtime.

Závěr

Většina jiných skriptovacího jazyka má způsob, jak vyhodnotit řetězec jako kód a jako interpretovaný jazyk, musí mít PowerShell způsob, jak se dynamicky spouštět. Neexistuje ale žádný dobrý důvod k použití Invoke-Expression v produkčním prostředí.

Reference