Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="C:"'
做我想要的,
$var="C:"
Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="{$var}"'
什么都不做。我试图改变引号,连接字符串和其他1000个东西,但它们没有用。为什么上面的例子不起作用,什么会起作用?
答案 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