如何在powershell中扩展变量?

时间:2016-12-01 16:15:10

标签: powershell

Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="C:"'

做我想要的,

$var="C:"
Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="{$var}"'

什么都不做。我试图改变引号,连接字符串和其他1000个东西,但它们没有用。为什么上面的例子不起作用,什么会起作用?

3 个答案:

答案 0 :(得分:4)

当您使用'(单引号)启动字符串文字时,您将创建一个逐字字符串 - 也就是说,字符串中的每个字符都按字面解释,并且变量引用和表达式不会扩展!

如果要扩展变量,请使用"

$var = 'C:'
Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='$var'"

如果您的变量名称有奇怪的字符,或后跟一个单词字符,您可以在 {}之后立即使用大括号$限定变量名称​​ < / p>

$var = 'C:'
Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='${var}'"

答案 1 :(得分:1)

例如,如果您要从具有选择字符串的文件中获取数据,则返回值为单引号字符串。如果该字符串包含变量,它们将不会扩展。如果变量是干净的,则可以使用Invoke-Expression-不与其他文本混合:

$abc = 123
$a = '$abc'
iex $a -> 123

如果变量是路径名的一部分,则此方法无效。 使用$ ExecutionContext.InvokeCommand.ExpandString($ var)

$path = '$Home/HiMum'
$ExecutionContext.InvokeCommand.ExpandString($path)
-> /home/JoeBlogs/HiMum

您在Windows上幸运的草皮也许可以使用Convert-String将单打更改为双打。

答案 2 :(得分:0)

在PowerShell中找不到扩展表达式,但这就是我发现的内容。

# Let's set some varaible
$ComputerName = 'some-value'

# Let's store this variable name
$name = 'ComputerName'

# Get value by `Get-Item`.
(Get-Item variable:$name).Value # throws an exception for undefined variables.

# Get value by `Invoke-Expression`
Invoke-Expression "`$variable:$name"
Invoke-Expression "`$$name"

# The same but for environment variables
(Get-Item env:$name).Value # throws an exception for undefined environments.
Invoke-Expression "`$env:$name"

我更喜欢Get-Item,因为它“大声失败”。

并且Get-Item允许使用其他文字以及Invoke-Expression
请参见下面的someString文字。

(Get-Item variable:someString$name).Value
(Get-Item env:someString$name).Value