如何在PowerShell中展开变量?

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

做到我想要的功能,

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

什么都没做。我尝试更改引号,连接字符串和其他1000种方法,但它们都没有起作用。为什么上面的示例不起作用,什么方法可以起作用?


"-Filter "DeviceID='$var'""(注意过滤器字符串周围的双引号) - Mathias R. Jessen
@MathiasR.Jessen 如您所提到的,我尝试了反转引号,但并没有起作用。 - Andrei
1
你真的试过吗?在你的例子中,你把变量放在{}里面,这肯定会使查询返回空值。 - Mathias R. Jessen
没有注意到{}。现在它可以工作了。我简直不敢相信这不是我尝试过的1000件事情之一,因为我肯定尝试过'DeviceID="$var"',而且我认为' '" "是一样的,但每个都放在另一个里面。不过,你知道为什么{}不起作用吗?我经常在字符串中使用{$var},但刚才它没用了。此外,您可以将您的解决方案添加为答案。 - Andrei
1
${var} would have worked, and resulted in the string C:, but {$var} would result in the string {C:} - Mathias R. Jessen
在这里,我提供了几种不同的方法,使用变量来扩展commandlet参数。 - not2qubit
3个回答

13

当您使用 '(单引号)开始一个字符串文字时,您正在创建一个原始字符串 - 也就是说,字符串中的每个字符都被逐字解释,并且变量引用和表达式不会展开!

如果您希望扩展变量,请使用 "

$var = 'C:'
Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='$var'"
如果您的变量名称含有奇怪的字符或后面跟着一个单词字符,您可以在$之后立即用花括号{}限定变量名称。
$var = 'C:'
Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='${var}'"

6

比如说,如果你用 select-string 从文件中获取数据,返回值将是一个单引号字符串。如果该字符串包含变量,则它们不会被展开。如果变量干净 - 不与其他文本混合,那么可以使用 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将单引号更改为双引号。


3
我没有在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"

相同但针对环境变量。
(Get-Item env:$name).Value # throws an exception for undefined environments.
Invoke-Expression "`$env:$name"

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

Get-Item允许在此过程中使用其他文字,以及Invoke-Expression。例如,请参见下面的Computer文字,然后再看$符号。

$otherName = 'Name'

(Get-Item variable:Computer$otherName).Value
(Get-Item env:Computer$otherName).Value

1
要在命令参数中使用它,可以像这样操作:"$env:temp\*.tmp" | ls -filter $0 - Monday Fatigue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接