about_Preference_Variables

about_Preference_Variables (환경 설정 변수)

PowerShell에는 여러분이 PowerShell의 동작을 직접 조절할 수 있게 해 주는 변수 모음이 있어요. 이걸 환경 설정(preference) 변수라고 하는데요, GUI 프로그램에서 옵션을 바꾸듯이 변수의 값을 바꾸면 PowerShell이 알아서 행동을 바꿉니다. 예를 들어 오류가 났을 때 조용히 넘어갈지, 멈출지, 내용을 보여줄지 같은 걸 변수 하나로 정할 수 있어요.

보통은 기본값 그대로 써도 불편함이 없지만, 특히 스크립트를 만들 때는 이 변수의 값이 어디서 어떻게 바뀌는지 알아 두는 게 중요해요. 그 값은 현재 세션과 그 아래 하위 범위에만 적용되기 때문에, 함수 하나 안에서 잠깐 바꿨다가 돌아오게 만들 수도 있거든요. 각 변수가 무엇을 하는지, 기본값이 뭔지 하나씩 살펴볼게요.

출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables

본문

짧은 설명

PowerShell의 동작을 사용자 지정하는 변수들이에요.

자세한 설명

PowerShell에는 동작을 사용자 지정할 수 있게 해 주는 변수 세트가 포함되어 있어요. 이 환경 설정 변수들은 GUI 기반 시스템의 옵션 같은 역할을 합니다.

환경 설정 변수는 PowerShell의 운영 환경과 그 환경에서 실행되는 모든 명령에 영향을 줘요. 일부 cmdlet은 특정 명령에 한해서만 환경 설정 동작을 덮어쓸 수 있는 매개 변수를 제공하기도 하죠.

아래 표는 환경 설정 변수와 기본값을 정리한 거예요.

변수 기본값
$ConfirmPreference High
$DebugPreference SilentlyContinue
$ErrorActionPreference Continue
$ErrorView ConciseView
$FormatEnumerationLimit 4
$InformationPreference SilentlyContinue
$LogCommandHealthEvent $false (기록 안 함)
$LogCommandLifecycleEvent $false (기록 안 함)
$LogEngineHealthEvent $true (기록함)
$LogEngineLifecycleEvent $true (기록함)
$LogProviderHealthEvent $true (기록함)
$LogProviderLifecycleEvent $true (기록함)
$MaximumHistoryCount 4096
$OFS 공백 문자 (" ")
$OutputEncoding UTF8Encoding 개체
$ProgressPreference Continue
$PSDefaultParameterValues @{} (빈 해시 테이블)
$PSEmailServer $null (없음)
$PSModuleAutoLoadingPreference All
$PSNativeCommandArgumentPassing Windows(Windows에서), Standard(비 Windows에서)
$PSNativeCommandUseErrorActionPreference $false
$PSSessionApplicationName 'wsman'
$PSSessionConfigurationName 'http://schemas.microsoft.com/powershell/Microsoft.PowerShell'
$PSSessionOption PSSessionOption 개체
$PSStyle PSStyle 개체
$Transcript $null (없음)
$VerbosePreference SilentlyContinue
$WarningPreference Continue
$WhatIfPreference $false

PowerShell에는 사용자 환경 설정을 저장하는 다음과 같은 환경 변수도 있어요. 이 환경 변수에 대한 자세한 내용은 about_Environment_Variables를 참고하세요.

  • $Env:PSExecutionPolicyPreference
  • $Env:PSModulePath

참고

환경 설정 변수의 변경은 변수가 만들어진 범위와 그 하위 범위에만 적용돼요. 예를 들어 환경 설정 변수의 영향을 단일 함수나 스크립트로 한정할 수 있죠. 자세한 내용은 about_Scopes를 참고하세요.

환경 설정 변수 다루기

이 문서는 환경 설정 변수들을 하나씩 설명하고 있어요.

특정 환경 설정 변수의 현재 값을 보려면 변수 이름만 입력하면 돼요. 예를 들어 다음 명령은 $ConfirmPreference 변수의 값을 표시해 줍니다.

$ConfirmPreference
High

변수 값을 바꾸려면 대입문을 사용해요. 예를 들어 다음 문은 $ConfirmPreference 매개 변수의 값을 Medium으로 바꿉니다.

$ConfirmPreference = "Medium"

여러분이 설정한 값은 현재 PowerShell 세션에서만 적용돼요. 모든 PowerShell 세션에서 유효하게 만들려면 그 변수들을 PowerShell 프로필에 추가해야 합니다. 자세한 내용은 about_profiles를 참고하세요.

원격에서 작업하기

원격 컴퓨터에서 명령을 실행하면, 그 원격 명령은 원격 컴퓨터의 PowerShell 클라이언트에 설정된 환경 설정의 영향을 받아요. 예를 들어 원격 명령을 실행할 때 디버깅 메시지에 PowerShell이 어떻게 응답할지는 원격 컴퓨터의 $DebugPreference 변수 값이 결정합니다.

원격 명령에 대한 자세한 내용은 about_remote를 참고하세요.

$ConfirmPreference

cmdlet이나 함수를 실행하기 전에 PowerShell이 자동으로 확인을 요청할지 여부를 결정해요.

$ConfirmPreference 변수는 ConfirmImpact 열거형 값 중 하나를 가져요: High, Medium, Low, 또는 None.

cmdlet과 함수에는 High, Medium, Low 중 하나의 위험도가 할당돼요. $ConfirmPreference 변수의 값이 cmdlet이나 함수에 할당된 위험도보다 작거나 같으면, PowerShell은 그 cmdlet이나 함수를 실행하기 전에 자동으로 확인을 요청합니다. cmdlet이나 함수에 위험도를 할당하는 방법에 대한 자세한 내용은 about_functions_cmdletbindingattribute를 참고하세요.

$ConfirmPreference 변수의 값이 None이면 PowerShell은 cmdlet이나 함수를 실행하기 전에 절대 자동으로 확인을 요청하지 않아요.

세션의 모든 cmdlet과 함수에 대한 확인 동작을 바꾸려면 $ConfirmPreference 변수의 값을 바꾸면 됩니다.

단일 명령에 대해서만 $ConfirmPreference를 덮어쓰려면 cmdlet이나 함수의 Confirm 매개 변수를 사용해요. 확인을 요청하려면 -Confirm을, 확인을 억제하려면 -Confirm:$false를 사용하면 돼요.

$ConfirmPreference의 유효한 값:

  • None: PowerShell이 자동으로 확인을 요청하지 않아요. 특정 명령에 대해 확인을 요청하려면 그 cmdlet이나 함수의 Confirm 매개 변수를 사용하면 됩니다.
  • Low: PowerShell이 낮음(low), 중간(medium), 높음(high) 위험도의 cmdlet이나 함수를 실행하기 전에 확인을 요청해요.
  • Medium: PowerShell이 중간 또는 높음 위험도의 cmdlet이나 함수를 실행하기 전에 확인을 요청해요.
  • High: PowerShell이 높음 위험도의 cmdlet이나 함수를 실행하기 전에 확인을 요청해요.

상세 설명

PowerShell은 어떤 작업을 실행하기 전에 자동으로 확인을 요청할 수 있어요. 예를 들어 cmdlet이나 함수가 데이터를 삭제하거나 상당한 시스템 리소스를 사용해서 시스템에 큰 영향을 줄 때죠.

Remove-Item -Path C:\file.txt
Confirm
Are you sure you want to perform this action?
Performing operation "Remove File" on Target "C:\file.txt".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [?] Help (default is "Y"):

위험도 추정치는 cmdlet이나 함수의 특성으로, 바로 ConfirmImpact라고 불러요. 사용자가 이 값을 바꿀 수는 없습니다.

시스템에 위험을 줄 수 있는 cmdlet과 함수에는 Confirm 매개 변수가 있어서, 단일 명령에 대해 확인을 요청하거나 억제할 수 있어요.

