9

我希望这是一个简单的问题。我有一个 Powershell 函数,可以对给定文件夹中的所有文件进行操作。有时我想让函数在单个文件夹上运行,有时我希望它在多个文件夹上运行,这些文件夹的路径存储在一个数组中。有没有办法让一个函数能够同时接受单个元素和数组?

Do-Stuff $aSingleFolder

Do-Stuff $anArrayofFolders
4

3 回答 3

9

您还可以在函数中运行流程部分。它看起来像这样:

Function Do-Stuff {
    param(
        [Parameter( `
            Mandatory=$True, `
            Valuefrompipeline = $true)]
        [String]$Folders
    )
    begin {
        #Things to do only once, before processing
    } #End Begin

    Process {
         #What  you want to do with each item in $Folders
    } #End Process 

    end {
        #Things to do at the end of the function, after all processes are done
    }#End end
} #End Function Do-Stuff

然后当你调用函数时。像这样做

$Folders | Do-Stuff

这是将会发生的事情。块中的所有内容都Begin将首先运行。然后,对于$Folders变量中的每个项目,Process块中的所有内容都将运行。完成后,它将运行End块中的内容。这样,您可以将任意数量的文件夹通过管道传输到您的函数中。如果您想在某天向此函数添加其他参数,这将非常有用。

于 2012-08-08T20:11:43.773 回答
7

在 Powershell 中,您可以以统一的方式迭代数组和单个元素:

function Do-Stuff($folders) {
    foreach($f in $folders) {
        //do something with $f
    }
}

传递单个元素将导致 foreach 对给定项目执行一次。

Do-Stuff "folder"
Do-Stuff "folder1", "folder2",...
于 2012-08-08T19:01:05.987 回答
0

这在没有 cmd.exe 和使用文件的情况下有效:

 function Invoke-PlinkCommandsIOS { 
     param (
        [Parameter(Mandatory=$true)][string] $Host,
        [Parameter(Mandatory=$true)][System.Management.Automation.PSCredential] $Credential,
        [Parameter(Mandatory=$true)][string] $Commands,
        [Switch] $ConnectOnceToAcceptHostKey = $false
    )
     $PlinkPath="$PSScriptRoot\plink.exe"
    $commands | & "$PSScriptRoot\plink.exe" -ssh -2 -l $Credential.GetNetworkCredential().username -pw "$($Credential.GetNetworkCredential().password)" $Host -batch
 } 

用法:不要忘记你的出口和终端长度 0 否则它会挂起

PS C:\> $Command = "terminal lenght 0
>> show running-config
>> exit
>> "
>>
PS C:\> Invoke-PlinkCommandsIOS -Host ace-dc1 -Credential $cred -Commands $Command

……

于 2015-02-19T16:02:13.843 回答