PowerShell은 자동화에 사용되는 명령줄 셸 및 스크립팅 언어입니다. Linux 또는 Windows 명령 셸(bash)와 같은 cmd.exe 다른 셸과 마찬가지로 PowerShell을 사용하면 PowerShell 명령뿐만 아니라 시스템에서 사용할 수 있는 모든 명령을 실행할 수 있습니다.
명령 유형
모든 운영 체제의 모든 셸에는 다음 세 가지 유형의 명령이 있습니다.
쉘 언어 키워드는 셸의 스크립팅 언어의 일부입니다.
-
bash키워드의 예로는if,then,else,elif및fi있습니다. -
cmd.exe키워드의 예로는dir,copy,move,if및echo있습니다. - PowerShell 키워드의 예로는
for,foreach,try,catch및trap있습니다.
셸 언어 키워드는 셸의 런타임 환경 내에서만 사용할 수 있습니다. 키워드의 기능을 제공하는 셸 외부의 실행 파일이 없습니다.
-
OS 네이티브 명령 운영 체제에 설치된 실행 파일입니다. 실행 파일은 PowerShell과 같은 명령줄 셸에서 실행할 수 있습니다. 여기에는 다른 셸이 제대로 작동해야 하는 스크립트 파일이 포함됩니다. 예를 들어 PowerShell에서 Windows 일괄 처리 스크립트(
.cmd파일)를 실행하는 경우 PowerShell은cmd.exe실행하고 실행을 위해 일괄 처리 파일을 전달합니다.셸 환경별 명령 셸의 런타임 환경 내에서만 사용할 수 있는 외부 파일에 정의된 명령입니다. 여기에는 셸 런타임에 명령을 추가하는 스크립트, 함수 및 모듈이 포함됩니다. PowerShell에서 모듈에서 추가된 이러한 명령을 cmdlet ("command-lets"로 발음)으로 알려져 있습니다.
네이티브 명령 실행
모든 네이티브 명령은 PowerShell 명령줄에서 실행할 수 있습니다. 일반적으로 bash 또는 cmd.exe것과 똑같이 명령을 실행합니다. 다음 예제는 Ubuntu Linux에서 grep의 bash 명령 실행을 보여줍니다.
sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
Ubuntu에서 PowerShell을 시작한 후 PowerShell 명령줄에서 동일한 명령을 실행할 수 있습니다.
PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
네이티브 명령에 인수 전달
대부분의 셸에는 변수 사용, 식 평가 및 문자열 처리 기능이 포함됩니다. 그러나 각 셸은 이러한 작업을 다르게 수행합니다. PowerShell에서 모든 매개 변수는 하이픈(-) 문자로 시작합니다.
cmd.exe에서는 대부분의 명령어 매개변수가 슬래시(/) 문자를 사용합니다. 다른 명령줄 도구는 공백, 하이픈, 이중 대시(--)를 사용할 수 있습니다.
각 셸에는 명령줄에서 문자열을 처리하고 평가하는 고유한 방법이 있습니다. 특정 방식으로 문자열을 따옴표로 묶을 것으로 예상되는 PowerShell에서 네이티브 명령을 실행하는 경우 해당 문자열을 전달하는 방법을 조정해야 할 수 있습니다.
자세한 내용은 다음 문서를 참조하세요.
PowerShell 7.2에는 네이티브 명령 처리를 개선하는 새로운 실험적 기능 PSNativeCommandArgumentPassing 도입되었습니다. 자세한 내용은 $PSNativeCommandArgumentPassing참조하세요.
출력 및 오류 처리
또한 PowerShell에는 다른 셸보다 여러 개의 출력 스트림이 있습니다.
bash 및 cmd.exe 셸에는 stdout 및 stderr있습니다. PowerShell에는 6개의 출력 스트림이 있습니다. 자세한 내용은 about_Redirection 및 about_Output_Streams참조하세요.
일반적으로 네이티브 명령에 의해 stdout 전송된 출력은 PowerShell의 성공 스트림으로 전송됩니다. 네이티브 명령으로 stderr 전송된 출력은 PowerShell의 오류 스트림으로 전송됩니다.
네이티브 명령이 0이 아닌 종료 코드를 반환할 때, $?가 $false로 설정됩니다. 종료 코드가 0이면 $?는 $true로 설정된다.
그러나 PowerShell 7.2는 이 동작을 변경했습니다. 리디렉션 연산자(2>&1)를 사용하는 경우와 같이 네이티브 명령에서 리디렉션된 오류 레코드는 PowerShell의 $Error 변수에 기록되지 않으며 $ErrorActionPreference 기본 설정 변수는 리디렉션된 출력에 영향을 주지 않습니다.
많은 기본 명령은 추가 정보를 제공하기 위한 대체 스트림으로서 stderr를 사용하여 기록합니다. 이 동작은 오류를 살펴볼 때 PowerShell에서 혼동을 일으킬 수 있으며 $ErrorActionPreference 출력을 음소거하는 상태로 설정된 경우 추가 출력 정보가 손실될 수 있습니다.
PowerShell 7.3에는 네이티브 명령에서 0이 아닌 종료 코드를 처리하는 방법을 제어할 수 있는 새로운 실험적 기능이 PSNativeCommandErrorActionPreference 추가되었습니다. 자세한 내용은 $PSNativeCommandUseErrorActionPreference참조하세요.
PowerShell 명령 실행
앞에서 설명한 것처럼 PowerShell 명령을 cmdlet이라고 합니다. Cmdlet은 요청 시 로드할 수 있는 PowerShell 모듈에 수집됩니다. Cmdlet은 컴파일된 모든 .NET 언어로 작성하거나 PowerShell 스크립팅 언어 자체를 사용할 수 있습니다.
다른 명령을 실행하는 PowerShell 명령
PowerShell 호출 연산자(&)를 사용하면 변수에 저장되고 문자열 또는 스크립트 블록으로 표현되는 명령을 실행할 수 있습니다. 연산자를 사용하여 네이티브 명령 또는 PowerShell 명령을 실행할 수 있습니다. 이는 네이티브 명령에 대한 명령줄 매개 변수를 동적으로 구성해야 하는 경우 스크립트에서 유용합니다. 자세한 내용은 호출 연산자참조하세요.
Start-Process cmdlet은 네이티브 명령을 실행하는 데 사용할 수 있지만 명령이 실행되는 방법을 제어해야 하는 경우에만 사용해야 합니다. cmdlet에는 다음 시나리오를 지원하는 매개 변수가 있습니다.
- 다른 자격 증명을 사용하여 명령 실행
- 새 프로세스에서 만든 콘솔 창 숨기기
- stdin 을로, stdout 을로, 그리고 stderr 을로 스트림을 리디렉션
- 명령에 다른 작업 디렉터리 사용
다음 예제에서는 리디렉션된 입력 및 출력 스트림을 사용하여 네이티브 명령 sort.exe 실행합니다.
$processOptions = @{
FilePath = "sort.exe"
RedirectStandardInput = "TestSort.txt"
RedirectStandardOutput = "Sorted.txt"
RedirectStandardError = "SortError.txt"
UseNewEnvironment = $true
}
Start-Process @processOptions
자세한 내용은 시작 프로세스을 참조하세요.
Windows에서 Invoke-Item cmdlet은 지정된 항목에 대한 기본 작업을 수행합니다. 예를 들어 실행 파일을 실행하거나 문서 파일 형식과 연결된 응용 프로그램을 사용하여 문서 파일을 엽니다. 기본 작업은 항목 유형 및 항목에 대한 액세스를 제공하는 PowerShell 공급자에 따라 달라집니다.
다음 예제에서는 기본 웹 브라우저에서 PowerShell 소스 코드 리포지토리를 엽니다.
Invoke-Item https://github.com/PowerShell/PowerShell
자세한 내용은 Invoke-Item참조하세요.
PowerShell