대부분의 cmdlet과 함수는 ConfirmImpact의 기본값인 Medium을 유지해요. 그런데 $ConfirmPreference는 기본값이 High로 설정되어 있죠. 그래서 사용자가 Confirm 매개 변수를 지정하지 않으면 명령이 자동으로 확인을 요청하는 경우는 드물어요. 자동 확인 요청을 더 많은 cmdlet과 함수까지 확장하려면 $ConfirmPreference의 값을 Medium이나 Low로 설정하면 됩니다.

예제

이 예시는 $ConfirmPreference 변수의 기본값인 High의 효과를 보여줘요. High 값은 높음 위험도의 cmdlet과 함수만 확인합니다. 대부분의 cmdlet과 함수는 중간 위험도라 자동으로 확인되지 않아서 Remove-Item이 파일을 삭제해요. 명령에 -Confirm을 추가하면 사용자에게 확인을 요청하게 됩니다.

$ConfirmPreference
High
Remove-Item -Path C:\temp1.txt

-Confirm으로 확인을 요청해요.

Remove-Item -Path C:\temp2.txt -Confirm
Confirm
Are you sure you want to perform this action?
Performing operation "Remove File" on Target "C:\temp2.txt".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All
[?] Help (default is "Y"):

다음 예시는 $ConfirmPreference 값을 Medium으로 바꿨을 때의 효과를 보여줘요. 대부분의 cmdlet과 함수가 중간 위험도라 자동으로 확인을 받게 됩니다. 단일 명령의 확인 프롬프트를 억제하려면 Confirm 매개 변수를 $false 값과 함께 사용하면 돼요.

$ConfirmPreference = "Medium"
Remove-Item -Path C:\temp2.txt
Confirm
Are you sure you want to perform this action?
Performing operation "Remove File" on Target "C:\temp2.txt".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All
[?] Help (default is "Y"):
Remove-Item -Path C:\temp3.txt -Confirm:$false

$DebugPreference

스크립트, cmdlet, provider가 생성하거나 명령줄의 Write-Debug 명령이 생성하는 디버깅 메시지에 PowerShell이 어떻게 응답할지 결정해요.

$DebugPreference 변수는 ActionPreference 열거형 값 중 하나를 가져요: SilentlyContinue, Stop, Continue, Inquire, Ignore, Suspend, 또는 Break.

일부 cmdlet은 디버깅 메시지를 표시하는데, 이 메시지는 보통 프로그래머와 기술 지원 전문가를 위해 만들어진 기술적인 내용이에요. 기본적으로 디버깅 메시지는 표시되지 않지만, $DebugPreference의 값을 바꾸면 표시할 수 있습니다.

특정 명령에 대해서만 디버깅 메시지를 보여주거나 숨기려면 cmdlet의 Debug 공통 매개 변수를 사용할 수 있어요. 자세한 내용은 about_commonparameters를 참고하세요.

유효한 값은 다음과 같아요.

  • Break - 오류가 발생하거나 예외가 발생했을 때 디버거로 진입해요.
  • Stop: 디버그 메시지를 표시하고 실행을 중지해요. 콘솔에 오류를 기록해요.
  • Inquire: 디버그 메시지를 표시하고 계속할지 여부를 물어요.
  • Continue: 디버그 메시지를 표시하고 실행을 계속해요.
  • SilentlyContinue: (기본값) 아무 효과 없이, 디버그 메시지를 표시하지 않고 중단 없이 실행을 계속해요.

디버깅 메시지를 생성하도록 구성된 명령에 Debug 공통 매개 변수를 추가하면, $DebugPreference 변수의 값이 Continue로 바뀝니다.

예제

다음 예시들은 명령줄에서 Write-Debug 명령을 입력했을 때 $DebugPreference 값을 바꾸면 어떻게 달라지는지 보여줘요. 이 변경은 cmdlet과 스크립트가 생성하는 메시지를 포함한 모든 디버깅 메시지에 영향을 줍니다. 예시들은 단일 명령과 관련된 디버깅 메시지를 보여주거나 숨기는 Debug 매개 변수도 함께 보여줘요.

이 예시는 $DebugPreference 변수의 기본값인 SilentlyContinue의 효과를 보여줘요. 기본적으로 Write-Debug cmdlet의 디버그 메시지는 표시되지 않고 처리는 계속됩니다. Debug 매개 변수를 사용하면 단일 명령에 한해 이 환경 설정을 덮어써서 디버그 메시지가 표시돼요.

$DebugPreference
SilentlyContinue
Write-Debug -Message "Hello, World"
Write-Debug -Message "Hello, World" -Debug
DEBUG: Hello, World

이 예시는 $DebugPreferenceContinue 값으로 설정했을 때의 효과를 보여줘요. 디버그 메시지가 표시되고 명령은 계속 처리됩니다.

$DebugPreference = "Continue"
Write-Debug -Message "Hello, World"
DEBUG: Hello, World

이 예시는 단일 명령의 메시지를 억제하기 위해 Debug 매개 변수를 $false 값으로 사용해요. 디버그 메시지가 표시되지 않습니다.

Write-Debug -Message "Hello, World" -Debug:$false

이 예시는 $DebugPreferenceStop 값으로 설정했을 때의 효과를 보여줘요. 디버그 메시지가 표시되고 명령이 중지됩니다.

$DebugPreference = "Stop"
Write-Debug -Message "Hello, World"
DEBUG: Hello, World
Write-Debug : The running command stopped because the preference variable
"DebugPreference" or common parameter is set to Stop: Hello, World
At line:1 char:1
+ Write-Debug -Message "Hello, World"

이 예시는 단일 명령의 메시지를 억제하기 위해 Debug 매개 변수를 $false 값으로 사용해요. 디버그 메시지가 표시되지 않고 처리가 중지되지도 않습니다.

Write-Debug -Message "Hello, World" -Debug:$false

이 예시는 $DebugPreferenceInquire 값으로 설정했을 때의 효과를 보여줘요. 디버그 메시지가 표시되고 사용자에게 확인을 요청합니다.

$DebugPreference = "Inquire"
Write-Debug -Message "Hello, World"
DEBUG: Hello, World

Confirm
Continue with this operation?
[Y] Yes  [A] Yes to All  [H] Halt Command  [?] Help (default is "Y"):

이 예시는 단일 명령의 메시지를 억제하기 위해 Debug 매개 변수를 $false 값으로 사용해요. 디버그 메시지가 표시되지 않고 처리가 계속됩니다.

Write-Debug -Message "Hello, World" -Debug:$false

$ErrorActionPreference

PowerShell이 종료되지 않는 오류(non-terminating error), 즉 cmdlet 처리를 중지시키지 않는 오류에 어떻게 응답할지 결정해요. 예를 들어 명령줄, 스크립트, cmdlet, provider에서 Write-Error cmdlet이 생성하는 오류 같은 것들이에요.

$ErrorActionPreference 변수는 ActionPreference 열거형 값 중 하나를 가져요: SilentlyContinue, Stop, Continue, Inquire, Ignore, Suspend, 또는 Break.

특정 명령에 대해서만 이 환경 설정을 덮어쓰려면 cmdlet의 ErrorAction 공통 매개 변수를 사용할 수 있어요.

유효한 값은 다음과 같아요.

  • Break - 오류가 발생하거나 예외가 발생했을 때 디버거로 진입해요.
  • Continue: (기본값) 오류 메시지를 표시하고 실행을 계속해요.
  • Ignore: 오류 메시지를 억제하고 명령을 계속 실행해요. SilentlyContinue와 달리 Ignore는 오류 메시지를 $Error 자동 변수에 추가하지 않아요. Ignore 값은 $ErrorActionPreference에서도 유효한데, 이때는 종료되지 않는 오류와 문 종료(statement-terminating) 오류를 모두 억제합니다. 다만 Ignore는 종료되지 않는 오류에 대해서만 $Error 기록을 막아요. Ignore가 억제하는 종료 오류는 여전히 $Error에 기록됩니다.
  • Inquire: 오류 메시지를 표시하고 계속할지 여부를 물어요.
  • SilentlyContinue: 아무 효과 없이, 오류 메시지를 표시하지 않고 중단 없이 실행을 계속해요.
  • Stop: 오류 메시지를 표시하고 실행을 중지해요. 생성된 오류 외에도 Stop 값은 오류 스트림에 ActionPreferenceStopException 개체를 생성합니다.
  • Suspend: 자세한 조사를 위해 워크플로 작업을 자동으로 보류(suspend)해요. 조사 후에 워크플로를 다시 시작할 수 있어요. Suspend 값은 저장된 환경 설정이 아니라 명령별 사용을 위한 값이에요. Suspend$ErrorActionPreference 변수의 유효한 값이 아닙니다.

