1

В ответ на этот вопрос, оригинальный запросчик хотел знать

Есть ли способ в PowerShell после ввода длинной или сложной команды зафиксировать эту команду в буфере истории, но не выполнить ее?

Мое решение, однако, было чисто для развлечения, но я удивлялся, как / почему оно работает на бэкэнде.

Ответ

$VariableName = "Windows Command"

Затем выполнить:

Invoke-Expression "$VariableName"

Пример с Ping:

Я также смог использовать выражения PowerShell точно таким же образом:

PS H:> $ Outlooks = "Get-Process -Name Outlook -Verbose | fl StartTime, Threads"
PS H:> Invoke-Expression "$ Outlookks"

Моя теория

По сути, я считаю, что происходит то, что мы создаем строку для первой переменной (именно так, как она выглядит, прямо), а затем, когда мы вызываем нашу переменную внутри "", это заставляет интерпретатор расширять переменную, вызывая ее чтобы вызвать правильную команду.

Мое понимание того, как это работает точно? Рекомендации предпочтительнее.

1 ответ1

2

Да, похоже, именно это и происходит (кстати, вам даже не нужны кавычки вокруг командной строки при вызове).

В соответствии с описанием справки командлета (полученного с помощью get-help Invoke-Expression -full):

iex [-Command] <String> [<CommonParameters>]
Invoke-Expression [-Command] <String> [<CommonParameters>]

Командлет Invoke-Expression оценивает или запускает указанную строку как команду и возвращает результаты выражения или команды. Без выражения-выражения строка, переданная в командной строке, будет возвращена (отражена) без изменений.

Выражение - это оператор, который может быть оценен и дает результат, например команда Windows PowerShell.

Если команда, хранящаяся в строковой переменной, не слишком сложна, вы также можете использовать оператор вызова (&) следующим образом:

& $string

Дальнейшие подробности предоставлены этой страницей:

Если результатом выражения является пустой массив, invoke-выражение выведет $ null

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .