如何在Powershell中扩展变量?

And*_*rei 5 powershell

Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="C:"'
Run Code Online (Sandbox Code Playgroud)

做我想要的

$var="C:"
Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="{$var}"'
Run Code Online (Sandbox Code Playgroud)

什么也没做。我试图更改引号,连接字符串和其他1000项内容,但是它们没有用。为什么上面的示例不起作用,什么起作用?

小智 6

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

$abc = 123
$a = '$abc'
iex $a -> 123
Run Code Online (Sandbox Code Playgroud)

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

$path = '$Home/HiMum'
$ExecutionContext.InvokeCommand.ExpandString($path)
-> /home/JoeBlogs/HiMum
Run Code Online (Sandbox Code Playgroud)

Windows 上的幸运儿也许能够使用 Convert-String 将单打转换为双打。


Mat*_*sen 5

当以'(单引号)开头的字符串文字时,您正在创建一个逐字字符串-也就是说,字符串中的每个字符都按字面意义进行解释,并且变量引用和表达式将不会扩展!

使用"如果您希望变量进行扩展:

$var = 'C:'
Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='$var'"
Run Code Online (Sandbox Code Playgroud)

如果您的变量名奇怪的字符,或后跟一个字字符,你可以用两个大括号限定变量名{}立即之后$

$var = 'C:'
Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='${var}'"
Run Code Online (Sandbox Code Playgroud)