【问题标题】:How does -join ";" work?-join ";" 如何工作?
【发布时间】:2018-02-06 09:04:48
【问题描述】:

This answer 包含类似 Powershell 的代码,它拆分 $env:path,应用过滤器并将结果放在一起,将其存储在 $env:path 中。

$path = ($path.Split(';') | Where-Object { $_ -ne 'ValueToRemove' }) -join ';'

我正在阅读这段代码,然后突然出现了一个狂野的-join ';'。这是如何运作的?这背后的概念是什么?我希望(<expression) 最终会成为某个对象,但是这样会读取<object> -join ';',所以连接部分仍然是一些独立的令牌。它是如何评估的?我可以看到它显然做了“正确的事情”,但是它是如何以及为什么起作用的呢? Powershell 究竟如何评估这条线?在我看来,这就像非常黑暗的魔法。

【问题讨论】:

  • “突然,一个狂野的-join ';' 出现了。”

标签: arrays powershell operators evaluation


【解决方案1】:

正如by the docs 所述,-Join 运算符主要有两种使用方式:

-Join <String[]>
<String[]> -Join <Delimiter>

大多数 PowerShell 运算符都以这种方式工作(并且看起来类似于方法参数)。您在运算符的左侧获得了一些值并执行操作(在本例中为加入) 右侧标记,在您的情况下为分号 ;

查看帮助(通过输入Get-Help &lt;section_name&gt;)部分about_Joinabout_Operators

从文档中复制的一个很好的示例(无需事先拆分)是:

PS> $a = "WIND", "S P", "ERSHELL"
PS> $a -join "OW"
WINDOWS POWERSHELL

【讨论】:

  • 哦,所以-join,看起来像命令的参数,是一个运算符,就像-是一个运算符,它是-join的一个子字符串。我知道了。指向 PS 知道的运算符列表的指针最有帮助。
  • 是的,完全正确。其他的是-split(您的示例可以使用它,而不是$path.split)、-and-as-replace 等等。
【解决方案2】:

要添加到Clijsters' answer,它是一个作用于字符串数组 (String[]) 的运算符。运算符后面的字符指定用于连接数组的每个元素的字符。

分解部分:

($path.Split(';')                        # take the *string* $path and split into an *array*.
                                         # do this on the ; character

Where-Object { $_ -ne 'ValueToRemove' }) # exclude the array element which is equal to
                                         # "ValueToRemove" 

-join ';'                                # Join the *array* back into a *string*
                                         # Put ";" between each array element.

【讨论】:

  • 我明白了。所以(&lt;expression&gt;) 计算为一个支持-join 运算符的数组。我想这对我来说太多了。
  • @user1129682 没错。它计算为一个数组,因为 .Split() 方法用于分解字符串。 This scripting guy post 更详细地介绍了 Split() 方法。
  • 我想,创建和过滤数组的部分对 OP 来说是清楚的。谢谢你的补充!
  • @Clijsters:不是真的。我希望 split 生成某种形式的可迭代对象,但我不知道尽管Where-Object 将数组管道化的结果是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2021-04-08
  • 2020-12-07
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多