-1

很难为此想一个非常好的标题。如果您能想到更好的标题,请随时编辑它。

电源外壳 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 块运行两次;一次用于主机 1,再次用于主机 2。同样,这是好的和正确的。

但是,如果我运行New-Cmdlet -ComputerName "host1","host2"或我能想到的任何其他变体New-Cmdlet -ComputerName @("host1","host2")...... PROCESS 块只运行一次。 哪个不好。

知道我可以做些什么来使其在每种情况下都能正常工作吗?

4

3 回答 3

1

几年前,我在 TechNet 论坛上问过同样的问题。

http://social.technet.microsoft.com/Forums/windowsserver/en-US/fc0bf987-a4f2-4ebb-9ff3-8c4acef346ed/process-pipeline-input-and-parameter-input-the-same-way

我想要与 Copy-Item 中的 -Path 参数相同的行为

复制项-路径“File.txt”、“File2.txt”-目标“D:\”

“文件.txt”、“文件2.txt” | 复制项目 -Destination "D:\"

就像你说的......当从管道接收到内容时,我们必须循环一个已经是冗余的标量值。像这样...

Function DoStuff {

    Param (   
        [Parameter(Mandatory=$True, ValueFromPipeline=$True)][string[]]$Item
    )

    Process {
        $Item | ForEach-Object {
            # Do the stuff here
        }
    }
}

我刚刚在 JustDecompile 中查看了 Microsoft 的 Copy-Item CmdLet,以了解 Microsoft 是如何做到的。他们以同样的方式做......路径参数是一个数组,他们在他们的 ProcessRecord 实现中循环。

于 2013-07-05T17:06:29.793 回答
1

$ComputerName 是一个数组。

New-Cmdlet -ComputerName "host1","host2" - 这传入一个数组 - 您的代码执行一次并返回

您应该修改代码以在代码中循环 $computerName

于 2013-07-03T12:17:02.853 回答
0

几年前,我在 TechNet 论坛上问过同样的问题。

http://social.technet.microsoft.com/Forums/windowsserver/en-US/fc0bf987-a4f2-4ebb-9ff3-8c4acef346ed/process-pipeline-input-and-parameter-input-the-same-way

就像你说的......当从管道接收到内容时,我们必须循环一个已经是冗余的标量值。

于 2013-07-05T09:25:22.283 回答