한 번 이상 동일한 작업을 수행해야 한 적이 있으신가요? 예를 들어, GUI를 사용하여 하나씩 여러 Active Directory 사용자를 생성하거나, 선택한 폴더에서 오래된 로그를 삭제하기 위해 서버에 로그인해야 한 적이 있으신가요? 예라고 대답한다면, 혼자가 아니라는 것을 알아두세요. PowerShell의 Import-Csv
와 foreach 루프를 숙달할 시간입니다.
수동 작업에는 문제가 없습니다. 때로는 필요합니다. 그러나 CSV 파일을 읽고 처리하는 경우, PowerShell cmdlet Import-Csv
와 ForEach
루프를 사용할 수 있습니다.
PowerShell의 Import-Csv
cmdlet은 CSV 파일과 같은 표 형태의 소스에서 데이터를 읽는 훌륭한 방법입니다. 그런 다음 ForEach
루프를 사용하여 CSV 데이터의 각 행을 반복할 수 있습니다.
이 문서에서는 이 강력한 조합을 사용하여 대량, 일상적이고 반복적인 작업을 자동화하는 방법을 배우게 됩니다.
Import-Csv
cmdlet과ForEach
루프가 처음이거나 이미 알고 있는 내용을 복습하려는 경우, 다음 링크를 방문하여 더 자세히 알아볼 수 있습니다.
사전 요구 사항
이 문서에는 여러 예제와 데모가 포함되어 있습니다. 따라가려면 먼저 몇 가지 필요한 사항이 있습니다.
- A script editor such as Visual Studio Code, Atom, or Notepad++. Use whichever one you’re comfortable with.
- Windows PowerShell 5.1 또는 PowerShell Core 6+
- Exchange Online에 액세스하기 (Exchange Online 관련 예제를 실습할 경우 선택 사항).
Import-Csv 및 ForEach 루프 활용하기
다음 섹션에는 실제 시나리오에서 사용할 수 있는 Import-Csv cmdlet 및 ForEach 루프의 여러 예제가 있습니다. 이러한 Import CSV foreach PowerShell 예제는 각각의 목적에 특화되어 있지만, 사용된 개념과 기술이 동일하다는 것을 이해하는 것이 중요합니다.
CSV에서 레코드 읽기 및 표시
Import-Csv
및 ForEach
루프의 가장 기본적인 사용 예는 파일에서 레코드를 읽고 콘솔에 표시하는 것입니다. CSV 파일의 구조는 데이터베이스와 유사합니다. 열 헤더가 있고 각 행은 레코드로 간주됩니다.
예를 들어, 아래는 세 개의 열 – EmployeeID, Name, 및 Birthday, 그리고 네 개의 레코드로 구성된 employee.csv
라는 파일의 내용입니다.

아래 코드는 employee.csv 파일의 내용을 가져와서 가져온 데이터를 ForEach-Object
cmdlet으로 파이프합니다. 그런 다음, ForEach-Object
는 가져온 CSV의 각 레코드를 탐색하여 결합된 값을 콘솔에 표시합니다. 아래의 코드를 복사하여 list-employee.ps1로 저장하세요.
참고: 이 예제에서 사용하는 ForEach 루프의 유형은 ForEach-Object cmdlet입니다. “ForEach-Object cmdlet” 섹션을 참조하십시오. 이 문서.
스크립트를 저장한 후에는 PowerShell에서 파일 이름을 호출하여 실행하십시오. 스크립트를 실행하면 아래 스크린샷과 유사한 출력이 표시됩니다.

CSV에서 레코드 검색 및 표시
이전 예제에서는 CSV에서 모든 레코드를 읽고 표시하는 방법을 배웠습니다. 이 예제에서는 동일한 CSV 파일 employee.csv을 사용하지만 이번에는 CSV에서 EmployeeID를 검색하기 위해 PowerShell 함수를 작성합니다.
아래 코드 스니펫은 Find-Employee
라는 PowerShell 함수로, 하나의 매개변수만 가지고 있습니다. 매개변수 이름은 EmployeeID
이며 CSV에서 검색할 직원 ID 값을 받습니다.
이 함수를 사용하려면 먼저 PowerShell 세션으로 가져와야 합니다. Find-Employee
함수를 메모리로 가져오는 두 가지 방법이 있습니다:
- 아래 코드를 PowerShell에 복사하여 붙여넣기합니다.
- 스크립트를
Find-Employee.ps1
로 저장하고 dot-sourcing 기술을 사용하여 가져옵니다.
참고: 이 예제에서 사용된 ForEach 루프의 유형은 ForEach 문입니다. 이 문서의 “foreach 문” 섹션을 참조하십시오.
함수 코드가 PowerShell 세션에 가져와졌으면, 아래와 같이 함수 이름을 입력하여 호출합니다.
EmployeeID 매개변수를 사용하지 않고 함수를 실행하면, EmployeeID의 값을 검색하기 위해 프롬프트가 표시됩니다. 아래 예제 출력을 참조하십시오.

