2013-07-02 27 views
-1

想想一个非常好的标题很难。如果你能想到更好的标题,请随时编辑它。参数化数组在所有情况下都不能正常工作

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发现每个条目运行一次。这是好的和正确的。

如果我运行"host1","host2" | New-Cmdlet,那么PROCESS块将运行两次;一次为host1,一次为host2。再次,这是好的和正确的。

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

任何想法我能做些什么才能在每种情况下正常工作?

回答

1

$ ComputerName是一个数组。

新Cmdlet的-ComputerName“主机1”,“主机2” - 这通过在一个阵列中 - 你的代码被执行一次,并返回

您应该修改代码以遍历$计算机名称代码内

+0

谢谢。我想我只是感到困惑,因为当我使用管道时,Process程序块表现为它自己的foreach循环,所以在它内部添加一个foreach循环似乎是多余的。 –

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

我想相同的行为在拷贝项目

复制项目-Path “FILE.TXT”, “FILE2.TXT” -Destination -Path参数 “d:\”

“File.txt”,“File2.txt”| Copy-item -Destination“D:\”

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

Function DoStuff { 

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

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

我刚刚看了ATT微软的拷贝项命令用JustDecompile,看看微软是如何做到的。它们以同样的方式执行... Path-parameter是一个数组,它们在其ProcessRecord实现中循环。

相关问题