我一直在努力学习PowerShell,目前正在考虑将一个命令的输出汇总到另一个命令的输入中。我发现有些命令可以在管道输入的项目数组上运行,而其他命令只能在数组中的单个项目上运行。
例如,Where-Object
可以对项目数组进行操作,返回其中的一部分,而New-Item
只能对单个项目进行操作。
我必须以不同的方式处理这两种类型的命令,其中的命令只能对单个项目进行操作,而且必须包含在ForEach-Object
块中。
对于intance,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
然而,问题仍然存在,因为$ _表示通过管道传递的集合对象中的当前项。
答案 0 :(得分:3)
我不认为这是一个可以接受阵列的问题,而这不仅仅是cmdlet接受管道输入的问题,而且不是对于那些接受它的人,他们如何使用管道输入的物体。在大多数情况下,您需要查看您感兴趣的cmdlet的帮助,以查看它是否接受管道输入。
现在,Where-Object
旨在处理通过管道输入的对象数组,因此它没有具体说明它的作用,并假设用户将能够解决这个问题。 。 New-Item
实际上确实需要将一组对象传送到其中,但接受该参数的参数是-Value
参数,因此对于大多数人来说可能没什么用处。上面的示例显示您要指定-Name
参数,该参数不接受管道值。
所以你的问题的答案是,任何接受管道输入的东西都允许你将一个正确的对象类型的数组管道输入它,它将依次处理每个项目,挑战可能是找到一个对象是否或如何将接受管道信息。
对于您的具体示例,我个人认为New-Item
应该接受管道字符串以适应目录或空文件的创建,或允许管道对象/哈希表允许创建更复杂的事物。 / p>
答案 1 :(得分:1)
但New-Item确实:
@("Red", "Blue", "Green") | foreach {new-item -Name $_ -ItemType directory}
不,New-Item需要ForEach-object
并不正确。
了解如何:
'Red', 'Blue', 'Green'|ni -Name{$_} -ItemType directory -whatif