Команда PowerShell Invoke-Expression может быть легко неправильно истолкована, когда и когда не использовать ее. В этой статье я собрал несколько часто задаваемых вопросов. Я разберу их и включу множество полезных примеров, на которые вы можете ссылаться, когда вам это понадобится. Это означает, что вы должны добавить эту страницу в закладки прямо сейчас!
Хотите больше советов? Посетите мой личный блог о 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
. Вместо использования определенного параметра через Invoke-Expression
, вы можете передавать параметры этого скрипта, передавая их так, как обычно делаете через консоль.
Если вы обычно вызываете этот скрипт так через консоль:
Вы должны включить всю эту строку в строку и затем передать эту строку параметру Command
.
Имеет ли смысл использовать try/catch с Invoke-Expression?
Не совсем. Это означает, что вам нужно использовать обработку ошибок внутри параметра Command
.
Пример:
В чем разница между Invoke-Expression и оператором вызова (&
)?
Оператор вызова (&) отлично подходит для быстрого выполнения команды, скрипта или блока скрипта. Однако оператор вызова не разбирает команду. Он не может интерпретировать параметры команды, как это делает Invoke-Expression.
Например, предположим, я хочу получить процесс PowerShell Core с использованием командлета Get-Process
с помощью кода 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 Remoting, предоставляя вам возможность вызывать код локально или удаленно на компьютерах.
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.
Пример:
Какие некоторые bewst практики для выполнения нескольких команд/выражений?
Если у вас есть несколько команд для выполнения, даже если Invoke-Expression
принимает только строку вместо массива, мы можем использовать канал PowerShell для отправки объектов по одному вниз по каналу.
Пример:
Как использовать Invoke-Expression
с пользовательским вводом?
Вы должны быть очень осторожны при использовании Invoke-Expression с пользовательским вводом. Если вы разрешите пользователю запросить доступ за пределы команды, которую вы намереваетесь выполнить, это может создать нежелательную уязвимость. Вот один из способов безопасного использования пользовательского ввода с Invoke-Expression
.
Вывод
У каждого cmdlet’а есть своё место, и Invoke-Expression
– один из тех, с которыми почти каждый когда-то столкнется. Важно понимать плюсы и минусы часто используемых cmdlet’ов, чтобы использовать их таким образом, который обеспечивает ваш успех. Меня интересует, как вы использовали Invoke-Expression
, чтобы решить некоторые из своих собственных проблем. Поделитесь своей историей в комментариях ниже!
Хотите больше советов в этом роде? Проверьте мой личный блог PowerShell по адресу: https://www.nkasco.com/