很难想到一个非常好的头衔。如果您能想到更好的标题,请随时修改它。
Powershell 3。
这是一个示例函数:
Function New-Cmdlet
{
[CmdletBinding(SupportsShouldProcess=$True)]
Param([Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[String[]]$ComputerName)
BEGIN
{
Write-Verbose -Message "Cmdlet is starting."
}
PROCESS
{
Write-Verbose -Message "Beginning Process block on $ComputerName"
}
END
{
Write-Verbose -Message "Running End block."
}
}
现在,如果我运行Get-Content C:\hosts.txt | New-Cmdlet
,则对于在hosts.txt中找到的每个条目,将运行一次PROCESS块。这是好的和正确的。
如果我运行"host1","host2" | New-Cmdlet
,那么PROCESS块运行两次;一次用于host1,一次用于host2。再次,这是好的和正确的。
但是如果我运行New-Cmdlet -ComputerName "host1","host2"
或者我可以想到的任何其他变体New-Cmdlet -ComputerName @("host1","host2")
......过程块只运行一次。哪个不好。
我知道如何才能在每个场景中正常运行?
答案 0 :(得分:1)
$ ComputerName是一个数组。
New-Cmdlet -ComputerName“host1”,“host2” - 这传入一个数组 - 您的代码执行一次并返回
您应修改代码以在代码中循环$ computerName
答案 1 :(得分:1)
几年前我在TechNet论坛上问了同样的问题。
我想要与Copy-Item
中的-Path参数相同的行为Copy-item -Path“File.txt”,“File2.txt”-Destination“D:\”
“File.txt”,“File2.txt”|复制项目 - 目标“D:\”
就像你说...当从管道收到内容时,我们必须循环一个冗余的标量值。像这样......
Function DoStuff {
Param (
[Parameter(Mandatory=$True, ValueFromPipeline=$True)][string[]]$Item
)
Process {
$Item | ForEach-Object {
# Do the stuff here
}
}
}
我刚刚在JustDecompile中查看了Microsofts Copy-Item CmdLet,看看微软是如何做到的。它们以相同的方式执行... Path-parameter是一个在ProcessRecord实现中循环的数组。
答案 2 :(得分:0)
几年前我在TechNet论坛上问了同样的问题。
就像你说的......当从管道收到内容时,我们必须循环一个已经多余的标量值。