参数化数组不适用于所有情况

时间:2013-07-02 22:50:14

标签: powershell-v3.0

很难想到一个非常好的头衔。如果您能想到更好的标题,请随时修改它。

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") ......过程块只运行一次。哪个不好。

我知道如何才能在每个场景中正常运行?

3 个答案:

答案 0 :(得分:1)

$ ComputerName是一个数组。

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

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

答案 1 :(得分: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参数相同的行为

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论坛上问了同样的问题。

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

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