2012-08-08 2 views
8

간단한 질문입니다. 주어진 폴더의 모든 파일에 대해 작동하는 Powershell 함수가 있습니다. 때로는 기능이 단일 폴더에서 작동하고 여러 폴더에서 작동하도록하고 싶을 때가 있습니다. 경로는 배열에 저장됩니다. 하나의 함수가 단일 요소와 배열을 모두 받아 들일 수있는 방법이 있습니까? 하나의 요소는 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'를 사용하여 선언했듯이이 함수는 파이프 라인을 통해 전달 된 여러 값에 대해서만 작동합니다. 매개 변수 선언을'[string []] $ Folders'로 변경하면'process' 블록에서'foreach ($ f in $ Folders)'할 수 있고'Do-Stuff ','Do - 내용 , '및 ', | 마. (아, 그리고 backticks는 불필요합니다 : 연속 대괄호와 괄호 수를 계산하십시오 :) –

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 

....

관련 문제