또는, 함수를 실행할 때 런타임에 EmployeeID 매개변수 값을 지정할 수도 있습니다. 아래와 같이 표시됩니다.
여러 서버로부터 디스크 공간 사용량 가져오기
시스템 관리자들 사이에서 일반적인 루틴 업무 중 하나는 여러 서버의 디스크 공간 사용량을 모니터링하는 것입니다. 각 서버에 로그인하여 디스크 공간 사용량을 확인하는 대신, 서버 이름, 드라이브 문자 및 임계값을 포함하는 CSV 목록을 만들고 PowerShell을 사용하여 CSV 파일을 가져와 각 줄을 순환하여 쿼리를 실행할 수 있습니다.
원격 서버에서 디스크 공간 사용량을 가져오는 스크립트를 만들려면 다음 헤더를 가진 CSV 목록을 먼저 만듭니다:
- servername – 이는 조회할 서버의 이름입니다.
- disk – 이는 공간 사용량을 검색할 드라이브의 문자입니다.
- threshold – 이는 GB 단위의 임계값을 정의합니다. 디스크의 여유 공간이 이 값보다 작으면 보고서에 경고 상태가 표시됩니다.
아래 예시에서는 네 개의 레코드가 나열되어 있습니다. 서버나 드라이브를 읽는 수에 따라 CSV 파일이 다를 수 있습니다.
CSV가 완료되면 파일을 servers.csv로 저장합니다. 이는 PowerShell 스크립트에서 가져올 입력 목록으로 사용됩니다.
디스크 공간 사용량을 가져오는 예제를 제공하기 위해 아래 코드를 스크립트 편집기에 복사하고 diskReport.ps1로 저장합니다. 스크립트는 CSV 경로와 동일한 위치에 저장되어야 합니다.
위의 스크립트는 실행될 때 다음 작업을 수행합니다.
$server_list
변수에 servers.csv라는 csv 파일을 가져와 저장합니다.$server_list
변수에 저장된 서버 목록을 순환합니다.- foreach 루프의 각 반복에서 현재 행은
$server
변수로 나타내어집니다. Get-WmiObject
cmdlet을 사용하여 서버에서 디스크 정보를 가져옵니다.- 표시할 관련 속성만 선택하십시오.
– 서버 이름 – 쿼리되는 시스템의 이름입니다.
– 디스크 문자 – 드라이브에 할당된 문자입니다.
– 크기 (GB) – 디스크의 크기(GB)입니다.
– 여유 공간 (GB) – 여유 공간의 크기(GB)입니다.
– 임계값 (GB) – 정의된 임계값(GB)입니다.
– 상태 – 여유 공간 (GB) 값이 임계값 (GB) 값보다 작으면 반환되는 상태는 ‘경고’입니다. 그렇지 않으면 상태는 ‘정상’입니다.
스크립트 파일 diskReport.ps1을 저장한 후에는 PowerShell에서 해당 이름을 호출하여 실행할 준비가 되었습니다.
실행된 후에는 아래 스크린샷에서 스크립트의 출력이 표시됩니다.

출력은 CSV로 내보낼 수도 있습니다. CSV로 내보내는 것은 보고서를 공유해야 할 때 유용합니다. 내보낸 CSV 파일은 이메일로 보내거나 파일 공유 또는 SharePoint 사이트에 업로드할 수 있습니다. CSV로 내보내는 자세한 내용은 Export-Csv: The PowerShell Way to Treat CSV Files as First Class Citizens를 확인하십시오.
여러 개의 Active Directory 사용자 만들기
이 시점에서 이미 Import-Csv
와 ForEach
를 사용하는 방법에 대해 확실한 아이디어가 있을 것입니다. 다음 예제에서는 New-ADUser
와 Get-ADUser
cmdlet을 추가하여 학습을 좀 더 나아가보겠습니다.
HR부서에서 새 직원 목록을 포함한 CSV 파일 ‘new_employees.csv’를 받았다고 가정해 봅시다. CSV 파일의 각 행은 새로 입사할 사용자를 나타내며 다음과 같은 열을 포함합니다: FirstName, LastName, Department, State, EmployeeID 및 Office.
사용자 이름은 직원의 성과 이름의 첫 글자를 연결한 것으로 만들어져야 합니다 (예: bparr은 사용자 Bob Parr의 경우).