$ErrorActionPreference는 종료되지 않는 오류와 문 종료 오류 둘 다에 적용돼요. -ErrorAction 매개 변수(종료되지 않는 오류에만 영향을 줌)와 달리, 이 환경 설정 변수는 $PSCmdlet.ThrowTerminatingError()가 생성하는 오류도 억제하거나 상위로 올릴 수 있어요. Stop으로 설정하면 종료되지 않는 오류를 스크립트 종료 오류로 상위로 올립니다. 오류 범주에 대한 자세한 내용은 about_error_handling을, ErrorAction 공통 매개 변수에 대한 자세한 내용은 about_commonparameters를 참고하세요.

많은 네이티브 명령은 추가 정보를 위한 대체 스트림으로 stderr에 기록해요. 이 동작은 오류를 살펴볼 때 혼란을 줄 수 있고, $ErrorActionPreference가 출력을 묵음 처리하는 상태로 설정되면 추가 출력 정보가 사용자에게 유실될 수도 있어요.

PowerShell 7.2부터 리디렉션 연산자(2>&1)를 사용할 때처럼 네이티브 명령에서 리디렉션된 오류 레코드는 $Error 변수에 기록되지 않고, 환경 설정 변수 $ErrorActionPreference도 리디렉션된 출력에 영향을 주지 않아요.

PowerShell 7.4에는 stderr에 기록되는 메시지를 어떻게 처리할지 제어할 수 있는 기능이 추가됐어요. 자세한 내용은 $PSNativeCommandUseErrorActionPreference를 참고하세요.

예제

이 예시들은 $ErrorActionPreference 변수 값에 따른 차이를 보여줘요. ErrorAction 매개 변수로 $ErrorActionPreference 값을 덮어씁니다.

이 예시는 $ErrorActionPreference의 기본값인 Continue를 보여줘요. 종료되지 않는 오류가 생성되고, 메시지가 표시되며 처리가 계속됩니다.

# Change the ErrorActionPreference to 'Continue'
$ErrorActionPreference = 'Continue'
# Generate a non-terminating error and continue processing the script.
Write-Error -Message  'Test Error' ; Write-Host 'Hello World'
Write-Error: Test Error
Hello World

이 예시는 $ErrorActionPreferenceInquire로 설정했을 때를 보여줘요. 오류가 생성되고 처리 방식을 묻는 프롬프트가 표시됩니다.

