gpt4 book ai didi

powershell - 哪些命令对单个项目进行操作,哪些操作对象数组?

转载 作者:行者123 更新时间:2023-12-01 12:36:29 26 4
gpt4 key购买 nike

我一直在尝试学习 PowerShell,目前正在研究将一个命令的输出通过管道传输到另一个命令的输入中。我发现一些命令可以对管道输入的项目数组进行操作,而其他命令只能对数组中的单个项目进行操作。

例如,Where-Object 可以对项目数组进行操作,返回其中的一个子集,而 New-Item 只能对单个项目进行操作。

我必须以不同的方式处理这两种类型的命令,只能对单个项目进行操作的命令必须包含在 ForEach-Object block 中。

例如,Where-Object 不需要 ForEach-Object:

Get-Service | where Status -eq "Stopped"

但是 New-Item 会:

@("Red", "Blue", "Green") | foreach {new-item -Name $_ -ItemType directory}

如何确定特定命令是可以作用于一组项目,还是只能作用于单个项目?

据我所知,帮助并没有真正提供线索。例如,Where-Object 的帮助说明输入类型是 System.Management.Automation.PSObject,这对我来说并不意味着它可以是对象数组。

编辑: aljodAv 在他的回答中指出,在第二个示例中实际上不需要 ForEach-Object。可以写成:

@("Red", "Blue", "Green") | new-item -Name {$_} -ItemType directory

但是,问题仍然存在,因为 $_ 表示通过管道传递的集合对象中的当前项。

最佳答案

我认为这不是哪个可以接受数组哪个不能的问题,这更多的是什么 cmdlet 接受管道输入,哪些不接受,以及接受的问题它,他们如何使用管道输入的对象。在大多数情况下,您需要查看您感兴趣的任何 cmdlet 的帮助,看看它是否接受管道输入。

现在,Where-Object 设计用于处理通过管道传输到其中的对象数组,因此它没有具体说明它确实如此,并假定用户将能够搞清楚。 New-Item 实际上确实接受了一组要通过管道传输到其中的对象,但是接受它的参数是 -Value 参数,所以这可能不太有用对大多数人来说。上面的示例表明您要指定 -Name 参数,该参数不接受管道值。

所以你的问题的答案是任何接受管道输入的东西都允许你将正确对象类型的数组传递给它并且它会依次处理每个项目,挑战可能在于找到一个对象是否或如何将接受管道信息。

对于您的具体示例,我个人认为 New-Item 应该接受管道字符串以适应目录或空文件的创建,或者允许管道对象/哈希表以允许创建更复杂的事情。

关于powershell - 哪些命令对单个项目进行操作,哪些操作对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29223541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com