2012-08-08 29 views
8

これは簡単な質問です。私は、特定のフォルダ内のすべてのファイルで動作するPowershell関数を持っています。ある機能を単一のフォルダ上で動作させたいときや、いくつかのフォルダ上で動作させたいときに、そのパスが配列に格納されていることがあります。 1つの要素に1つの要素と配列の両方を受け入れる方法がありますか?単一の要素は、foreachのは、与えられたアイテムを一度に実行されるようになります渡すPowershellの関数に文字列や文字列を渡す

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

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

おかげでニック。 – mack

+0

問題ありませんが、私は間違いなくこのような機能を、たとえ小さくても好むでしょう。より大きなスケールで作業するために関数を書き換えるいくつかの時間がありました。よい一週間を! – Nick

+3

'[String] $ Folders'を使って宣言されているように、この関数はパイプラインを通して渡された複数の値に対して_only_働くことに注意してください。パラメータ宣言を '[string []] $ Folders'に変更すると、' process'ブロックで 'foreach($ F in $ Folders)'を実行することができ、 'Do-Stuff '、 'Do -Stuff , '、および ', |やる気。 (ああ、バッククイックは不要です:継続括弧とカッコは数えます:) –

7

PowerShellでは、あなたは、均一に配列し、単一の要素を反復処理することができます。

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

をハングアップしますが、私は気が気になりません。 :)あまりにも簡単でした!私がしたのは、Do-Stuff([string] $ folder)からDo-Stuff($ folder)に関数宣言を変更することでした。これは機能しているようです。私はforeachループを試しましたが、 "指定されたパスの形式はサポートされていません"というエラーが出ました。 "与えられたパス"は配列の複数の値だったからです。 Do-Stuff $ folder Do-Stuff $ folderArray なぜ関数パラメータを宣言するときに[string]を指定する必要はありませんか? – mack

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 

....