#powershell
#powershell
Вопрос:
В моем коде я пытаюсь сохранить команду в строке; чтобы затем передать ее в качестве параметра в Invoke-Expression. Но переменная вычисляется перед
$command = "Get-Process | Where-Object { $_.Id -lt 1 }"
Invoke-Expression $command
Я пробовал: $$
, $
…
Комментарии:
1. я вижу, что на данный момент у вас есть 2 решения, так что это в сторону… НЕ используйте
Invoke-Expression
, если вы можете этого избежать. для обоснования этого посмотритеSQL injection
… это может стать неприятным, если вы не будете очень, очень , ОЧЕНЬ осторожны.
Ответ №1:
Символ escape-последовательности, который вы ищете, — это обратная метка ( `
)!
Из about_Quoting_Rules
раздела справки:
Чтобы предотвратить подстановку значения переменной в строку, заключенную в двойные кавычки, используйте символ возврата (`) (ASCII 96), который является escape-символом PowerShell.
"This string contains a `$dollar sign that won't be expanded"
В моем коде я пытаюсь сохранить команду в строке; чтобы затем передать ее в качестве параметра для Invoke-Expression
Как общее эмпирическое правило, не делайте этого — в конечном итоге вы передадите управление тем, какой код выполняется в вашем скрипте или функции, вызывающему пользователю.
В вашем примере должно быть достаточно простого выполнения кода напрямую:
Get-Process | Where-Object { $_.Id -lt 1 }
Если у вас есть конкретный вариант использования, без которого вы не можете придумать, как переписать, Invoke-Expression
тогда, пожалуйста, обновите вопрос с его помощью 🙂
Ответ №2:
Вы можете использовать typeacceletator [scriptblock]
для System.Management.Automation.ScriptBlock
и создать этот способ
C:> $command = [scriptblock]::Create('Get-Process | Where-Object { $_.Id -eq 3320 }')
C:> invoke-command $command
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
27 27,49 25,77 0,14 3320 1 ApplicationFrameHost
Ответ №3:
Вам следует заменить двойные кавычки "
на простые '
$command = 'Get-Process | Where-Object { $_.Id -lt 1 }'
Invoke-Expression $command