2012-08-08 3 views
8

Ich hoffe, das ist eine einfache Frage. Ich habe eine Powershell-Funktion, die auf alle Dateien in einem bestimmten Ordner funktioniert. Es gibt Zeiten, in denen ich möchte, dass die Funktion in einem einzigen Ordner arbeitet und wenn ich möchte, dass sie in mehreren Ordnern arbeitet, deren Pfade in einem Array gespeichert sind. Gibt es eine Möglichkeit, dass eine Funktion sowohl ein einzelnes Element als auch ein Array akzeptieren kann?Übergeben Sie String oder String-Array an eine Funktion in Powershell

Do-Stuff $aSingleFolder 

Do-Stuff $anArrayofFolders 

Antwort

9

Sie können den Prozessabschnitt auch innerhalb der Funktion ausführen. Es würde wie folgt aussehen:

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 

Dann, wenn Sie die Funktion aufrufen. Verwenden Sie es dieses

$Folders | Do-Stuff 
mögen

Hier ist, was passieren wird. Alles im Block Begin wird zuerst ausgeführt. Dann wird für jedes Element in der Variablen $Folders alles im Block Process ausgeführt. Nach Abschluss des Vorgangs wird der Block End ausgeführt. Auf diese Weise können Sie beliebig viele Ordner in Ihre Funktion pipen. Dies ist sehr hilfreich, wenn Sie dieser Funktion eines Tages zusätzliche Parameter hinzufügen möchten.

+0

Super. Danke Nick. – mack

+0

Kein Problem, ich bevorzuge solche Funktionen, auch wenn sie klein sind. Es hat einige verlorene Stunden gegeben, eine Funktion neu zu schreiben, um in einem größeren Maßstab zu arbeiten. Hab eine großartige Woche! – Nick

+3

Beachten Sie, dass, wie mit '[String] $ Folders' deklariert, diese Funktion _only_ nur für mehrere Werte funktioniert, die durch die Pipeline geleitet werden. Wenn Sie die Parameterdeklaration in '[string []] $ Folders' ändern, können Sie' foreach ($ f in $ Folders) 'im' process' Block verwenden und es wird für 'Do-Stuff ', 'Do -Stuff , 'und' , | Do-Stuff'. (Oh, und die Backticks sind unnötig: offene Klammern und Klammern zählen als Fortsetzungen :) –

7

In Powershell können Sie ein Array iterieren und ein einzelnes Element in einer einheitlichen Art und Weise:

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

ein einzelnes Element Passing wird die foreach verursachen mit dem angegebenen Element einmal ausgeführt werden.

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

Okay, hängen Ich fühle mich dumm. :) Das war zu einfach! Ich habe die Funktionsdeklaration von Do-Stuff ([String] $ - Ordner) in Do-Stuff ($ Ordner) geändert und es scheint zu funktionieren. Ich hatte die foreach-Schleife versucht, aber ich bekam einen Fehler, der sagte "... das Format des gegebenen Weges wird nicht unterstützt", weil der "gegebene Pfad" mehrere Werte vom Array war. Ich rufe jetzt die Funktion wie folgt auf: Do-Stuff $ Ordner Do-Stuff $ folderArray Warum muss ich die [string] nicht bei der Erklärung der Funktion Parameter enthalten? – mack

0

Dies funktioniert ohne cmd.exe und mit Dateien:

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 
} 

Verbrauch: Vergessen Sie nicht, Ihren Ausgang des und Anschlusslänge 0 oder

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

....

Verwandte Themen