# Change the ErrorActionPreference to 'Inquire'
$ErrorActionPreference = 'Inquire'
Write-Error -Message 'Test Error' ; Write-Host 'Hello World'
Confirm
Test Error
[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"):

이 예시는 $ErrorActionPreferenceSilentlyContinue로 설정했을 때를 보여줘요. 오류 메시지가 억제됩니다.

# Change the ErrorActionPreference to 'SilentlyContinue'
$ErrorActionPreference = 'SilentlyContinue'
# Generate an error message
Write-Error -Message 'Test Error' ; Write-Host 'Hello World'
# Error message is suppressed and script continues processing
Hello World

이 예시는 $ErrorActionPreferenceStop으로 설정했을 때를 보여줘요. $Error 변수에 생성되는 추가 개체도 함께 보여줍니다.

# Change the ErrorActionPreference to 'Stop'
$ErrorActionPreference = 'Stop'
# Error message is generated and script stops processing
Write-Error -Message 'Test Error' ; Write-Host 'Hello World'

# Show the ActionPreferenceStopException and the error generated
$Error[0]
$Error[1]
Write-Error: Test Error

ErrorRecord                 : Test Error
WasThrownFromThrowStatement : False
TargetSite                  : System.Collections.ObjectModel.Collection`1[System.Management.Automation.PSObject]
Invoke(System.Collections.IEnumerable)
StackTrace                  :    at System.Management.Automation.Runspaces.PipelineBase.Invoke(IEnumerable input)
at Microsoft.PowerShell.Executor.ExecuteCommandHelper(Pipeline tempPipeline,
Exception& exceptionThrown, ExecutionOptions options)
Message                     : The running command stopped because the preference variable "ErrorActionPreference" or
common parameter is set to Stop: Test Error
Data                        : {System.Management.Automation.Interpreter.InterpretedFrameInfo}
InnerException              :
HelpLink                    :
Source                      : System.Management.Automation
HResult                     : -2146233087

Write-Error: Test Error

$ErrorView

PowerShell에서 오류 메시지의 표시 형식을 결정해요.

$ErrorView 변수는 ErrorView 열거형 값 중 하나를 가져요: NormalView, CategoryView, 또는 ConciseView.

유효한 값은 다음과 같아요.

ConciseView: (기본값) 간결한 오류 메시지와 고급 모듈 제작자를 위한 리팩터링된 뷰를 제공해요. PowerShell 7.2부터 오류가 명령줄이나 스크립트 모듈에서 발생한 경우 출력은 한 줄 오류 메시지예요. 그 외에는 그 줄에서 오류가 발생한 위치를 가리키는 포인터가 포함된 여러 줄 오류 메시지를 받게 됩니다. 터미널이 Virtual Terminal을 지원한다면 ANSI 색상 코드로 색상 강조를 제공해요. 강조 색상은 $Host.PrivateData.ErrorAccentColor에서 바꿀 수 있어요. 내부 예외를 포함한 완전히 정규화된 오류의 종합적인 상세 뷰는 Get-Error cmdlet을 사용하세요.

ConciseView는 PowerShell 7에서 추가됐어요.

NormalView: 대부분의 사용자를 위한 상세 뷰예요. 오류에 대한 설명과 오류에 관련된 개체의 이름으로 구성됩니다.

CategoryView: 프로덕션 환경을 위한 간결하고 구조화된 뷰예요. 형식은 다음과 같아요.

{Category}: ({TargetName}:{TargetType}):[{Activity}], {Reason}

CategoryView의 필드에 대한 자세한 내용은 ErrorCategoryInfo 클래스를 참고하세요.

예제

이 예시는 $ErrorView 값이 기본값인 ConciseView일 때 오류가 어떻게 표시되는지 보여줘요. Get-ChildItem으로 존재하지 않는 디렉터리를 찾으려고 합니다.

Get-ChildItem -Path 'C:\NoRealDirectory'
Get-ChildItem: Can't find path 'C:\NoRealDirectory' because it doesn't exist.

이 예시는 $ErrorView 값이 기본값인 ConciseView일 때 오류가 어떻게 표시되는지 보여줘요. Script.ps1을 실행하면 Get-Item 문에서 오류가 발생합니다.

./Script.ps1
Get-Item: C:\Script.ps1
Line |
11 | Get-Item -Path .\stuff
| ^ Can't find path 'C:\demo\stuff' because it doesn't exist.

이 예시는 $ErrorView 값을 NormalView로 바꿨을 때 오류가 어떻게 표시되는지 보여줘요. Get-ChildItem으로 존재하지 않는 파일을 찾으려고 합니다.

Get-ChildItem -Path C:\nofile.txt
Get-ChildItem : Can't find path 'C:\nofile.txt' because it doesn't exist.
At line:1 char:1
+ Get-ChildItem -Path C:\nofile.txt

이 예시는 같은 오류를 $ErrorViewCategoryView로 바꿨을 때 어떻게 표시하는지 보여줘요.

$ErrorView = "CategoryView"
Get-ChildItem -Path C:\nofile.txt
ObjectNotFound: (C:\nofile.txt:String) [Get-ChildItem], ItemNotFoundException

이 예시는 $ErrorView의 값이 오류 표시에만 영향을 준다는 걸 보여줘요. $Error 자동 변수에 저장된 오류 개체의 구조는 바꾸지 못합니다. $Error 자동 변수에 대한 정보는 about_automatic_variables를 참고하세요.

다음 명령은 오류 배열의 가장 최근 오류에 연결된 ErrorRecord 개체, 즉 요소 0 을 가져와서 그 개체의 속성을 목록 형식으로 표시해요.

$Error[0] | Format-List -Property * -Force
PSMessageDetails      :
Exception             : System.Management.Automation.ItemNotFoundException:
Cannot find path 'C:\nofile.txt' because it does
not exist.
at System.Management.Automation.SessionStateInternal.
GetChildItems(String path, Boolean recurse, UInt32
depth, CmdletProviderContext context)
at System.Management.Automation.ChildItemCmdlet
ProviderIntrinsics.Get(String path, Boolean
recurse, UInt32 depth, CmdletProviderContext context)
at Microsoft.PowerShell.Commands.GetChildItemCommand.
ProcessRecord()
TargetObject          : C:\nofile.txt
CategoryInfo          : ObjectNotFound: (C:\nofile.txt:String) [Get-ChildItem],
ItemNotFoundException
FullyQualifiedErrorId : PathNotFound,
Microsoft.PowerShell.Commands.GetChildItemCommand
ErrorDetails          :
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {0, 1}

$FormatEnumerationLimit

표시에 포함되는 열거 항목의 수를 결정해요. 이 변수는 실제 개체에는 영향을 주지 않고 표시에만 영향을 줍니다. $FormatEnumerationLimit의 값이 열거 항목 수보다 적으면 PowerShell은 표시되지 않는 항목이 있다는 뜻으로 줄임표(...)를 추가해요.

유효한 값: 정수 (Int32)

기본값: 4

예제

이 예시는 $FormatEnumerationLimit 변수를 사용해서 열거 항목 표시를 개선하는 방법을 보여줘요.

이 예시의 명령은 컴퓨터에서 실행 중인 모든 서비스를 실행 중(running) 서비스 그룹과 중지됨(stopped) 서비스 그룹, 두 그룹으로 나눠 표시하는 테이블을 만들어요. Get-Service 명령으로 모든 서비스를 가져온 뒤, 그 결과를 파이프라인으로 Group-Object cmdlet에 보내 서비스 상태별로 그룹화합니다.

결과는 Name 열에 상태를, Group 열에 프로세스를 나열하는 테이블이에요. 열 레이블을 바꾸려면 해시 테이블을 사용하세요. about_hash_tables를 참고하면 되고, 자세한 내용은 Format-Table의 예시를 보세요.

$FormatEnumerationLimit의 현재 값을 찾아볼게요.

$FormatEnumerationLimit
4

Status별로 그룹화된 모든 서비스를 나열해요. $FormatEnumerationLimit 값이 4라서 각 상태에 대해 Group 열에 최대 4개의 서비스만 표시됩니다.

Get-Service | Group-Object -Property Status
Count  Name       Group
-----  ----       -----
60     Running    {AdtAgent, ALG, Ati HotKey Poller, AudioSrv...}
41     Stopped    {Alerter, AppMgmt, aspnet_state, ATI Smart...}

표시되는 항목 수를 늘리려면 $FormatEnumerationLimit 값을 1000으로 올리면 돼요. Get-ServiceGroup-Object로 서비스를 표시해 볼게요.

$FormatEnumerationLimit = 1000
Get-Service | Group-Object -Property Status
Count  Name       Group
-----  ----       -----
60     Running    {AdtAgent, ALG, Ati HotKey Poller, AudioSrv, BITS, CcmExec...
41     Stopped    {Alerter, AppMgmt, aspnet_state, ATI Smart, Browser, CiSvc...

Wrap 매개 변수와 함께 Format-Table을 사용하면 서비스 목록을 줄바꿈해서 표시할 수 있어요.

Get-Service | Group-Object -Property Status | Format-Table -Wrap
Count  Name       Group
-----  ----       -----
60     Running    {AdtAgent, ALG, Ati HotKey Poller, AudioSrv, BITS, CcmExec,
Client for NFS, CryptSvc, DcomLaunch, Dhcp, dmserver,
Dnscache, ERSvc, Eventlog, EventSystem, FwcAgent, helpsvc,
HidServ, IISADMIN, InoRPC, InoRT, InoTask, lanmanserver,
lanmanworkstation, LmHosts, MDM, Netlogon, Netman, Nla,
NtLmSsp, PlugPlay, PolicyAgent, ProtectedStorage, RasMan,
RemoteRegistry, RpcSs, SamSs, Schedule, seclogon, SENS,
SharedAccess, ShellHWDetection, SMT PSVC, Spooler,
srservice, SSDPSRV, stisvc, TapiSrv, TermService, Themes,
TrkWks, UMWdf, W32Time, W3SVC, WebClient, winmgmt, wscsvc,
wuauserv, WZCSVC, zzInterix}
41     Stopped    {Alerter, AppMgmt, aspnet_state, ATI Smart, Browser, CiSvc,
ClipSrv, clr_optimization_v2.0.50727_32, COMSysApp,
CronService, dmadmin, FastUserSwitchingCompatibility,
HTTPFilter, ImapiService, Mapsvc, Messenger, mnmsrvc,
MSDTC, MSIServer, msvsmon80, NetDDE, NetDDEdsdm, NtmsSvc,
NVSvc, ose, RasAuto, RDSessMgr, RemoteAccess, RpcLocator,
SCardSvr, SwPrv, SysmonLog, TlntSvr, upnphost, UPS, VSS,
WmdmPmSN, Wmi, WmiApSrv, xmlprov}

$InformationPreference

$InformationPreference 변수는 사용자에게 표시하고 싶은 정보 스트림 환경 설정을 설정하게 해 줘요. 구체적으로는 명령이나 스크립트에 Write-Information cmdlet을 추가해서 넣은 정보 메시지가 대상이에요. InformationAction 매개 변수를 사용하면 그 값이 $InformationPreference 변수의 값을 덮어씁니다. Write-Information은 PowerShell 5.0에서 도입됐어요.

$InformationPreference 변수는 ActionPreference 열거형 값 중 하나를 가져요: SilentlyContinue, Stop, Continue, Inquire, Ignore, Suspend, 또는 Break.

유효한 값은 다음과 같아요.

  • Break - Information 스트림에 쓸 때 디버거로 진입해요.
  • Stop: Write-Information 명령이 발생한 지점에서 명령이나 스크립트를 중지해요.
  • Inquire: Write-Information 명령에서 지정한 정보 메시지를 표시한 뒤 계속할지 물어요.
  • Continue: 정보 메시지를 표시하고 계속 실행해요.
  • SilentlyContinue: (기본값) 아무 효과 없이, 정보 메시지를 표시하지 않고 중단 없이 스크립트를 계속해요.

$Log*Event

Log*Event 환경 설정 변수는 이벤트 뷰어의 PowerShell 이벤트 로그에 어떤 유형의 이벤트를 기록할지 결정해요. 기본적으로는 엔진(engine)과 provider 이벤트만 기록됩니다. 하지만 Log*Event 환경 설정 변수를 사용하면 명령에 대한 이벤트 기록처럼 로그를 원하는 대로 사용자 지정할 수 있어요.

Log*Event 환경 설정 변수는 다음과 같아요.

  • $LogCommandHealthEvent: 명령 초기화와 처리 과정의 오류와 예외를 기록해요. 기본값은 $false(기록 안 함)예요.
  • $LogCommandLifecycleEvent: 명령과 명령 파이프라인의 시작·중지, 명령 검색 과정의 보안 예외를 기록해요. 기본값은 $false(기록 안 함)예요.
  • $LogEngineHealthEvent: 세션의 오류와 실패를 기록해요. 기본값은 $true(기록함)예요.
  • $LogEngineLifecycleEvent: 세션의 열림과 닫힘을 기록해요. 기본값은 $true(기록함)예요.
  • $LogProviderHealthEvent: 읽기·쓰기 오류, 조회 오류, 호출 오류 같은 provider 오류를 기록해요. 기본값은 $true(기록함)예요.
  • $LogProviderLifecycleEvent: PowerShell provider의 추가와 제거를 기록해요. 기본값은 $true(기록함)예요. PowerShell provider에 대한 정보는 about_providers를 참고하세요.

Log*Event를 활성화하려면 변수에 $true 값을 지정하면 돼요. 예를 들면:

$LogCommandLifecycleEvent = $true

이벤트 유형을 비활성화하려면 변수에 $false 값을 지정해요. 예를 들면:

$LogCommandLifecycleEvent = $false

활성화한 이벤트는 현재 PowerShell 콘솔에서만 유효해요. 모든 콘솔에 적용하려면 변수 설정을 PowerShell 프로필에 저장하면 됩니다. 자세한 내용은 about_profiles를 참고하세요.

$MaximumHistoryCount

현재 세션의 명령 기록에 몇 개의 명령을 저장할지 결정해요.

유효한 값: 1 - 32768 (Int32)

기본값: 4096

현재 명령 기록에 저장된 명령 수를 확인하려면 다음을 입력해요.

(Get-History).Count

세션 기록에 저장된 명령을 보려면 Get-History cmdlet을 사용하세요. 자세한 내용은 about_history를 참고하세요.

$OFS

출력 필드 구분자(Output Field Separator, OFS)는 문자열로 변환되는 배열의 요소를 구분하는 문자를 지정해요.

유효한 값: 모든 문자열.

기본값: 공백

기본적으로 $OFS 변수는 존재하지 않고 출력 파일 구분자는 공백이지만, 이 변수를 추가하거나 어떤 문자열로든 설정할 수 있어요. $OFS="<value>"처럼 입력하면 세션에서 $OFS의 값을 바꿀 수 있습니다.

참고

스크립트, 모듈, 구성 출력에서 공백(" ")이라는 기본값을 기대하고 있다면, 코드의 다른 곳에서 $OFS 기본값을 바꾸지 않았는지 주의해야 해요.

예제

이 예시는 배열을 문자열로 변환할 때 값을 구분하는 데 공백이 사용된다는 걸 보여줘요. 이 경우 정수 배열을 변수에 저장한 뒤 그 변수를 문자열로 캐스팅합니다.

$array = 1,2,3,4
[string]$array
1 2 3 4

구분자를 바꾸려면 값을 대입해서 $OFS 변수를 추가하면 돼요. 변수 이름은 반드시 $OFS여야 합니다.

$OFS = "+"
[string]$array
1+2+3+4

기본 동작을 복원하려면 $OFS 값에 공백(" ")을 대입하거나 변수를 삭제하면 돼요. 다음 명령은 변수를 삭제한 뒤 구분자가 공백인지 확인합니다.

Remove-Variable OFS
[string]$array
1 2 3 4

$OutputEncoding

PowerShell이 네이티브 응용 프로그램으로 데이터를 파이핑할 때 사용하는 문자 인코딩 방식을 결정해요.

참고

대부분의 시나리오에서 $OutputEncoding 값은 [Console]::InputEncoding 값과 일치해야 해요.

유효한 값은 다음과 같아요: ASCIIEncoding, UTF7Encoding, UTF8Encoding, UTF32Encoding, UnicodeEncoding 같은 Encoding 클래스에서 파생된 개체.

기본값: UTF8Encoding 개체.

예제

첫 번째 명령은 $OutputEncoding의 값을 찾아요. 값이 인코딩 개체라서 EncodingName 속성만 표시합니다.

$OutputEncoding.EncodingName

나머지 예시들은 hexdump.ps1로 저장된 다음 PowerShell 스크립트를 사용해서 $OutputEncoding의 동작을 보여줘요.

$inputStream = [Console]::OpenStandardInput()
try {
$buffer = [byte[]]::new(1024)
$read = $inputStream.Read($buffer, 0, $buffer.Length)
Format-Hex -InputObject $buffer -Count $read
} finally {
$inputStream.Dispose()
}

다음 예시는 문자열 값 café를 위에서 만든 hexdump.ps1로 파이핑했을 때 바이트로 어떻게 인코딩되는지 보여줘요. 문자열 값이 UTF32Encoding 방식으로 인코딩된다는 걸 보여줍니다.

'café' | pwsh -File ./hexdump.ps1
Label: Byte[] (System.Byte[]) <28873E25>

Offset Bytes                                           Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 63 61 66 C3 A9 0D 0A                            caf�

다음 예시는 인코딩을 PSSessionOption으로 바꿀 때 바이트가 어떻게 달라지는지 보여줘요. (원문 링크가 PSSessionOption으로 되어 있는데, 아래 코드가 [System.Text.Encoding]::Unicode를 쓰는 걸 보면 유니코드 인코딩을 뜻하는 것으로 보여요 — 확인 필요.)

$OutputEncoding = [System.Text.Encoding]::Unicode
'café' | pwsh -File ./hexdump.ps1
Label: Byte[] (System.Byte[]) <515A7DC3>

Offset Bytes                                           Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 FF FE 63 00 61 00 66 00 E9 00 0D 00 0A 00       ÿþc a f é � �

$ProgressPreference

스크립트, cmdlet, provider가 생성하는 진행률 업데이트에 PowerShell이 어떻게 응답할지 결정해요. 예를 들어 Write-Progress cmdlet이 생성하는 진행률 표시줄이 그 대상이에요. Write-Progress cmdlet은 명령의 상태를 보여주는 진행률 표시줄을 만듭니다.

$ProgressPreference 변수는 ActionPreference 열거형 값 중 하나를 가져요: SilentlyContinue, Stop, Continue, Inquire, Ignore, Suspend, 또는 Break.

유효한 값은 다음과 같아요.

  • Break - Progress 스트림에 쓸 때 디버거로 진입해요.
  • Stop: 진행률 표시줄을 표시하지 않아요. 대신 오류 메시지를 표시하고 실행을 중지해요.
  • Inquire: 진행률 표시줄을 표시하지 않아요. 계속할지 권한을 묻습니다. YA로 응답하면 진행률 표시줄을 표시해요.
  • Continue: (기본값) 진행률 표시줄을 표시하고 실행을 계속해요.
  • SilentlyContinue: 명령을 실행하지만 진행률 표시줄은 표시하지 않아요.

$PSDefaultParameterValues

cmdlet과 고급 함수의 매개 변수에 대한 기본값을 지정해요. $PSDefaultParameterValues 값은 cmdlet 이름과 매개 변수 이름을 콜론(:)으로 구분한 키로 구성된 해시 테이블이에요. 값은 여러분이 지정하는 사용자 지정 기본값입니다.

$PSDefaultParameterValues는 PowerShell 3.0에서 도입됐어요.

이 환경 설정 변수에 대한 자세한 내용은 about_parameters_default_values를 참고하세요.

$PSEmailServer

이메일 메시지를 보내는 데 사용되는 기본 이메일 서버를 지정해요. 이 환경 설정 변수는 Send-MailMessage cmdlet 같은 이메일을 보내는 cmdlet에서 사용됩니다.

$PSModuleAutoLoadingPreference

세션에서 모듈을 자동으로 가져오는 기능을 켜고 끄는 역할을 해요. $PSModuleAutoLoadingPreference 변수는 기본적으로 존재하지 않아요. 변수가 정의되지 않았을 때의 기본 동작은 $PSModuleAutoLoadingPreference = 'All'과 같습니다.

모듈을 자동으로 가져오려면 그 모듈에 포함된 명령을 가져오거나 사용하면 돼요.

$PSModuleAutoLoadingPreference 변수는 PSModuleAutoLoadingPreference 열거형 값 중 하나를 가져요:

  • All: 모듈이 처음 사용될 때 자동으로 가져와져요.
  • ModuleQualified: 사용자가 모듈의 명령을 모듈 한정 이름으로 사용할 때만 자동으로 가져와져요. 예를 들어 사용자가 MyModule\MyCommand를 입력하면 PowerShell이 MyModule 모듈을 가져옵니다.
  • None: 모듈 자동 가져오기를 비활성화해요. 모듈을 가져오려면 Import-Module cmdlet을 사용하세요.

모듈 자동 가져오기에 대한 자세한 내용은 about_modules를 참고하세요.

$PSNativeCommandArgumentPassing

경고

Windows에서 배치 파일에 인자를 전달할 때는 그 인자가 cmd.exe에 원시(raw) 명령줄 문자열로 전달돼요. PowerShell과 기본 API가 매개 변수를 안전하게 해석하려 시도하지만, 신뢰할 수 없는 입력은 다른 방법으로 전달해야 합니다.

PowerShell 7.3은 네이티브 명령의 명령줄을 해석하는 방식을 바꿨어요. 새로운 $PSNativeCommandArgumentPassing 환경 설정 변수가 이 동작을 제어합니다.

주의

새 동작은 이전 동작에서 변경(breaking change) 된 거예요. 네이티브 응용 프로그램을 호출할 때 발생하던 여러 문제를 우회하는 스크립트와 자동화를 깨뜨릴 수 있습니다.

자동 변수 $PSNativeCommandArgumentPassing을 사용하면 런타임에 동작을 선택할 수 있어요. 유효한 값은 Legacy, Standard, Windows예요. Legacy가 기존 동작입니다.

$PSNativeCommandArgumentPassing 변수는 기본적으로 정의되어 있지만 값은 플랫폼별로 달라요.

  • Windows에서는 환경 설정이 Windows로 설정돼요.
  • 비 Windows 플랫폼에서는 환경 설정이 Standard로 설정돼요.
  • $PSNativeCommandArgumentPassing 변수를 제거했다면 PowerShell은 Standard 동작을 사용해요.

Windows 모드와 Standard 모드의 동작은 동일한데, Windows 모드에서 다음 파일을 실행할 때만 PowerShell이 인자 전달의 Legacy 동작을 사용한다는 점이 달라요.

  • cmd.exe
  • cscript.exe
  • find.exe
  • sqlcmd.exe
  • wscript.exe
  • 다음으로 끝나는 파일:
    • .bat
    • .cmd
    • .js
    • .vbs
    • .wsf

$PSNativeCommandArgumentPassingLegacyStandard로 설정되면 파서는 이런 파일을 확인하지 않아요. 새 동작에 대한 예시는 about_parsing을 참고하세요.

PowerShell 7.3에는 네이티브 명령의 매개 변수 바인딩을 추적하는 기능도 추가됐어요. 자세한 내용은 Trace-Command를 참고하세요.

$PSNativeCommandUseErrorActionPreference

$PSNativeCommandUseErrorActionPreference$true이면 종료 코드가 0이 아닌 네이티브 명령이 $ErrorActionPreference에 따라 오류를 발생시켜요.

robocopy 같은 일부 네이티브 명령은 오류가 아닌 정보를 표현하기 위해 0이 아닌 종료 코드를 사용해요. 이런 경우에 이 동작을 일시적으로 비활성화해서 0이 아닌 종료 코드가 오류를 발생시키지 않게 만들 수 있습니다.

& {
# Disable $PSNativeCommandUseErrorActionPreference for this scriptblock
$PSNativeCommandUseErrorActionPreference = $false
robocopy.exe D:\reports\operational "\\reporting\ops" CY2022Q4.md
if ($LASTEXITCODE -gt 8) {
throw "robocopy failed with exit code $LASTEXITCODE"
}
}

이 예시에서 $PSNativeCommandUseErrorActionPreference 변수는 스크립트블록 안에서 바꿔요. 이 변경은 스크립트블록 안에서만 유효합니다. 스크립트블록이 끝나면 변수는 이전 값으로 되돌아가요.

$PSSessionApplicationName

WS-Management(Web Services for Management) 기술을 사용하는 원격 명령의 기본 응용 프로그램 이름을 지정해요. 자세한 내용은 about Windows Remote Management를 참고하세요.

시스템 기본 응용 프로그램 이름은 WSMAN이지만, 이 환경 설정 변수로 기본값을 바꿀 수 있어요.

응용 프로그램 이름은 연결 URI의 마지막 노드예요. 예를 들어 다음 샘플 URI에서 응용 프로그램 이름은 WSMAN입니다.

http://Server01:8080/WSMAN

원격 명령이 연결 URI나 응용 프로그램 이름을 지정하지 않으면 기본 응용 프로그램 이름이 사용돼요.

WinRM 서비스는 응용 프로그램 이름을 사용해서 연결 요청을 처리할 수신기를 선택합니다. 매개 변수 값은 원격 컴퓨터에 있는 수신기의 URLPrefix 속성 값과 일치해야 해요.

시스템 기본값과 이 변수의 값을 덮어쓰고 특정 세션에 대해 다른 응용 프로그램 이름을 선택하려면 New-PSSession, Enter-PSSession, Invoke-Command cmdlet의 ConnectionURI 또는 ApplicationName 매개 변수를 사용하면 돼요.

$PSSessionApplicationName 환경 설정 변수는 로컬 컴퓨터에 설정되지만, 원격 컴퓨터의 수신기를 지정해요. 지정한 응용 프로그램 이름이 원격 컴퓨터에 없으면 세션을 설정하는 명령이 실패합니다.

$PSSessionConfigurationName

현재 세션에서 새 세션을 만들 때 사용되는 기본 세션 구성을 지정해요.

이 환경 설정 변수는 로컬 컴퓨터에 설정되지만, 원격 컴퓨터에 있는 세션 구성을 지정해요.

$PSSessionConfigurationName 변수의 값은 정규화된 리소스 URI예요.

기본값 http://schemas.microsoft.com/PowerShell/microsoft.PowerShell은 원격 컴퓨터의 Microsoft.PowerShell 세션 구성을 나타냅니다.

구성 이름만 지정하면 다음 스키마 URI가 앞에 붙어요:

http://schemas.microsoft.com/PowerShell/

New-PSSession, Enter-PSSession, Invoke-Command cmdlet의 ConfigurationName 매개 변수를 사용하면 특정 세션에 대해 기본값을 덮어쓰고 다른 세션 구성을 선택할 수 있어요.

이 변수의 값은 언제든 바꿀 수 있어요. 바꿀 때는 선택한 세션 구성이 원격 컴퓨터에 존재해야 한다는 점을 기억하세요. 존재하지 않으면 그 세션 구성을 사용하는 세션을 만드는 명령이 실패합니다.

이 환경 설정 변수는 원격 사용자가 이 컴퓨터에 연결하는 세션을 만들 때 어떤 로컬 세션 구성을 사용할지는 결정하지 않아요. 다만 로컬 세션 구성의 권한을 사용해서 어떤 사용자가 그것을 쓸 수 있는지 결정할 수는 있습니다.

$PSSessionOption

원격 세션에서 고급 사용자 옵션의 기본값을 설정해요. 이 옵션 환경 설정은 세션 옵션의 시스템 기본값을 덮어씁니다.

$PSSessionOption 변수는 PSSessionOption 개체를 담고 있어요. 자세한 내용은 PSSessionOption을 참고하세요. 개체의 각 속성은 세션 옵션 하나를 나타냅니다. 예를 들어 NoCompression 속성은 세션 중 데이터 압축을 끕니다.

기본적으로 $PSSessionOption 변수는 아래와 같이 모든 옵션에 기본값을 가진 PSSessionOption 개체를 담고 있어요.

MaximumConnectionRedirectionCount : 5
NoCompression                     : False
NoMachineProfile                  : False
ProxyAccessType                   : None
ProxyAuthentication               : Negotiate
ProxyCredential                   :
SkipCACheck                       : False
SkipCNCheck                       : False
SkipRevocationCheck               : False
OperationTimeout                  : 00:03:00
NoEncryption                      : False
UseUTF16                          : False
IncludePortInSPN                  : False
OutputBufferingMode               : None
Culture                           :
UICulture                         :
MaximumReceivedDataSizePerCommand :
MaximumReceivedObjectSize         : 209715200
ApplicationArguments              :
OpenTimeout                       : 00:03:00
CancelTimeout                     : 00:01:00
IdleTimeout                       : -00:00:00.0010000

이 옵션들에 대한 설명과 자세한 내용은 New-PSSessionOption을 참고하세요. 원격 명령과 세션에 대한 자세한 내용은 about_remoteabout_pssessions를 참고하세요.

$PSSessionOption 환경 설정 변수의 값을 바꾸려면 New-PSSessionOption cmdlet으로 원하는 옵션 값을 가진 PSSessionOption 개체를 만들고, 그 출력을 $PSSessionOption 변수에 저장하면 돼요.

$PSSessionOption = New-PSSessionOption -NoCompression

모든 PowerShell 세션에서 $PSSessionOption 환경 설정 변수를 사용하려면 $PSSessionOption 변수를 만드는 New-PSSessionOption 명령을 PowerShell 프로필에 추가하세요. 자세한 내용은 about_profiles를 참고하세요.

특정 원격 세션에 사용자 지정 옵션을 설정할 수도 있어요. 설정한 옵션은 시스템 기본값과 $PSSessionOption 환경 설정 변수의 값보다 우선합니다.

사용자 지정 세션 옵션을 설정하려면 New-PSSessionOption cmdlet으로 PSSessionOption 개체를 만들어요. 그런 다음 그 PSSessionOption 개체를 New-PSSession, Enter-PSSession, Invoke-Command처럼 세션을 만드는 cmdlet의 SessionOption 매개 변수 값으로 사용하면 됩니다.

$PSStyle

PowerShell 7.2부터 $PSStyle 자동 변수에 접근해서 ANSI 문자열 출력의 렌더링을 보고 바꿀 수 있어요. $PSStylePSStyle 클래스의 인스턴스예요. 이 클래스의 멤버들은 터미널에서 텍스트 렌더링을 제어하는 ANSI 이스케이프 시퀀스를 포함하는 문자열을 정의합니다.

기본 멤버들은 이름에 매핑된 ANSI 이스케이프 시퀀스 문자열을 반환해요. 값을 설정해 사용자 지정할 수도 있습니다. 속성 이름 덕분에 탭 완성을 이용해 꾸며진 문자열을 만들기 수월해요. 예를 들면:

"$($PSStyle.Background.BrightCyan)Power$($PSStyle.Underline)$($PSStyle.Bold)Shell$($PSStyle.Reset)"

BackgroundForeground 멤버에는 24비트 색을 지정하는 FromRgb() 메서드도 있어요.

$PSStyle에 대한 자세한 내용은 about_ansi_terminals를 참고하세요.

$Transcript

Start-Transcript가 트랜스크립트 파일의 이름과 위치를 지정할 때 사용해요. Path 매개 변수 값을 지정하지 않으면 Start-Transcript$Transcript 전역 변수의 값에 있는 경로를 사용합니다. 이 변수를 만들지 않았다면 Start-Transcript는 다음 위치에 기본 이름으로 트랜스크립트를 저장해요.

  • Windows에서: $HOME\Documents
  • Linux나 macOS에서: $HOME

기본 파일 이름은 PowerShell_transcript.<computername>.<random>.<timestamp>.txt예요.

$VerbosePreference

스크립트, cmdlet, provider가 생성하는 자세한(verbose) 메시지에 PowerShell이 어떻게 응답할지 결정해요. 예를 들어 Write-Verbose cmdlet이 생성하는 메시지가 대상이에요. 상세 메시지는 명령을 실행하기 위해 수행되는 동작을 설명합니다.

기본적으로 상세 메시지는 표시되지 않지만, $VerbosePreference의 값을 바꾸면 이 동작을 바꿀 수 있어요.

$VerbosePreference 변수는 ActionPreference 열거형 값 중 하나를 가져요: SilentlyContinue, Stop, Continue, Inquire, Ignore, Suspend, 또는 Break.

유효한 값은 다음과 같아요.

  • Break - Verbose 스트림에 쓸 때 디버거로 진입해요.
  • Stop: 상세 메시지와 오류 메시지를 표시한 뒤 실행을 중지해요.
  • Inquire: 상세 메시지를 표시한 뒤 계속할지 묻는 프롬프트를 표시해요.
  • Continue: 상세 메시지를 표시한 뒤 실행을 계속해요.
  • SilentlyContinue: (기본값) 상세 메시지를 표시하지 않아요. 계속 실행해요.

특정 명령에 대해서만 상세 메시지를 보여주거나 숨기려면 cmdlet의 Verbose 공통 매개 변수를 사용할 수 있어요. 자세한 내용은 about_commonparameters를 참고하세요.

예제

이 예시들은 $VerbosePreference 값에 따른 차이와, 환경 설정 값을 덮어쓰는 Verbose 매개 변수를 보여줘요.

이 예시는 기본값인 SilentlyContinue 값의 효과를 보여줘요. 명령은 Message 매개 변수를 사용하지만 PowerShell 콘솔에 메시지를 기록하지 않습니다.

Write-Verbose -Message "Verbose message test."

Verbose 매개 변수를 사용하면 메시지가 기록돼요.

Write-Verbose -Message "Verbose message test." -Verbose
VERBOSE: Verbose message test.

이 예시는 Continue 값의 효과를 보여줘요. $VerbosePreference 변수를 Continue로 설정하고 메시지가 표시됩니다.

$VerbosePreference = "Continue"
Write-Verbose -Message "Verbose message test."
VERBOSE: Verbose message test.

이 예시는 Continue 값을 덮어쓰는 Verbose 매개 변수를 $false 값으로 사용해요. 메시지가 표시되지 않습니다.

Write-Verbose -Message "Verbose message test." -Verbose:$false

이 예시는 Stop 값의 효과를 보여줘요. $VerbosePreference 변수를 Stop으로 설정하고 메시지가 표시됩니다. 명령이 중지돼요.

$VerbosePreference = "Stop"
Write-Verbose -Message "Verbose message test."
VERBOSE: Verbose message test.
Write-Verbose : The running command stopped because the preference variable
"VerbosePreference" or common parameter is set to Stop: Verbose message test.
At line:1 char:1
+ Write-Verbose -Message "Verbose message test."

이 예시는 Stop 값을 덮어쓰는 Verbose 매개 변수를 $false 값으로 사용해요. 메시지가 표시되지 않습니다.

Write-Verbose -Message "Verbose message test." -Verbose:$false

이 예시는 Inquire 값의 효과를 보여줘요. $VerbosePreference 변수를 Inquire로 설정합니다. 메시지가 표시되고 사용자에게 확인을 요청합니다.

$VerbosePreference = "Inquire"
Write-Verbose -Message "Verbose message test."
VERBOSE: Verbose message test.

Confirm
Continue with this operation?
[Y] Yes  [A] Yes to All  [H] Halt Command  [?] Help (default is "Y"):

이 예시는 Inquire 값을 덮어쓰는 Verbose 매개 변수를 $false 값으로 사용해요. 사용자에게 묻지 않고 메시지도 표시되지 않습니다.

Write-Verbose -Message "Verbose message test." -Verbose:$false

$WarningPreference

스크립트, cmdlet, provider가 생성하는 경고 메시지에 PowerShell이 어떻게 응답할지 결정해요. 예를 들어 Write-Warning cmdlet이 생성하는 메시지가 대상이에요.

기본적으로 경고 메시지는 표시되고 실행은 계속되지만, $WarningPreference 값을 바꾸면 이 동작을 바꿀 수 있어요.

$WarningPreference 변수는 ActionPreference 열거형 값 중 하나를 가져요: SilentlyContinue, Stop, Continue, Inquire, Ignore, Suspend, 또는 Break.

유효한 값은 다음과 같아요.

  • Break - 경고 메시지가 기록될 때 디버거로 진입해요.
  • Stop: 경고 메시지와 오류 메시지를 표시한 뒤 실행을 중지해요.
  • Inquire: 경고 메시지를 표시한 뒤 계속할 권한을 묻는 프롬프트를 표시해요.
  • Continue: (기본값) 경고 메시지를 표시한 뒤 계속 실행해요.
  • SilentlyContinue: 경고 메시지를 표시하지 않아요. 계속 실행해요.

특정 명령의 경고에 PowerShell이 어떻게 응답할지 결정하려면 cmdlet의 WarningAction 공통 매개 변수를 사용할 수 있어요. 자세한 내용은 about_commonparameters를 참고하세요.

예제

이 예시들은 $WarningPreference 값에 따른 차이를 보여줘요. WarningAction 매개 변수가 환경 설정 값을 덮어씁니다.

이 예시는 기본값인 Continue의 효과를 보여줘요.

$m = "This action can delete data."
Write-Warning -Message $m
WARNING: This action can delete data.

이 예시는 경고를 억제하기 위해 WarningAction 매개 변수를 SilentlyContinue 값으로 사용해요. 메시지가 표시되지 않습니다.

$m = "This action can delete data."
Write-Warning -Message $m -WarningAction SilentlyContinue

이 예시는 $WarningPreference 변수를 SilentlyContinue 값으로 바꿔요. 메시지가 표시되지 않습니다.

$WarningPreference = "SilentlyContinue"
$m = "This action can delete data."
Write-Warning -Message $m

이 예시는 경고가 생성될 때 중지하도록 WarningAction 매개 변수를 사용해요.

$m = "This action can delete data."
Write-Warning -Message $m -WarningAction Stop
WARNING: This action can delete data.
Write-Warning : The running command stopped because the preference variable
"WarningPreference" or common parameter is set to Stop:
This action can delete data.
At line:1 char:1
+ Write-Warning -Message $m -WarningAction Stop

이 예시는 $WarningPreference 변수를 Inquire 값으로 바꿔요. 사용자에게 확인을 요청합니다.

$WarningPreference = "Inquire"
$m = "This action can delete data."
Write-Warning -Message $m
WARNING: This action can delete data.

Confirm
Continue with this operation?
[Y] Yes  [A] Yes to All  [H] Halt Command  [?] Help (default is "Y"):

이 예시는 WarningAction 매개 변수를 SilentlyContinue 값으로 사용해요. 명령이 계속 실행되고 메시지는 표시되지 않습니다.

$m = "This action can delete data."
Write-Warning -Message $m -WarningAction SilentlyContinue

이 예시는 $WarningPreference 값을 Stop으로 바꿔요.

$WarningPreference = "Stop"
$m = "This action can delete data."
Write-Warning -Message $m
WARNING: This action can delete data.
Write-Warning : The running command stopped because the preference variable
"WarningPreference" or common parameter is set to Stop:
This action can delete data.
At line:1 char:1
+ Write-Warning -Message $m

이 예시는 WarningActionInquire 값으로 사용해요. 경고가 발생하면 사용자에게 묻습니다.

$m = "This action can delete data."
Write-Warning -Message $m -WarningAction Inquire
WARNING: This action can delete data.

Confirm
Continue with this operation?
[Y] Yes  [A] Yes to All  [H] Halt Command  [?] Help (default is "Y"):

$WhatIfPreference

WhatIf를 지원하는 모든 명령에 대해 WhatIf를 자동으로 활성화할지 결정해요. WhatIf가 활성화되면 cmdlet은 명령의 예상 효과를 보고하지만 명령을 실행하지는 않습니다.

유효한 값은 다음과 같아요.

  • False (0, 비활성화): (기본값) WhatIf가 자동으로 활성화되지 않아요. 수동으로 활성화하려면 cmdlet의 WhatIf 매개 변수를 사용하세요.
  • True (1, 활성화): WhatIf가 지원하는 모든 명령에 자동으로 활성화돼요. 사용자는 WhatIf 매개 변수를 False 값으로 사용해서 수동으로 비활성화할 수 있는데, 예를 들어 -WhatIf:$false처럼요.

예제

이 예시들은 $WhatIfPreference 값에 따른 차이를 보여줘요. 또한 특정 명령에 대해 환경 설정 값을 덮어쓰는 WhatIf 매개 변수 사용법을 보여줍니다.

이 예시는 $WhatIfPreference 변수를 기본값인 False로 설정했을 때의 효과를 보여줘요. Get-ChildItem으로 파일이 존재하는지 확인합니다. Remove-Item이 파일을 삭제해요. 파일이 삭제된 뒤 Get-ChildItem으로 삭제를 확인할 수 있습니다.

Get-ChildItem -Path .\test.txt
Remove-Item -Path ./test.txt
Directory: C:\Test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           9/13/2019    10:53             10 test.txt
Get-ChildItem -Path .\test.txt
Get-ChildItem : Cannot find path 'C:\Test\test.txt' because it does not exist.
At line:1 char:1
+ Get-ChildItem -File test.txt

이 예시는 $WhatIfPreference 값이 False일 때 WhatIf 매개 변수를 사용했을 때의 효과를 보여줘요.

파일이 존재하는지 확인해 볼게요.

Get-ChildItem -Path .\test2.txt
Directory: C:\Test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           2/28/2019    17:06             12 test2.txt

WhatIf 매개 변수로 파일을 삭제하려고 했을 때의 결과를 확인해요.

Remove-Item -Path .\test2.txt -WhatIf
What if: Performing the operation "Remove File" on target "C:\Test\test2.txt".

파일이 삭제되지 않았는지 확인합니다.

Get-ChildItem -Path .\test2.txt
Directory: C:\Test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           2/28/2019    17:06             12 test2.txt

이 예시는 $WhatIfPreference 변수를 True로 설정했을 때의 효과를 보여줘요. Remove-Item으로 파일을 삭제하려 하면 파일 경로가 표시되지만 파일은 삭제되지 않습니다.

파일을 삭제하려 시도해 볼게요. Remove-Item을 실행했을 때 어떻게 될지에 대한 메시지가 표시되지만 파일은 삭제되지 않습니다.

$WhatIfPreference = "True"
Remove-Item -Path .\test2.txt
What if: Performing the operation "Remove File" on target "C:\Test\test2.txt".

Get-ChildItem으로 파일이 삭제되지 않았는지 확인해요.

Get-ChildItem -Path .\test2.txt
Directory: C:\Test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           2/28/2019    17:06             12 test2.txt

이 예시는 $WhatIfPreference 값이 True일 때 파일을 삭제하는 방법을 보여줘요. WhatIf 매개 변수를 $false 값으로 사용합니다. Get-ChildItem으로 파일이 삭제됐는지 확인해요.

Remove-Item -Path .\test2.txt -WhatIf:$false
Get-ChildItem -Path .\test2.txt
Get-ChildItem : Cannot find path 'C:\Test\test2.txt' because it does not exist.
At line:1 char:1
+ Get-ChildItem -Path .\test2.txt

다음은 WhatIf를 지원하지 않는 Get-ProcessWhatIf를 지원하는 Stop-Process의 예시예요. $WhatIfPreference 변수 값은 True입니다.

Get-ProcessWhatIf를 지원하지 않아요. 명령을 실행하면 Winword 프로세스가 표시됩니다.

Get-Process -Name Winword
NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
------    -----      -----     ------      --  -- -----------
130   119.84     173.38       8.39   15024   4 WINWORD

Stop-ProcessWhatIf를 지원해요. Winword 프로세스는 중지되지 않습니다.

Stop-Process -Name Winword
What if: Performing the operation "Stop-Process" on target "WINWORD (15024)".

Stop-ProcessWhatIf 동작은 WhatIf 매개 변수를 $false 값으로 사용해서 덮어쓸 수 있어요. Winword 프로세스가 중지됩니다.

Stop-Process -Name Winword -WhatIf:$false

Winword 프로세스가 중지됐는지 Get-Process로 확인해요.

Get-Process -Name Winword
Get-Process : Cannot find a process with the name "Winword".
Verify the process name and call the cmdlet again.
At line:1 char:1
+ Get-Process -Name Winword

더 알아보기