Как экранировать переменную в строке, PowerShell

#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