PowerShell Write-Output: 사용자 친화적인 출력 동반자

안녕, 지루하고 예측 가능한 스크립트 출력과 작별하세요! PowerShell Write-Output cmdlet을 사용하면 PowerShell 스크립트에 창의성과 개성을 더할 수 있습니다.

Write-Output cmdlet은 강력한 도구로, 자동화 및 시스템 관리에 완벽한 동반자입니다. 이 튜토리얼에서는 Write-Output cmdlet의 잠재력을 최대화하는 방법을 배우게 됩니다.

준비되셨나요? 계속 읽어보고 Write-Output cmdlet의 마법을 발견하세요!

전제 조건

콘솔에 객체 출력

PowerShell Write-Output cmdlet은 개체를 출력 스트림에 작성하고 명령 또는 메시지의 출력을 콘솔에 표시합니다. 그러나 이 도구가 출력을 어떻게 더 의미 있고 가치 있게 만들어내는지에 놀라게 될 것입니다.

대신 출력을 콘솔에 표시하는 대신 Write-Output cmdlet을 사용하여 출력을 사용자 정의하세요. Write-Output cmdlet은 문자열, 정수, 배열 및 복잡한 객체와 같은 모든 개체 또는 데이터 유형을 출력할 수 있습니다.

콘솔에 Hello, World! 메시지를 출력하려면 아래 명령을 실행하세요.

Write-Output "Hello, World!”

Write-Output cmdlet의 가장 기본적인 기능을 아래에서 볼 수 있습니다. 그러나 이 cmdlet의 중간에서 고급 사용법을 더 알아보려면 계속 읽어보세요.<>

Outputting objects to the console

객체를 다른 명령에 전달하기

출력을 콘솔에 표시하는 것 외에도 Write-Output 명령을 사용하여 객체를 또 다른 명령으로 보내 추가 처리를 수행할 수 있습니다. 어떻게? 파이프라인 연산자(|)를 사용합니다. 파이프라인을 사용하면 Write-Output이 자동화 및 시스템 관리 작업에 유용한 다목적 명령이 됩니다.

자원을 가장 많이 사용하는 프로세스를 확인하려면 CPU와 같은 모든 프로세스의 목록을 가져와야 합니다.

다음 명령을 실행하여 다음을 수행하세요:

  • 시스템에서 실행 중인 모든 프로세스 목록(Get-Process)을 가져옵니다.
  • 출력 목록을 파이프라인에 전달하여 Sort-Object 명령에 전달합니다. 파이프라인 연산자를 사용하면 여러 명령을 연결하여 하나의 명령의 출력을 다른 명령의 입력으로 처리할 수 있습니다.
  • 프로세스 목록을 (Sort-Object) 정렬하십시오. CPU 사용량을 -Descending 순으로 정렬합니다.
$processes = Get-Process
Write-Output $processes | Sort-Object CPU -Descending

이 자습서의 명령 중 하나를 PowerShell 스크립트로 넣어 실행할 수 있다는 점을 참고하세요.

정렬된 목록이 아래와 같이 콘솔에 표시됩니다.

Passing objects to another command

사용자 지정 형식으로 객체 출력

Write-Output cmdlet의 기본 출력 형식을 본 것입니다. 그러나 필요한 경우 개인적인 터치를 추가하기 위해 사용자 지정 형식으로 객체를 출력할 수도 있습니다. 특정 객체 속성을 표시하거나 출력의 모양을 사용자 지정하는 경우 사용자 지정 형식이 유용할 수 있습니다.

사용자 지정 형식으로 객체를 출력하려면 다음과 같이 Format-CustomWrite-Output cmdlet을 함께 사용하면 됩니다.

사용자 지정 출력 형식을 만들고, 그런 다음 Format-Custom cmdlet의 출력을 Write-Output에 파이프합니다.<>

아래 명령을 실행하면 출력이 생성되지 않지만 출력할 속성과 해당 값이 있는 객체(해시테이블)가 생성됩니다.

$object = [pscustomobject]@{
Property1 = "Value1"
Property2 = "Value2"
Property3 = "Value3"
}

이제 다음 명령을 실행하여 다음을 수행하십시오:

  • 해시 테이블($object)의 출력(Write-Output)에 사용자 지정 형식(Format-Table)을 만듭니다. Property1, Property2, 및 Property3 속성을 열로 설정합니다.
  • 컨텐츠에 맞게 열 너비(-AutoSize)를 조정하십시오.
$object | Format-Table -Property Property1, Property2, Property3 -AutoSize | Write-Output
Creating a custom format for an object output

