【问题标题】:How to expand variable in powershell?如何在powershell中扩展变量?
【发布时间】:2016-12-01 16:15:09
【问题描述】:
Get-WmiObject -Class win32_logicaldisk -Filter 'DeviceID="C:"'

做我想做的,

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

什么都不做。我尝试更改引号、连接字符串和其他 1000 件事情,但它们没有用。为什么上面的例子不起作用,什么会起作用?

【问题讨论】:

  • -Filter "DeviceID='$var'"(注意过滤器字符串周围的双引号)
  • @MathiasR.Jessen 如前所述,我试图颠倒引号,它不起作用
  • 你真的试过了吗?在您的示例中,您将 {} 放在变量周围,这肯定会使查询不返回任何内容
  • 没有注意到{}。现在它起作用了。我不敢相信这不是我尝试过的 1000 件事之一,因为我肯定尝试过 'DeviceID="$var"',我认为 ' '" " 是一样的,但每一个都进去了另一个。不过,您知道为什么{} 不起作用吗?我在字符串中使用了很多次{$var},但现在它不起作用。此外,您可以添加您的解决方案作为答案。
  • ${var} 会起作用,并产生字符串C:,但{$var} 会产生字符串{C:}

标签: powershell


【解决方案1】:

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

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

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

如果你的变量名有奇怪的字符,或者后面跟着一个单词字符,你可以在$之后立即用大括号{}限定变量名:

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

【讨论】:

    【解决方案2】:

    例如,如果您使用 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
      IE。请参阅下面 $ 符号之前的 Computer 文字。

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

      【讨论】:

      • 在命令参数中使用像这样"$env:temp\*.tmp" | ls -filter $0
      猜你喜欢
      • 2012-12-10
      • 1970-01-01
      • 2012-10-16
      • 2018-01-09
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多