항목
    about_Foreach

간단한 설명
    항목 컬렉션의 모든 항목을 트래버스하는 데 사용할 수 있는 언어 명령을 설명합니다.


자세한 설명
    Foreach 문(Foreach 루프라고도 함)은 항목 컬렉션에 있는 일련의 값을 단계별로 실행하는 언어 구문입니다. 


    트래버스할 컬렉션의 가장 간단하고 가장 일반적인 유형은 배열입니다.
    일반적으로 Foreach 루프 내에서는 배열의 각 항목에 대해 하나 이상의 명령이 실행됩니다. 


  구문        
      다음은 Foreach 구문의 예입니다.

        
          foreach ($<item> in $<collection>){<statement list>}


      명령 파이프라인 외부에 있는 Foreach 문입니다. Foreach 문에서 괄호로 묶인 부분은 반복할 변수와 
      컬렉션을 나타냅니다. Foreach 루프가 실행되면 자동으로 ($<item>) 변수가 만들어집니다. 이 변수는 
      루프가 매번 반복되기 전에 컬렉션의 값으로 설정됩니다. Foreach 문 뒤에 나오는 {<statement list>} 
      블록에는 컬렉션의 각 항목에 대해 실행할 일련의 명령이 포함되어 있습니다.
 

  예
      예를 들어 다음 예제에서는 Foreach 루프가 $letterArray라는 배열의 값을 표시합니다.

        
          $letterArray = "a","b","c","d"
          foreach ($letter in $letterArray)
          {
              Write-Host $letter
          }

      
      이 예제에서는 $letterArray 배열을 만들어 문자열 값 "a", "b", "c" 및 "d"로 초기화합니다. 
      Foreach 문은 처음 실행될 때 $letter 변수를 $letterArray의 첫 번째 항목인 "a"로 설정한 
      다음 Write-Host cmdlet을 사용하여 문자 a를 표시합니다. 루프를 따라 다음에 실행될 때는 $letter가 
      "b"로 설정되고 이러한 식으로 반복되다가 Foreach 루프가 문자 d를 표시하고 나면 루프가 종료됩니다.


      전체 Foreach 문을 Windows PowerShell 명령 프롬프트에서 하나의 명령처럼 실행하려면 한 줄에 있어야 
      합니다. 대신 .ps1 스크립트 파일에 명령을 지정하는 경우에는 전체 Foreach 문을 한 줄로 표시하지 
      않아도 됩니다. 


      Foreach 문은 항목 컬렉션을 반환하는 Cmdlet과 함께 사용할 수도 있습니다. 다음 예제에서는 Foreach 
      문이, Get-ChildItem cmdlet이 반환하는 항목 목록을 단계별로 실행합니다.


          foreach ($file in Get-ChildItem)
          {
              Write-Host $file
          }


      If 문을 사용하여 반환되는 결과를 제한하면 위의 예제를 보다 구체적으로 정의할 수 있습니다. 다음 
      예제에서는 Foreach 문이 위의 예제에서와 동일한 루프 작업을 수행하지만 If 문을 추가하여 결과를 
      100KB보다 큰 파일로 제한합니다.


          foreach ($file in Get-ChildItem)
          {
              if ($file.length -gt 100k) 
              {
                  Write-Host $file
              }
          }

      이 예제에서는 Foreach 루프가 $file 변수의 속성을 사용하여 비교 연산을 수행합니다($file.length -gt 
      100k). $file 변수에는 Get-ChildItem cmdlet에서 반환한 개체의 모든 속성이 포함되어 있습니다. 
      따라서 파일 이름 이외의 다른 항목도 반환할 수 있습니다. 다음 예제에서는 문 목록 내에 있는 길이와 
      마지막 액세스 시간을 반환합니다.


          foreach ($file in Get-ChildItem)
          {
              if ($file.length -gt 100k) 
              {
                  Write-Host $file
                  Write-Host $file.length
                  Write-Host $file.lastaccesstime
              }
          }

    
      이 예제에서는 문 목록에서 하나 이상의 명령을 실행할 수 있습니다. 

      
      Foreach 루프 외부에서 변수를 사용하고 Foreach 루프 내에서 변수를 증가시킬 수도 있습니다.  
      다음 예에서는 크기가 100KB 이상인 파일 수를 셉니다. 
      
  
          $i = 0
          foreach ($file in Get-ChildItem)
          {
              if ($file.length -gt 100k) 
              {
                  Write-Host $file "file size:" ($file.length / 
                  1024).ToString("F0") KB
                  $i = $i + 1
              }
          }

          if ($i -ne 0)
          {
              Write-Host
              Write-Host $i " file(s) over 100 KB in the current 
              directory."}
          else 
          {
              Write-Host "No files greater than 100 KB in the current 
              directory."
          }


      위 예에서는 $i 변수가 루프 외부에서 0으로 설정되고 100KB보다 큰 파일이 발견될 때마다 루프 
      내에서 변수가 증가합니다. 루프가 종료되면 If 문은 $i의 값을 평가하여 100KB보다 큰 모든 파일의 
      수를 표시하거나 100KB보다 큰 파일을 찾을 수 없다는 메시지를 표시합니다.


      위의 예제에서는 파일 길이 결과의 형식을 지정하는 방법도 보여 줍니다.


          ($file.length / 1024).ToString("F0")


      결과 값을 바이트 대신 KB로 표시하기 위해 값을 1024로 나눈 다음 결과 값에서 소수 값을 제거하기 
      위해 고정 소수점 형식 지정자를 사용하여 결과 값의 형식이 지정됩니다. 0은 형식 지정자가 소수 
      자릿수를 표시하지 않도록 합니다. 

      명령 파이프라인 내의 Foreach 문 Foreach가 명령 파이프라인에 표시되면 ForEach-Object 명령을 
      호출하는 foreach 별칭이 사용됩니다. 명령 파이프라인에서 foreach 별칭을 사용할 때는 Foreach 문을 
      사용할 때와 달리 ($<item> in $<collection>) 구문을 포함하지 않습니다. 이것은 파이프라인의 이전 
      명령이 이 정보를 제공하기 때문입니다. 명령 파이프라인에 사용되는 foreach 별칭 구문의 예는 다음과 
      같습니다.
        

          <command> | foreach {<command_block>}
     

      예를 들어 다음 명령 파이프라인의 Foreach 루프는 작업 집합(메모리 사용)이 20MB보다 큰 프로세스를 
      표시합니다. Get-Process 명령의 출력이 foreach 별칭에 파이프됩니다. foreach 별칭 명령 블록 내의 
      $_.WS 변수에는 Get-Process cmdlet이 foreach 별칭 명령 블록에 전달하는 WS(작업 집합) 속성의 
      값이 포함되어 있습니다. $_ 선언 부분은 WSH(Windows 스크립트 호스트) 자동 변수이고, WS 부분은 
      속성입니다. If 문은 조건문을 사용하여 작업 집합이 20MB(20,000,000바이트)보다 큰지 여부를 
      확인합니다. 작업 집합이 20MB보다 크면 $_.name에 저장되어 있는 프로세스 이름과 작업 집합의 
      크기가 MB로 표시됩니다.
      20MB보다 큰 프로세스 작업 집합이 없으면 아무 것도 표시되지 않습니다.


          Write-Host "Processes with working-sets greater than 20 MB"
          Get-Process | foreach { 
              if ($_.WS -gt 20m)
              {
                  Write-Host $_.name ": " 
          ($_.WS/1m).ToString("F0") MB -Separator ""
              }
          }


      foreach 별칭은 시작 명령 블록, 중간 명령 블록 및 끝 명령 블록을 지원합니다. 시작 및 끝 명령 블록은 
      한 번만 실행되고 중간 명령 블록은 Foreach 루프가 컬렉션이나 배열을 반복할 때마다 실행됩니다. 
        

      명령 블록의 시작, 중간 및 끝 집합이 있는 명령 파이프라인에 사용되는 foreach 별칭 구문은 다음과 
      같습니다.
        

          <command> | foreach {<beginning command_block>}{<middle 
          command_block>}{<ending command_block>}

 
      다음 예제에서는 시작, 중간 및 끝 명령 블록을 사용하는 방법을 보여 줍니다. 


          Get-ChildItem | foreach {
          $fileCount = $directoryCount = 0}{
          if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{
          "$directoryCount directories and $fileCount files"}


      시작 블록은 두 개의 변수를 만들고 0으로 초기화합니다.


          {$fileCount = $directoryCount = 0}
 

      중간 블록은 Get-ChildItem이 반환하는 각 항목이 디렉터리인지 파일인지를 확인합니다.


          {if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}


      반환되는 항목이 디렉터리이면 $directoryCount 변수가 1씩 증가하고, 반환되는 항목이 디렉터리가 아니면 
      $fileCount 변수가 1씩 증가합니다. 끝 블록은 중간 블록이 해당 루프 작업을 마치고 작업 결과를 반환하면 
      실행됩니다. 

       
          {"$directoryCount directories and $fileCount files"}


      시작, 중간 및 끝 명령 블록 구조와 파이프라인 연산자를 사용하면 다음과 같이 100KB보다 큰 파일을 
      찾도록 위의 예제를 다시 작성할 수 있습니다.


          Get-ChildItem | foreach{
              $i = 0}{
              if ($_.length -gt 100k)
              {
                  Write-Host $_.name "file size:" ($_.length / 
                  1024).ToString("F0") KB
                  $i++
              }
              }{
              if ($i -ne 0)
              {
                  Write-Host
                  Write-Host "$i file(s) over 100 KB in the current 
                  directory."
              }
              else 
              {
              Write-Host "No files greater than 100 KB in the current 
              directory."}
              }


참고 항목
    about_Automatic_Variables
    about_If
    Foreach-Object
    




목차