또는 Write-Output으로 객체를 속성-값 쌍의 목록으로 출력하기 위해 Format-List cmdlet을 사용할 수 있습니다.

$object | Format-List -Property Property1, Property2, Property3 | Write-Output
Outputting the object as a list of property-value pairs

단일 Entity로 Collection 객체 전달

Write-Output은 기본적으로 각 컬렉션 요소를 개별적으로 파이프라인을 통해 보냅니다. 이를 열거라고 합니다. 그러나 전체 컬렉션 개체를 단일 Entity로 전달하도록 -NoEnumerate 매개변수를 추가하여이 동작을 방지할 수 있습니다.

-NoEnumerate 매개변수가 작동하는 방법을 보려면 다음 단계를 따르십시오:

다음 명령을 실행하여 다음을 수행하십시오:

  • $numbers의 배열을 선언하십시오. (1,2,3).
  • 파이프라인을 통해 전달된 개체 수(Measure-Object)를 계산하십시오.
  • 출력 객체 측정하기 (Write-Output $numbers).

NoEnumerate 매개 변수 없이 Measure-Object는 각 $numbers 배열 요소를 열거하고 개별적으로 파이프라인을 통해 전달하여 세 개의 카운트를 반환합니다 (3).

# 배열 선언
$numbers = 1,2,3
# 파이프라인을 통해 전달된 개체 카운트 출력
Write-Output $numbers | Measure-Object
Outputting an array object measurement

이제 다음 명령을 실행하여 파이프라인을 통해 전달된 개체 수를 출력합니다.

그러나 -NoEnumerate 매개 변수를 추가했으므로 Measure-Object cmdlet은 개체를 단일 엔터티로 처리하여 하나의 카운트를 반환합니다 (1).

# 배열 선언
$numbers = 1,2,3
# 파이프라인을 통해 전달된 개체 카운트를 단일 엔터티로 출력
Write-Output -NoEnumerate $numbers | Measure-Object
Outputting object count as a single entity

Write-Output 명령을 괄호로 둘러싸면 (즉, (Write-Output 1,2,3)) -NoEnumerate 매개 변수에 관계없이 열거가 강제로 발생합니다.

메뉴 시스템 및 입력 프롬프트 생성

Write-Output cmdlet의 또 다른 훌륭한 사용 사례는 사용자에게 입력을 요청하는 PowerShell 스크립트를 사용하여 메뉴 시스템을 만드는 것입니다.

선호하는 텍스트/코드 편집기로 .ps1 파일을 만들고 아래 코드를 채워서 파일을 저장합니다. 파일의 이름은 원하는 대로 지정할 수 있지만, 이 튜토리얼의 선택은 myoutput.ps1입니다.

아래 코드는 사용자에게 옵션 목록에서 옵션을 선택하도록 계속해서 프롬프트하는 루프를 사용하며 사용자가 Exit 옵션을 선택할 때까지 계속됩니다.

# $exit 변수를 $false로 초기화합니다.
$exit = $false

# 사용자가 "종료" 옵션을 선택할 때까지 실행될 루프를 시작합니다.
while (!$exit) {

  # 사용자에게 옵션 목록을 표시합니다.
  Write-Output "Please select from the following options:"
  Write-Output "1. Option 1"
  Write-Output "2. Option 2"
  Write-Output "3. Option 3"
  Write-Output "4. Exit"

  # 사용자로부터 선택을 요청합니다.
  $selection = Read-Host

  # 사용자의 선택에 따라 다른 코드를 실행하기 위해 switch 문을 사용합니다.
  switch ($selection) {
    1 {
      # 사용자가 옵션 1을 선택한 경우 메시지를 표시하고 옵션 1에 대해 작업을 수행합니다.
      Write-Output "You selected Option 1."
      # 옵션 1에 대해 작업을 수행합니다.
    }
    2 {
      # 사용자가 옵션 2를 선택한 경우 메시지를 표시하고 옵션 2에 대해 작업을 수행합니다.
      Write-Output "You selected Option 2."
      # 옵션 2에 대해 작업을 수행합니다.
    }
    3 {
      # 사용자가 옵션 3을 선택한 경우 메시지를 표시하고 옵션 3에 대해 작업을 수행합니다.
      Write-Output "You selected Option 3."
      # 옵션 3에 대해 작업을 수행합니다.
    }
    4 {
      # 사용자가 옵션 4를 선택한 경우 $exit를 $true로 설정하여 루프를 종료합니다.
      $exit = $true
    }
  }
}

이제 작업 디렉토리에서 스크립트 (myoutput.ps1)를 실행합니다.

./myoutput.ps1

