포괄적인 PowerShell 주석 가이드
Aug 25, 2025
PowerShell에서 효과적인 주석 처리는 스크립트의 가독성, 협업, 그리고 장기적인 유지보수성을 향상시킵니다. PowerShell은 단일 라인(#) 및 블록( <# … #> ) 주석과 함께, 인라인 노트, 주석 기반 도움말, 조직을 위한 regions 같은 고급 기법도 지원합니다. 모범 사례로는 구문(syntax)보다 로직과 의도를 설명하고, 코드 변경 사항에 맞춰 주석을 업데이트하며, 막연하고 오래되었거나 과도한 노트를 피하는 것이 있습니다. 구조화된 주석은 스크립트를 더 명확하게 만들고, 더 안전하게 하며, 디버깅을 더 쉽게 합니다.
소개
Windows PowerShell 스크립트를 작성한다면, PowerShell 주석을 효과적으로 사용하는 방법을 이해하는 것이 중요합니다. 이 문서가 도움이 될 것입니다. 이 글에서는 스크립트에 주석을 포함할 수 있는 핵심 방법을 설명하고, 각 방법을 언제 사용하는 것이 적절한지에 대한 가이드를 제공합니다. 또한 주석의 인기 있는 사용 사례를 설명하고, 따라야 할 모범 사례와 피해야 할 흔한 실수를 제시합니다.
PowerShell에서 주석 이해하기
PowerShell의 주석에는 다양한 유용한 활용 방법이 있습니다. 주석은 스크립트를 더 쉽게 이해하고 유지 관리할 수 있도록 하는 데 필수적입니다. 스크립트나 특정 코드 섹션의 목적, 논리 또는 기능을 설명하기 위해 주석을 사용하는 것은 스크립트를 사용, 수정 또는 문제 해결해야 하는 모든 사람에게 큰 도움이 됩니다. 또한 주석은 다른 팀원과의 협업을 촉진하고 구두 설명이 필요할 때를 줄여줍니다. PowerShell에 대한 숙련도가 낮은 사람들도 스크립트를 따라 하고 기술 수준을 향상하는 데 도움이 됩니다.
주석은 개발 및 테스트 팀이 코드의 한 줄 이상을 일시적으로 비활성화하는 데도 도움이 됩니다. PowerShell 인터프리터는 주석을 무시하므로, 코드를 주석 처리하기만 하면 간단히 비활성화할 수 있습니다. 코드를 삭제한 것이 아니라 주석으로 처리했기 때문에, 나중에 쉽게 복원할 수 있습니다. 또한 상세한 주석은 특정 결정을 내린 이유에 대한 맥락을 제공함으로써 업데이트와 문제 해결 과정에서 혼란을 예방해줍니다.
PowerShell에서 사용하는 주석의 종류
PowerShell에서 주석 다는 방법
PowerShell에서 기본적으로 사용되는 댓글(주석)의 두 가지 유형은 한 줄 주석(single-line)과 여러 줄(블록) 주석(multi-line (block))입니다.
한 줄 주석
PowerShell에서 한 줄 주석을 만들려면 해시 기호(#)만 사용하면 됩니다. 해시 기호 뒤에 오는 어떤 텍스트든 PowerShell 해석기가 무시합니다. 다음은 한 줄 주석의 예입니다:
# The following script narrow down the users who having logged in for 90 days.
$InactiveUsers = Get-ADUser -Filter {LastLogonDate -lt (Get-Date).AddDays(-90)}
# This is another example of a single-line comment.
Get-Process -Name Notepad
한 줄 주석은 언제 사용하나요?
다음은 한 줄 주석을 사용하는 대표적인 사용 사례입니다:
- 그 뒤에 나오는 한 줄 또는 코드 블록의 목적을 설명합니다. 예: 함수:
# Calculate the factorial of a number using recursion.
function Get-Factorial {
param ([int]$number)
if ($number -le 1) {
return 1
}
return $number * (Get-Factorial -number ($number - 1))
}
- 변수의 목적을 문서화합니다:
# Store the list of server names to be checked for connectivity
$servers = @("Server1", "Server2", "Server3")
- 코드를 일시적으로 추가했거나 주석 처리한 이유를 설명합니다:
# Debugging: Output the current value of the counter
# Write-Output "Counter value is $counter"
여러 줄(블록) 주석
PowerShell 주석 블록을 사용하면 여러 줄에 걸친 설명 메모를 추가할 수 있습니다. 블록 주석은 태그 <# 로 시작하고 #> 태그로 끝납니다. 이 두 태그 사이의 모든 텍스트는 PowerShell 해석기에 의해 무시됩니다.
다음은 스크립트에 대한 자세한 정보를 제공하는 PowerShell의 여러 줄 주석 예시입니다:
<#
This script performs the following tasks:
1. Retrieves the list of all running processes on the system.
2. Filters the processes to include only those consuming more than 100 MB of memory.
3. Outputs the filtered list to the console for review.
Author: Admin
Date: 2025-01-07
#>
# Retrieve all running processes
$processes = Get-Process
# Filter processes using more than 100 MB of memory
$highMemoryProcesses = $processes | Where-Object { $_.WS -gt 100MB }
# Output the filtered processes
$highMemoryProcesses | Format-Table -AutoSize
블록 주석은 언제 사용하나요
PowerShell의 블록 주석은 길고 자세한 설명을 제공해야 할 때 이상적입니다. 각 문을 해시 기호(#)로 시작할 수도 있지만, 블록 주석을 사용하면 스크립트가 더 깔끔하고 읽기 쉬워집니다.
여러 줄 주석의 주요 사용 예시는 다음과 같습니다:
- 스크립트에 대한 메타데이터 제공:
<#
Script Name: Cleanup-TempFiles.ps1
Author: Jon Mill
Description: This script deletes temporary files older than 30 days
from specified directories to free up disk space.
Last Modified: 2025-01-07
#>
- 복잡한 로직을 설명하거나 코드의 한 부분에 대한 맥락을 제공합니다:
<#
The following block of code checks the connectivity status of multiple servers.
If a server is unreachable, it logs the error and skips to the next one,
ensuring the script doesn't terminate unexpectedly.
#>
foreach ($server in $servers) {
if (-Not (Test-Connection -ComputerName $server -Count 1 -Quiet)) {
Write-Output "$server is unreachable" >> error.log
continue
}
# Proceed with the next task
}
- 주석 태그를 사용해 디버깅 또는 테스트 중에 코드의 큰 부분을 일시적으로 비활성화합니다:
<#
# Commented out the block below for debugging purposes
Write-Output "Starting debugging session"
$debugVar = $true
#>
고급 주석 기법
인라인 주석, 주석 기반 도움말, 섹션 헤더와 같은 고급 주석 기법은 스크립트를 더욱 전문적이고 사용자 친화적으로 만듭니다.
인라인 주석
해시 기호로 시작하면 코드와 같은 줄에 주석을 포함할 수 있습니다. 다음의 # 기호 이후의 내용은 모두 주석으로 처리됩니다.
인라인 주석은 스크립트의 흐름을 방해하지 않으면서도 다른 사용자가 핵심 내용을 빠르게 이해할 수 있도록, 로직이나 기타 세부 사항에 대한 간단한 설명을 덧붙이는 데 가장 적합합니다. 다음은 간단한 예입니다:
for ($i = 0; $i -lt 5; $i++) { # Loop from 0 to 4
Write-Output "Iteration $i" }
스크립트 및 함수의 주석 기반 도움말
주석 기반 도움말은 코드 내부에 스크립트를 문서화하기 위한 구조화된 방법을 제공합니다. 여러 줄 주석에서 특수 주석 태그를 사용하면 Get-Help cmdlet을 통해 스크립트에 대해 제공할 정보를 지정할 수 있습니다. 예를 들어, .SYNOPSIS 태그를 사용하여 제공한 설명은 사용자가 Get-Help 를 함수 또는 스크립트에서 실행할 때 표시됩니다. 이러한 방식은 별도의 문서 작성 필요성을 줄여, 스스로 문서화되는 코드를 만들어 줍니다.
미리 정의된 태그는 다음과 같습니다:
- .SYNOPSIS — 이 태그를 사용하여 스크립트 또는 함수가 수행하는 작업을 간단히 요약하세요:
.SYNOPSIS
Copies files from one directory to another.
- .DESCRIPTION — 이 태그를 사용하여 스크립트의 기능을 자세히 설명하고, 사용 시 주의해야 할 중요한 사항이 있으면 함께 안내하세요:
.DESCRIPTION
This function copies files from a source directory to a destination directory.
It allows users to copy files recursively and optionally overwrite existing files.
- .PARAMETER — 이 태그를 사용하여 스크립트가 허용하는 각 매개변수(무엇을 하는지, 유형, 그리고 사용 방법에 대한 특정 규칙 포함)를 정의하세요:
.PARAMETER Source
The path of the source directory from which the files will be copied. The source must be a valid directory path.
.PARAMETER Destination
The path to the destination directory where the files will be copied to.
The destination must be a valid directory path.
.PARAMETER Overwrite
A switch to determine whether existing files at the destination should be overwritten.
If not specified, existing files will not be overwritten.
- .EXAMPLE — 이 태그를 사용하여 스크립트 또는 함수의 자세한 예시를 제공함으로써 사용자가 호출 방법과 예상되는 출력 결과를 이해할 수 있도록 하세요:
.EXAMPLE
Copy-Files -Source "C:\Data" -Destination "D:\Backup" -Overwrite
Copies files from C:\Data to D:\Backup, overwriting existing files at the destination.
Get-Help 통합의 실제 예
다음 스크립트는 파일을 백업하도록 설계되었습니다. 시작 부분의 PowerShell 스크립트 주석은 위에 자세히 설명된 태그를 사용합니다.
<#
.SYNOPSIS
Backs up files from the source to the destination folder.
.DESCRIPTION
This script copies all files from the specified source folder to the destination folder.
.PARAMETER Source
Specifies the path to the source folder.
.PARAMETER Destination
Specifies the path to the destination folder.
.EXAMPLE
.\Backup-Script.ps1 -Source "C:\Data" -Destination "D:\Backup"
Copies all files from C:\Data to D:\Backup.
#>
param (
[string]$Source,
[string]$Destination
)
if (-Not (Test-Path -Path $Source)) {
Write-Error "Source path does not exist."
exit
}
if (-Not (Test-Path -Path $Destination)) {
Write-Host "Destination path does not exist. Creating it..."
New-Item -ItemType Directory -Path $Destination
}
Copy-Item -Path "$Source\*" -Destination $Destination -Recurse
Write-Host "Backup completed successfully."
아래 스크린샷은 태그가 사용자가 Get-Help 명령을 통해 사용 정보를 빠르게 검색할 수 있게 해주는 방법을 보여줍니다:
PowerShell 주석 작성 모범 사례
코드를 더 읽기 쉽고, 자신과 다른 사람이 이해하기 쉽게 만들기 위해서는 주석을 효과적으로 사용하는 것이 매우 중요합니다. 다음은 따라야 할 주요 모범 사례입니다.
코드를 지저분하게 만들지 말고 필요한 곳에만 주석 추가
주석은 코드 전반에 걸쳐 자주 사용하여 함수의 목적, 복잡한 알고리즘의 논리, 변수의 의미, 그리고 코드에 포함된 가정이나 제한 사항을 설명해야 합니다.
다만, 유용한 맥락을 제공하면서도 불필요한 복잡함을 피하는 것 사이에는 균형을 맞추는 것이 중요합니다. 다음 지침을 고려해 보세요:
- 간단한 메모에는 인라인 주석 또는 한 줄 주석을 사용하세요.
- 더 긴 설명이 필요한 경우 PowerShell의 다중 줄 주석을 사용하세요.
- 단순하거나 자명한 작업에 대해서는 주석을 달지 않도록 하세요.
- 문법이 아니라 의도에 대해 주석을 달아야 합니다.
- 특히 복잡한 코드의 경우, 주석을 사용해 로직이나 의도를 명확히 하세요.
- 주석을 사용해 스크립트의 가정, 요구 사항 및 알려진 문제를 강조하세요.
- 주석이 일관되고 깔끔하게 유지되도록 서식과 스타일을 따르세요.
- 기본 제공 주석 기반 도움말을 사용해 함수와 스크립트에 대한 자세한 설명을 추가하세요.
독자를 압도하지 않으면서도 가치를 더하는 명확하고 간결한 주석의 예시는 다음과 같습니다:
# Get-Service returns all running services.
Get-Service
# Filter the results to include only services
# related to the World Wide Web.
Get-Service | Where-Object {$_.DisplayName -like "*WWW*"}
# Stop the selected WWW services.
Get-Service | Where-Object {$_.DisplayName -like "*WWW*"} | Stop-Service
주석의 과다 사용과 과소 사용을 피하세요
코드의 모든 한 줄마다 주석을 다는 것은 특히 코드 자체가 이미 이해하기 쉬운 경우, 읽고 이해하는 데 어려움을 줄 수 있습니다. 아래는 주석을 과도하게 사용하는 예입니다:
# Assign the value 10 to the variable $number
$number = 10
# Add 5 to the variable $number
$number = $number + 5
반대로 주석을 충분히 제공하지 않으면, 특히 복잡한 코드일수록 코드의 논리와 목적을 이해하기 어려울 수 있습니다. 예를 들어, 아래 코드는 Active Directory에서 비활성화된 모든 사용자를 활성화하도록 설계되어 있지만, 주석이 부족해서 다음 사항을 알기 어렵습니다:
$users = Get-ADUser -Filter * | Where-Object {$_.Enabled -eq $false}
$users | ForEach-Object {
Set-ADUser -Identity $_.SamAccountName -Enabled $true
}
디버깅에는 임시 주석을 사용하세요
코드를 주석 처리하는 것은 코드의 문제를 디버깅하고 해결하는 데 유용한 기법입니다. 이를 통해 문제를 격리하고 실행 동작 방식을 이해하는 데 도움이 될 수 있습니다. 아래 예시에서처럼 코드가 비활성화된 이유를 설명하는 주석을 반드시 사용하세요:
# Log the value of the Source variable for debugging
Write-Host "Debug: Source path is $Source"
# Temporarily disable file copying to test directory creation
# Copy-Item -Path "$Source\*" -Destination $Destination -Recurse
복잡한 코드는 여러 개의 주석을 사용하세요
복잡한 로직을 설명하려면 코드를 더 작은 단위로 나누고 각 단위마다 설명하는 주석을 추가하세요. 예시는 다음과 같습니다:
# Calculate the factorial of a number
function Calculate-Factorial {
param(
[int]$Number
)
# Base case: Factorial of 0 is 1
if ($Number -eq 0) {
return 1
}
# Recursive case: Factorial of N is N * Factorial(N-1)
else {
return $Number * (Calculate-Factorial ($Number - 1))
}
}
무엇을 하는지뿐 아니라, 왜 하는지 설명하세요
스크립트의 배경이 되는 추론 과정을 설명하기 위해 주석을 사용하면, 향후 수정과 디버깅 작업을 위한 맥락을 제공함으로써 코드의 유지보수성을 높일 수 있습니다.
# Retry the operation up to 3 times to handle intermittent network failures
# This prevents the script from failing on occasional, recoverable issues
for ($i = 0; $i -lt 3; $i++) {
try {
# Attempt the operation
Copy-Item -Path $Source -Destination $Destination
break # Exit the loop if the operation is successful
}
catch {
if ($i -eq 2) { throw "Failed after 3 attempts" }
Start-Sleep -Seconds 2 # Wait before retrying
}
}
가독성을 높이기 위해 주석 형식 지정
주석을 효과적으로 형식 지정하면 코드의 가독성이 향상됩니다. 들여쓰기와 정렬은 물론, 주석의 위치도 신중히 확인하세요. 예를 들어 설명하는 코드 앞에 항상 주석을 배치하는 식으로 일관성을 유지합니다. 다음 코드는 좋은 형식이 주석을 더 효과적으로 만드는 방법을 보여줍니다:
# This function retrieves a list of all running processes.
function Get-RunningProcesses {
# Get all running processes
Get-Process |
# Select only the process name and ID
Select-Object ProcessName, ID
}
PowerShell 주석을 위한 특별한 사용 사례
버전 관리를 위해 주석 사용하기
버전 관리를 개선하려면 PowerShell 주석을 사용해 시간이 지나면서 스크립트에 적용된 변경 사항을 문서화하세요. 날짜, 작성자, 변경 사유 같은 정보를 포함하는 일관된 형식을 사용합니다. 이러한 이력 기록은 개발자가 각 업데이트의 배경 맥락을 이해하는 데 도움이 됩니다.
# Version 2.0 - 2025-01-10
# Added a new parameter for logging options and enhanced error handling.
# Updated the file backup logic to support incremental backups.
param (
[string]$Source,
[string]$Destination,
[switch]$EnableLogging # New parameter to enable logging
)
# Check if source exists
if (-Not (Test-Path -Path $Source)) {
Write-Error "Source path does not exist."
exit
}
# Log file creation if logging is enabled
if ($EnableLogging) {
$logPath = "$Destination\backup_log.txt"
"Backup started at $(Get-Date)" | Out-File -Append $logPath
}
# Backup files (incremental logic added in Version 2.0)
if (-Not (Test-Path -Path $Destination)) {
New-Item -ItemType Directory -Path $Destination
}
Copy-Item -Path "$Source\*" -Destination $Destination -Recurse
# Log completion if logging is enabled
if ($EnableLogging) {
"Backup completed at $(Get-Date)" | Out-File -Append $logPath
}
Regions를 사용해 코드를 구성하기
<#region 및 <#endregion 태그는 코드의 논리적 섹션을 구분하는 데 사용할 수 있습니다. 예를 들어 데이터 처리, 구성 또는 로깅과 같은 작업을 수행하는 스크립트의 일부에 태그를 지정할 수 있습니다. 이러한 방식은 복잡한 스크립트를 탐색하고 이해하기 쉽게 해줍니다. 예를 들어 개발자는 현재 작업 중이 아닌 섹션을 접어 시각적 복잡성을 줄이고 집중도를 높일 수 있습니다.
다음 스크립트는 세 가지 regions로 나뉩니다: 데이터 가져오기 함수,데이터 처리 함수 및 출력 함수. Region 주석 블록은 목적을 설명하는 데 사용됩니다.
<#region Introduction
This script retrieves a list of all running processes.
It then filters the list to include only processes
that match a specific criterion.
#>
# Get all running processes
$Processes = Get-Process
<#region Filtering
Filter processes based on criteria
(e.g., process name, CPU usage).
#>
$FilteredProcesses = $Processes | Where-Object {$_.ProcessName -eq "notepad"}
<#endregion Filtering
<#region Output
Display the filtered processes.
#>
$FilteredProcesses | Format-List
<#endregion Output
<#endregion Introduction
PowerShell 주석을 사용한 문제 해결과 디버깅
주석을 사용해 버그를 분리하기
주석은 변수 값, 잠재적인 문제 영역 또는 문제 해결 단계와 같은 디버깅을 위한 정보를 삽입하는 데 사용할 수 있습니다.
주석으로 코드를 비활성화하기
코드를 삭제하는 대신 일시적으로 주석 처리하면, 오류의 원인을 더 빠르게 좁혀볼 수 있습니다.
주석으로 오류 문서화하기
주석은 이미 알려진 문제나 문제 해결 팁을 문서화하는 데 훌륭한 방법이며, 특히 특정 조건에서 오류가 발생하기 쉬운 코드에 특히 유용합니다. 잠재적인 해결책이나 설명을 포함한 주석을 추가하면 문제가 발생했을 때 본인과 다른 사람들이 빠르게 문제를 해결하는 데 도움이 됩니다.
# Get-Service returns an error on some server versions due to a known bug.
# Workaround: Use WMI to retrieve service status.
try {
Get-Service -Name "SensorService"
} catch {
Get-WmiObject Win32_Service -Filter "Name=''SensorService"
}
협업을 위한 PowerShell 주석 작성
주석은 스크립트를 더 쉽게 읽고, 이해하고, 유지 관리할 수 있게 해 협업을 향상시킵니다. 또한 신규 기여자의 온보딩 속도를 높일 수 있습니다.
팀에서 사용할 스크립트 문서화
스크립트의 목적, 코드 각 구역의 논리, 그리고 발생할 수 있는 위험 요소를 주석으로 설명하면 팀원 간 지식 공유가 향상되고 디버깅 및 소요 시간이 줄어듭니다.
예를 들어, 아래 스크립트 상단의 블록 주석에는 목적, 사전 요구 사항, 매개변수가 개요로 설명되어 있습니다:
<#
Script Name: Create-ADUserAccounts.ps1
Description: Automates the creation of Active Directory user accounts from a CSV file.
Prerequisites:
- Active Directory module installed.
- A valid CSV file with columns: FirstName, LastName, UserName, and Email.
Parameters:
-CSVPath: Path to the input CSV file.
-OU: Organizational Unit where accounts will be created.
Usage:
.\Create-ADUserAccounts.ps1 -CSVPath "C:\Users.csv" -OU "OU=Users,DC=Domain,DC=Com"
#>
주석을 통해 지식을 공유하기
주석은 팀의 모든 구성원이 스크립트의 논리, 각 구역의 목적, 특정 접근 방식을 선택한 이유, 그리고 잠재적인 과제를 이해하는 데 도움이 됩니다. 이러한 공통된 이해는 문제 해결, 디버깅, 향후 개선을 더 쉽게 합니다. 예를 들어 스크립트에 알려진 소프트웨어 제한에 대한 우회 방법이 포함되어 있다면, 주석으로 문제를 문서화하고 해결책을 정당화할 수 있어 다른 사람들이 동일한 조사를 반복할 필요가 없습니다.
다음은 실행 중이 아닌 경우 서비스를 다시 시작하기 위한 스크립트에 대한 정보를 효과적으로 공유하기 위해 주석을 사용하는 방법의 예입니다:
<#
Script Name: Ensure-ServiceRunning.ps1
Description: Checks if a specified service is running and restarts it if necessary.
Purpose:
- Ensures critical services stay operational without manual intervention.
Decisions:
- Used “Get-Service” for simplicity and compatibility.
- Restart logic avoids redundancy by checking the current status first.
Usage:
.\Ensure-ServiceRunning.ps1 -ServiceName "Spooler"
#>
param (
[Parameter(Mandatory)]
[string]$ServiceName # Name of the service to check
)
# Check the current status of the service
$service = Get-Service -Name $ServiceName -ErrorAction Stop
if ($service.Status -ne "Running") {
# Log and attempt to restart the service if not running
Write-Host "Service '$ServiceName' is not running. Attempting to restart..."
try {
Restart-Service -Name $ServiceName -Force
Write-Host "Service '$ServiceName' has been restarted successfully."
} catch {
Write-Error "Failed to restart the service '$ServiceName': $_"
}
} else {
Write-Host "Service '$ServiceName' is already running."
}
PowerShell 주석 달기 예시 및 시나리오
다음 스크립트는 디스크 사용량을 모니터링하고 여유 공간이 부족하면 이메일 알림을 보냅니다:
<#
Script Name: Monitor-DiskUsage.ps1
Description: Checks each logical drive and sends an alert if free space is below the defined threshold.
Purpose:
- Prevents system issues caused by insufficient storage.
Usage:
.\Monitor-DiskUsage.ps1 -Threshold 10 -Email "admin@Netwrix.com"
#>
param (
[Parameter(Mandatory)]
[int]$Threshold, # Minimum free space in GB to trigger an alert
[Parameter(Mandatory)]
[string]$Email # Email address for the alert
)
# Retrieve disk information
$drives = Get-PSDrive -PSProvider FileSystem
foreach ($drive in $drives) {
if ($drive.Free -gt 0) {
$freeSpaceGB = [math]::Round($drive.Free / 1GB, 2)
if ($freeSpaceGB -lt $Threshold) {
Write-Warning "Drive $($drive.Name) has low space: $freeSpaceGB GB remaining."
# Send an alert email (replace with real SMTP details)
try {
Send-MailMessage -From "alerts@netwrix.com" -To $Email -Subject "Low Disk Space Alert" `
-Body "Drive $($drive.Name) has only $freeSpaceGB GB remaining." `
-SmtpServer "smtp.domain.com"
} catch {
Write-Error "Failed to send alert email: $_"
}
}
}
}
아래 스크립트는 사용하지 않는 계정을 비활성화한 다음 특정 OU로 이동하여 Active Directory의 사용자 계정을 정리합니다:
<#
Script Name: Cleanup-ADUsers.ps1
Description: Disables and moves inactive user accounts to a specified OU.
Purpose:
- Helps maintain a clean and secure Active Directory environment.
Usage:
.\Cleanup-ADUsers.ps1 -OU "OU=Inactive,DC=Netwrix,DC=Com" -DaysInactive 90
#>
param (
[Parameter(Mandatory)]
[string]$OU, # Target OU for inactive users
[Parameter(Mandatory)]
[int]$DaysInactive # Number of days since last logon
)
# Get the current date and calculate the inactivity threshold
$thresholdDate = (Get-Date).AddDays(-$DaysInactive)
# Find inactive user accounts
$inactiveUsers = Get-ADUser -Filter {LastLogonDate -lt $thresholdDate -and Enabled -eq $true}
foreach ($user in $inactiveUsers) {
Write-Host "Disabling and moving user: $($user.SamAccountName)"
# Disable the account
Disable-ADAccount -Identity $user.SamAccountName
# Move the account to the specified OU
Move-ADObject -Identity $user.DistinguishedName -TargetPath $OU
}
주석 작성 시 흔한 실수
스크립트의 일부 주석은 명확성보다 더 많은 혼란을 유발합니다. 다음은 PowerShell 주석을 사용할 때 가장 흔히 발생하는 실수와 이를 피하는 방법입니다.
막연하거나 너무 뻔한 주석
가장 흔한 실수 중 하나는 아래 예시처럼 너무 막연하거나 너무 뻔한 주석을 작성하는 것입니다:
# Set the variable to 5
$number = 5
대신, 특정 결정을 내린 이유나 복잡한 작업을 수행하는 이유를 설명하는 데 집중하세요. 특히 코드가 혼란스러울 수 있거나 여러 가지 가능한 접근 방법이 있는 경우에는 더욱 그렇습니다.
# Assign the default retry count to handle intermittent failures
$retryCount = 5
부정확하거나 오래된 주석
때로는 코드가 변경되었는데도 주석이 업데이트되지 않아 부정확하거나 오해의 소지가 있는 정보를 제공하게 됩니다. 예를 들어, 여기서는 백업 경로는 변경됐지만 주석은 업데이트되지 않아 읽는 사람을 오도할 수 있습니다:
# This script backs up data to a network drive
Backup-Data -Path "C:\Data"
코드가 변경될 때마다 주석도 업데이트되는지 확인하세요. 코드 유지보수의 일부로 정기적으로 주석을 검토하고 리팩터링하여 항상 관련성을 유지하도록 하세요.
주석의 과도한 사용
일부 코드는 모든 줄이나 간단한 작업마다 불필요한 주석으로 가득합니다.
# Initialize the variable
$number = 10
# Increment the variable by 1
$number++
주석은 가치가 있을 때에만 추가하세요. 보통은 복잡한 로직, 다른 개발자에게 즉시 명확하지 않을 수 있는 특이한 해결책이나 결정이 있는 경우에 해당합니다.
복잡한 코드를 설명하기 위해 주석을 사용하지 않기
스크립트에 복잡하거나 직관적이지 않은 코드 구간이 있다면 반드시 설명하세요. 예를 들어 주석이 없으면 왜 이런 특정 계산을 수행하는지, 그리고 1.15가 무엇을 의미하는지 알기 어렵습니다:
$finalPrice = $basePrice * (1 - $discountPercentage) * 1.15
복잡하거나 해독하기 어려운 코드는 특정 수식, 계산 또는 알고리즘을 사용하는 이유에 대한 맥락을 제공하세요.
# Calculate the final price including a 15% tax and applying the discount
$finalPrice = $basePrice * (1 - $discountPercentage) * 1.15
코드를 제거하지 않고 주석 처리하는 것
개발자는 때때로 테스트 후 남겨진 주석 처리된 코드를 그대로 두거나, 더 이상 필요하지 않은 코드를 그대로 둡니다. 이로 인해 스크립트가 지저분해지고, 해당 코드가 다시 활성화되어야 하는지에 대해 혼란이 생길 수 있습니다.
# $oldValue = Get-Item "C:\OldFile.txt"
# $oldValue.Delete()
코드를 주석 처리하기보다는 스크립트에서 사용하지 않는(죽은) 코드를 제거하세요. 향후 참고를 위해 코드를 보관해야 한다면, 그 목적을 명확히 문서로 남기십시오.
결론
주석은 전문적이고 유지보수 가능한 PowerShell 스크립트에 매우 중요합니다. 올바르게 사용하면 코드를 더 쉽게 이해하고 디버그, 문제 해결, 유지보수 및 개선할 수 있습니다. 효과적인 주석에는 스크립트의 목적, 결정 사항, 가정, 잠재적 이슈를 문서로 남기는 것이 포함됩니다. 개발자는 주석을 과도하게 사용하거나 부족하게 사용하지 않도록 주의하고, 가독성을 보장하기 위해 서식 표준을 채택해야 합니다.
효과적인 주석 작성은 한 번으로 끝나는 작업이 아니라 지속적인 프로세스입니다. 코드를 수정할 때마다 주석을 검토하고 업데이트하면, 주석이 스크립트의 현재 상태를 정확히 반영하여 혼란과 오류를 예방하는 데 도움이 됩니다.
자주 묻는 질문
주석이 PowerShell 스크립트의 성능에 영향을 줄 수 있나요?
주석은 실행 중에 PowerShell 인터프리터에 의해 처리되지 않으므로, 런타임에서 스크립트 성능에 영향을 주지 않습니다. 그럼에도 주석은 간결하고 관련성이 높게 유지하여 가장 큰 가치를 제공하는 것이 좋은 방법입니다.
스크립트의 주석은 얼마나 자주 업데이트해야 하나요?
새 기능을 추가하거나 기존 기능을 수정하거나 버그를 수정하는 등 코드에 중요한 변경이 있을 때마다 주석을 검토하고 업데이트해야 합니다. 주석은 항상 스크립트의 현재 상태를 반영해야 합니다.
PowerShell에서 여러 줄을 빠르게 주석 처리하려면 어떻게 해야 하나요?
블록 주석 구문을 사용하면 PowerShell에서 여러 줄을 빠르게 주석 처리할 수 있습니다. 코드 줄을 시작 부분에 <# 을, 그리고 끝에는#> 를 두기만 하면 됩니다.
인라인 주석과 블록 주석의 차이점은 무엇인가요?
인라인 주석은 # 기호로 시작하며, 참조하는 코드와 같은 줄에 나타납니다. 간단한 설명에 가장 적합합니다.
블록 주석은 <# 및 #> 구분자 안에 포함되어 여러 줄에 걸쳐 작성될 수 있습니다. 자세한 설명을 제공하거나, 복잡한 로직을 문서화하거나, 코드의 한 부분을 일시적으로 비활성화하는 데 특히 유용합니다.
공유하기
더 알아보기
저자 소개
Jonathan Blackwell
소프트웨어 개발 책임자
2012년부터 엔지니어이자 혁신가인 Jonathan Blackwell은 엔지니어링 리더십을 제공해 Netwrix GroupID를 Active Directory 및 Azure AD 환경에서 그룹 및 사용자 관리 분야의 최전선에 올려놓았습니다. 개발, 마케팅, 영업에서의 그의 경험을 통해 Jonathan은 Identity 시장과 구매자가 생각하는 방식까지 완전히 이해할 수 있습니다.