【问题标题】:Splatting variable that start with a space以空格开头的飞溅变量
【发布时间】:2020-08-17 04:57:59
【问题描述】:

有没有办法继续使用以空格开头的名称并将其分解?

所以这当然有效:

$Splat = @{
name = 'chrome'
fileversioninfo = $true
}
(Get-Process @Splat)[0]

对我来说它返回:

ProductVersion   FileVersion      FileName
--------------   -----------      --------
84.0.4147.125    84.0.4147.125    C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

现在,如果我将变量名称更改为“Chrome 文件路径和版本”,我会得到:

${ Chrome File Path and Version } = @{
name = 'chrome'
fileversioninfo = $true
}

变量有效并返回属性:

Name                           Value
----                           -----
fileversioninfo                True
name                           chrome

但试图将其吐出,它认为我正在尝试创建一个哈希表,因为括号:

At line:5 char:23
+ (Get-Process @{ Chrome File Path and Version })[0]
+                       ~
Missing '=' operator after key in hash literal.

所以我的问题是,任何人都知道一种方法来喷出需要括号括起来的变量吗? 我很清楚一个简单的

$splat = ${ Chrome File Path and Version }

可行,但问题不在于解决方法,只要有一种方法可以将空格作为第一个字符的变量。 我已经尝试过转义字符、单引号/双引号、子表达式和管道来将名称放在适当的位置,但没有关于此的文档,我很确定它只是不受支持:/

另外,如果重要的话,我仍然使用版本 5.1.19041.1

【问题讨论】:

  • ${ Chrome File Path and Version } 这不是闹剧。这应该是什么?
  • @DougMaurer 这就是创建带有空格或特殊字符的变量的方式,例如连字符。
  • 我认为你是对的,这种方式根本不支持。不过,我找不到任何官方文档/规范。使用“简单名称”变量是 splat 的唯一方法。

标签: powershell parameter-splatting


【解决方案1】:

Splatting 是一种将参数值集合作为一个单元传递给命令的方法,它应该使您的命令更短且更易于阅读

好的 PowerShell 提供了一种在变量名中使用特殊字符的方法,但我认为这不是一个好习惯,你应该知道它存在,你不应该使用它。

它使用刹车的简单事实干扰了散列表的初始化。因此,正如@Roman Kuzmin 建议的那样,它根本不受支持

【讨论】:

    【解决方案2】:

    这就像你希望有一个这样的变量名:variable with space = 1; 在其他语言中。 This is not supported

    【讨论】:

      【解决方案3】:

      抛开这个想法很糟糕,目前在 PowerShell 中的 splatting 非常有限,因此中间变量是最好的方法。有一个 RFC 草案可以改进 splatting here,但目前还没有计划实施。

      【讨论】:

      • 我很好奇是什么让它成为一个可怕的想法?除了打出来不方便之外,除了喷溅的时候不能直接引用,还有什么其他的问题呢?
      • 我不确定是否还有其他技术限制,但在 PowerShell documentation 中明确提到了这些限制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多