아래와 같이 선택한 옵션에 연결된 메시지가 표시되며 옵션 1, 2, 또는 3을 선택할 때입니다. 그러나 옵션 4를 선택하면 스크립트가 종료됩니다.

Creating a menu system and input prompts

스플래시 화면 또는 환영 메시지 표시

제외하고 사용자가 선택할 수 있는 옵션을 나열하는 것 외에도 Write-Output을 사용하여 화면 표시기나 환영 메시지를 표시할 수도 있습니다. 화려한 화면 표시기는 스크립트에 전문적이고 정교한 인상을 줍니다.

다음 아래의 코드로 myoutput.ps1 파일 내의 코드를 교체하여 스크립트를 실행할 때 환영 메시지(배너의 스플래시 화면)를 출력합니다.

배너의 텍스트와 포맷을 수정하여 스플래시 화면을 사용자 정의할 수 있습니다. 원하는 대로 로고나 텍스트와 같은 추가 요소를 스플래시 화면에 추가할 수 있습니다.

# 화면 지우기
Clear-Host

# Write-Output을 사용하여 스플래시 화면 표시
Write-Output "##############################################"
Write-Output "#                                            #"
Write-Output "#   Welcome to the SuperScript 3000!         #"
Write-Output "#                                            #"
Write-Output "##############################################"

이제 스크립트를 실행하여 스플래시 화면이 어떻게 보이는지 확인하세요.

./myoutput.ps1
Displaying a splash screen or welcome message

진행률 표시줄 표시

스크립트를 실행할 때 진행 표시기는 사용자가 스크립트가 실행되고 있는지 여부에 대한 불안감을 없애줍니다. 진행률 표시줄은 사용자에게 긴 시간 동안 실행되는 스크립트나 작업의 진행 상황을 표시하는 데 유용할 수 있습니다. 다행히도 Write-Output cmdlet을 사용하여 원하는대로 진행률 표시줄을 만들 수 있습니다.

myoutput.ps1 파일을 열고, 스크립트 파일 내의 기존 코드 아래에 다음 코드를 추가합니다.

아래 코드는 while 루프를 사용하여 여러 단계를 반복합니다. 이 예제에서는 100단계입니다. 루프의 각 반복은 완료된 단계의 백분율을 계산하고 Write-Output을 사용하여 진행률 표시줄을 표시합니다.

진행률 표시줄은 다음 연산자의 조합을 사용하여 생성됩니다:

  • * – 지정된 횟수만큼 문자열을 반복합니다
  • $() – 표현식의 출력을 문자열에 포함시킵니다.

스크립트는 다음 단계로 넘어가기 전에 진행을 시뮬레이트하기 위해 (Start-Sleep) 1초 동안 일시 정지합니다.

# 진행률 바의 총 단계 수 설정
$steps = 100

# 현재 단계 카운터를 초기화합니다
$currentStep = 0

# 단계 수만큼 실행될 루프 시작
while ($currentStep -lt $steps) {
  # 현재 단계 카운터를 증가합니다
  $currentStep++

  # 완료된 단계의 백분율을 계산합니다
  $percentComplete = [int] ($currentStep / $steps * 100)

  # Write-Output을 사용하여 진행률 바 표시
  Write-Output "Progress: [$("=" * $percentComplete)$(" " * ($steps-$percentComplete))] $percentComplete% complete"

  # 진행을 시뮬레이트하기 위해 1초 일시 정지
  Start-Sleep -Seconds 1
}

이제 스크립트를 실행하고 진행률 바가 어떻게 작동하는지 확인해보세요.

./myoutput.ps1

아래에서 스플래시 화면과 함께 진행률 바를 볼 수 있습니다.

Displaying a progress bar

결론

이 튜토리얼에서는 Write-Output이 어떻게 객체, 데이터 유형, 그리고 사용자 정의 형식을 쉽게 출력할 수 있는지 보았습니다. 게다가, 파이프라인 연산자를 사용하여 출력을 다른 명령으로 보내 추가 처리를 할 수 있는 방법에 대해 알아보았습니다.

단순한 메시지 출력이나 복잡한 자동화 작업을 작성하든, Write-Output은 더 많은 정보를 담은 전문적인 PowerShell 스크립트를 만들기 위해 꼭 필요한 도구입니다.

이 새로운 지식을 활용하여, 왜 .txt.xml 파일과 같은 다른 파일 형식으로 출력을 작성하지 않을까요? 목적에 관계없이, 출력 복사본은 시스템이나 애플리케이션의 문제 해결에 유용합니다. Write-OutputOut-File cmdlet은 당신이 필요로 한 힘을 부여해 줍니다.

Source:
https://adamtheautomator.com/powershell-write-output/