В каком сценарии был разработан Invoke-Expression?

9/10 раз, если вы пытаетесь использовать Invoke-Expression Командлет, есть лучший способ. Создание аргументов команды динамически? Используйте массив аргументов. Создание аргументов для командлета? Используйте splatting с массивом или хеш-таблицей. У вашей команды есть пробел на пути к ней? Используйте оператор вызова (&).

Это может показаться открытым, но Invoke-Expression это легко доступный командлет, где ответ почти всегда заключается в том, чтобы никогда не использовать его. Но командлет существует по какой-то причине, не считается устаревшим, и большинство критических замечаний по поводу его использования говорят о чем-то вроде "это почти никогда не правильный ответ", но никогда не указывают, когда его можно использовать. В каком случае это приемлемо для использования Invoke-Expression? Или сказать это немного менее открыто, как было Invoke-Expression предназначен для использования?

1 ответ

Решение

Приведу цитату из сообщения в блоге команды PowerShell под названием Invoke-Expression, которое считается вредным (выделение добавлено):

Итог: Invoke-Expression - мощная и полезная команда для некоторых сценариев, таких как создание новых сценариев во время выполнения, но в целом, если вы обнаружите, что используете Invoke-Expression, вы должны спросить себя или, возможно, уважаемого коллегу, есть ли лучший способ.

EBGreen отмечает:

Или, если сформулировать это иначе, It [Invoke-Expression] можно использовать, если пользователь никогда не участвует ни в какой части генерации строки, которая будет вызвана. Но даже тогда, если вы не будете использовать его, вы получите лучшие привычки, чем его использование.

Короче:

  • Как правило, всегда сначала рассматривайте другое (обычно более надежное и безопасное) решение.

  • Если вы найдете это Invoke-Expression Это ваш единственный выбор, внимательно рассмотрите последствия для безопасности: если строка из (ненадежного) внешнего источника (например, пользовательский ввод) передается непосредственно Invoke-Expression могут быть выполнены произвольные команды.

Примечание. Начиная с Windows PowerShell v5.1 / PowerShell Core v6.1.0, официальный Invoke-Expression раздел справки не дает такого руководства; эта проблема GitHub предлагает исправить это.


Редкие примеры обоснованного (безопасного) использования Invoke-Expression:

Другие вопросы по тегам