Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="C:"'
做到我想要的功能,
$var="C:"
Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="{$var}"'
什么都没做。我尝试更改引号,连接字符串和其他1000种方法,但它们都没有起作用。为什么上面的示例不起作用,什么方法可以起作用?
Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="C:"'
做到我想要的功能,
$var="C:"
Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="{$var}"'
什么都没做。我尝试更改引号,连接字符串和其他1000种方法,但它们都没有起作用。为什么上面的示例不起作用,什么方法可以起作用?
当您使用 '
(单引号)开始一个字符串文字时,您正在创建一个原始字符串 - 也就是说,字符串中的每个字符都被逐字解释,并且变量引用和表达式不会展开!
如果您希望扩展变量,请使用 "
:
$var = 'C:'
Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='$var'"
如果您的变量名称含有奇怪的字符或后面跟着一个单词字符,您可以在$
之后立即用花括号{}
限定变量名称。$var = 'C:'
Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='${var}'"
比如说,如果你用 select-string 从文件中获取数据,返回值将是一个单引号字符串。如果该字符串包含变量,则它们不会被展开。如果变量干净 - 不与其他文本混合,那么可以使用 Invoke-Expression:
$abc = 123
$a = '$abc'
iex $a -> 123
$path = '$Home/HiMum'
$ExecutionContext.InvokeCommand.ExpandString($path)
-> /home/JoeBlogs/HiMum
幸运的Windows用户可能可以使用Convert-String将单引号更改为双引号。
# 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
"$env:temp\*.tmp" | ls -filter $0
。 - Monday Fatigue
{}
里面,这肯定会使查询返回空值。 - Mathias R. Jessen{}
。现在它可以工作了。我简直不敢相信这不是我尝试过的1000件事情之一,因为我肯定尝试过'DeviceID="$var"'
,而且我认为' '
和" "
是一样的,但每个都放在另一个里面。不过,你知道为什么{}
不起作用吗?我经常在字符串中使用{$var}
,但刚才它没用了。此外,您可以将您的解决方案添加为答案。 - Andrei${var}
would have worked, and resulted in the stringC:
, but{$var}
would result in the string{C:}
- Mathias R. Jessen