繁体   English   中英

Powershell功能:管道和通用参数值之间的巨大差异

[英]Powershell function: wierd difference between pipeline and common parameter value

我对Powershell处理函数参数的方式感到困惑。

所以我有一个基于我的真实脚本制作的示例ps模块,仅用于测试目的:

function test {
[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='Medium')]

param(
    [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [System.Management.Automation.PSObject]$InputObject
)

Begin {
}
Process {
Write-Host $InputObject
}
End {
}
}

Export-Modulemember -function test

将其另存为test.psm1&import,并进行2个测试:

第一次测试:

(get-process | select -first 5) | test

将返回以下内容:

System.Diagnostics.Process (7zFM)
System.Diagnostics.Process (7zFM)
System.Diagnostics.Process (AcroRd32)
System.Diagnostics.Process (AcroRd32)
System.Diagnostics.Process (AESTSr64)

第二次测试:

test -InputObject (get-process | select -first 5)

而是返回以下内容:

System.Diagnostics.Process (7zFM) System.Diagnostics.Process (7zFM) System.Diagn
ostics.Process (AcroRd32) System.Diagnostics.Process (AcroRd32) System.Diagnosti
cs.Process (AESTSr64)

当我使用变量存储和转发数据时,也会发生同样的情况。

powershell处理参数的方式似乎有所不同,使用-InputObject参数时返回的数据似乎以某种方式失去了其数组形式的格式...

为什么这样做呢? 有没有办法改变这种行为?

Powershell管道自动将数组和集合“展开”到一个级别,然后一次将它们传递到下一个cmdlet或一个函数,因此,当您通过管道发送该数组时,您的函数一次要处理一个进程对象。

使用该参数时,您将一次发送整个数组,并且您的函数正在处理数组对象,而不是处理对象,因此您将获得不同的结果。

尝试一下,看看它是否对您的输出没有影响:

Process {
 $InputObject | foreach {Write-Host $_ }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM