2012-08-08 130 views
8

我希望這是一個簡單的問題。我有一個Powershell功能,可以對給定文件夾中的所有文件進行操作。有些時候,我想讓這個功能在一個文件夾上運行,並且我希望它能夠在多個文件夾上運行,這些文件夾的路徑存儲在一個數組中。有沒有辦法讓一個函數能夠接受單個元素和一個數組?將字符串或字符串數​​組傳遞給Powershell中的函數

Do-Stuff $aSingleFolder 

Do-Stuff $anArrayofFolders 

回答

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區塊中的內容。這樣,您可以根據需要將多個文件夾放入您的功能中。如果您想在某一天爲此功能添加其他參數,這非常有用。

+0

太棒了。謝謝Nick。 – mack 2012-08-20 18:02:34

+0

沒問題,我絕對喜歡做這樣的功能,即使它們很小。重寫功能在更大規模上工作的時間有幾個小時。祝您有個愉快的一週! – Nick 2012-08-20 22:48:15

+3

請注意,正如使用'[String] $ Folders'聲明的那樣,此函數將僅適用於通過管道傳遞的多個值。如果將參數聲明更改爲'[string []] $ Folders',那麼您可以''在'process'塊中foreach($ f文件夾中的$ f),它可以用於'Do-Stuff ','Do -Stuff ',和' | DO-Stuff'。 (哦,反引號是不必要的:開括號和括號計數作爲延續:) – 2012-09-09 21:48:40

7

在Powershell的,可以遍歷以均勻的方式的陣列,並且單個元件:

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

傳遞單個元件將導致與給定的項目執行一次在foreach。

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

好,我覺得很愚蠢。 :)那太容易了!我所做的是將函數聲明從Do-Stuff([string] $文件夾)更改爲Do-Stuff($文件夾),它似乎正在工作。我已經嘗試了foreach循環,但是我得到一個錯誤:「......給定路徑的格式不被支持」,因爲「給定路徑」是來自數組的多個值。我現在調用這樣的函數: Do-Stuff $文件夾 Do-Stuff $ folderArray 爲什麼在聲明函數參數時不必包含[string]? – mack 2012-08-08 19:59:01

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 

....