CSV 파일이 저장된 후, 아래 스크립트는 Import-Csv
를 사용하여 CSV 파일 new_employees.csv를 읽습니다. 그런 다음 각 행을 반복하고 값을 New-ADUser
의 적절한 매개변수에 전달합니다.
스크립트를 실행한 후에는 새 사용자가 이미 Active Directory에 존재해야 합니다. 그러나 사용자 계정이 실제로 생성되었는지 확인하는 것이 좋은 관행입니다.
동일한 CSV 파일 new_employees.csv을 참조하여 아래 스크립트는 CSV를 가져오고 foreach를 실행하여 목록과 일치하는 ADUser 개체를 얻습니다.
Office 365 메일박스에 대리 이메일 주소 추가
Office 365 메일박스 관리에서 여러 사용자에 대한 대리 주소 추가 요청은 흔한 일입니다. 일반적으로 이러한 요청에서 관리자는 사용자 목록과 추가할 이메일 주소를 받습니다. 이와 유사한 아래의 CSV 예제입니다.

참고: PowerShell에서 Exchange Online cmdlet을 실행하기 전에 먼저 Exchange Online 관리 쉘에 로그인해야 합니다.
Import-Csv
와 ForEach
루프를 사용하여 PowerShell 스크립트에서 목록을 한 번에 처리할 수 있습니다. 아래 스크립트는 이를 어떻게 수행하는지 보여줍니다.
아래 스크립트는 new_address.csv 파일의 내용을 가져와 $user_list
변수에 저장합니다. 그런 다음, foreach()
메서드를 사용하여 PowerShell은 사용자 목록 전체를 루프 돌며 각 레코드의 username
과 email
값을 사용하여 각 메일박스에 새 이메일 주소를 추가합니다.
스크립트를 실행하면 콘솔에 출력이 표시되지 않습니다. 화면 출력이 없다는 것은 새 이메일 주소가 성공적으로 추가되었음을 의미합니다. 하지만, 이메일 주소가 추가되었는지 확인하는 방법은 무엇인가요?
동일한 CSV 파일 new_address.csv을 참조하여 새 주소가 추가되었는지 확인할 수 있습니다. 이를 위해 Import-Csv
와 ForEach
를 사용합니다.
아래 스크립트는 new_address.csv 파일의 내용을 가져와 $user_list
변수에 저장합니다. 그런 다음, foreach()
메서드를 사용하여 PowerShell은 사용자 목록 전체를 루프 돌며 새 이메일 주소가 메일박스 프록시 주소 목록에 있는지 확인합니다. 찾았다면 상태는 True를 반환하고, 그렇지 않으면 결과는 False가 됩니다.
검증 스크립트 실행시, 아래 스크린샷에 표시된 것과 같은 출력이 표시되어야 합니다. 아래 출력에서 상태는 모두 TRUE인 것을 알 수 있습니다. 이는 새로운 이메일 주소가 각 메일박스에 성공적으로 추가되었다는 것을 의미합니다.

구독자 메일링 리스트에 매일 날씨 예보를 보내기
이 예제에서는 구독자의 이메일 주소와 해당 지역을 포함하는 CSV 파일이 있다고 가정합니다. 이 구독자들은 해당 지역에 대한 특정 날짜의 날씨 예보를 포함하는 매일 이메일을 기대하고 있습니다. 아래에 파일 이름이 subscribers.csv인 샘플 CSV를 살펴보세요.

아래 CSV에는 두 명의 구독자만 있습니다. 하나는 로스앤젤레스에 있고 다른 하나는 마닐라에 있습니다.
다음 작업을 수행하는 스크립트를 생성하는 것이 목표입니다:
- subscribers.csv 파일에서 이메일과 지역 정보를 가져옵니다.
- 각 구독자에 대해:
– 구독자의 지역에 기반하여 https://wttr.in/에서 날씨 예보 이미지를 다운로드합니다.
– 날씨 예보 이미지를 구독자의 이메일 주소로 이메일로 보냅니다.
아래 스크립트는 위에서 나열한 작업을 수행합니다. 첫 세 가지 변수 – $senderAddress
, $smtpServer
, $smtpPort
만 수정하면 됩니다. 그런 다음 이 코드를 복사하여 Send-WeatherInfo.ps1
로 저장하십시오. 스크립트의 각 섹션 위에 있는 주석을 참조하여 코드의 작동 방식에 대해 자세히 알아보세요.
스크립트 실행 시, 예시 이메일 스크린샷과 같이 각 구독자에게 이메일이 전송됩니다.


요약
Import-Csv
와 ForEach
루프는 적용할 수 있는 작업에 제한이 없습니다. 열로 구분된 목록이 필요한 작업이라면 이 강력한 조합을 사용할 수 있습니다.
이 문서에서는 CSV 파일이 데이터베이스와 유사하다는 것에 대해 배웠으며, 데이터를 가져오는 Import-Csv
와 ForEach
루프 반복 중에 값을 참조하는 방법을 배웠습니다.
I hope that with the many examples provided in this article, you now understand more of the Import-Csv
and ForEach
. And, that you would be able to use the knowledge you gained in this article in your administration and automation tasks.
더 읽어보기
Source:
https://adamtheautomator.com/import-csv-and-the-foreach-loop/