将字符串或字符串数​​组传递给Powershell中的函数

时间:2012-08-08 18:54:14

标签: function powershell

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

Do-Stuff $aSingleFolder

Do-Stuff $anArrayofFolders

3 个答案:

答案 0 :(得分: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块中的内容。这样,您可以根据需要将多个文件夹传输到函数中。如果你想在某天向这个函数添加其他参数,这非常有用。

答案 1 :(得分:7)

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

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

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

Do-Stuff "folder"
Do-Stuff "folder1", "folder2",...

答案 2 :(得分: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

...