“-join ";"”是如何工作的?

3

这个答案包含了一行PowerShell代码,它会将$env:path分割并应用过滤器,然后将结果组合起来存储在$env:path中。

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

我在阅读这段代码时,突然出现了一个 -join ';'。这是如何工作的?它背后的概念是什么?我原本以为 (<expression) 最终会变成一些对象,但是像这样读取 <object> -join ';',所以连接部分仍然是一些独立的标记。它是如何评估的?我可以看到它显然做了“正确的事情”,但是为什么以及它是如何工作的呢?Powershell 究竟如何评估此行?对我来说,这似乎是非常神奇的黑魔法。

突然出现了一个狂野的 -join ';'。<- 你是我新的最喜欢的人。+1。 - gvee
2个回答

4

根据文档所述,-Join 运算符 主要有两种用法:

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

大多数PowerShell运算符都是这样工作的(并且看起来类似于方法参数)。在运算符左侧有一些值,并使用右侧标记执行操作(在本例中是连接),在你的情况下是分号;
请查看帮助(通过键入 Get-Help <section_name>)部分about_Joinabout_Operators
此外,文档中的一个很好的示例(无需事先拆分)是:
PS> $a = "WIND", "S P", "ERSHELL"
PS> $a -join "OW"
WINDOWS POWERSHELL

1
哦,所以-join看起来像是一个命令的参数,实际上它是一个操作符,就像-是一个操作符一样,而-join-的子字符串。我明白了。那个指向PS已知的操作符列表的指针非常有帮助。 - user1129682
没错,还有其他的一些选项,比如-split(你的例子本可以使用它来代替$path.split)、-and-as-replace等等。 - Clijsters

1

Clijsters的回答中补充一点,这是一个作用于字符串数组 (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.

我明白了。所以(<expression>)评估为一个数组,它支持-join运算符。我猜这对我来说一下子理解太多了。 - user1129682
@user1129682 没错。它会评估为一个数组,因为使用了.Split()方法来分割字符串。这篇脚本小子的文章详细介绍了Split()方法。 - G42
我认为,创建和过滤数组的部分对OP来说是清晰的。谢谢你的补充! - Clijsters
@Clijsters:不完全是。我期望split生成某种可迭代对象,但我不知道将数组通过“Where-Object”进行管道传输的结果会是什么。 - user1129682

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接