다음을 통해 공유


about_Command_Precedence

간단한 설명

PowerShell에서 실행할 명령을 결정하는 방법을 설명합니다.

자세한 설명

명령 우선 순위는 PowerShell이 세션에 이름이 같은 명령이 둘 이상 포함되어 있을 때 실행할 명령을 결정하는 방법을 설명합니다. 세션 내의 명령을 숨기거나 이름이 같은 명령으로 바꿀 수 있습니다. 이 문서에서는 숨겨진 명령을 실행하는 방법과 명령 이름 충돌을 방지하는 방법을 보여 줍니다.

명령 우선 순위

PowerShell 세션에 이름이 같은 명령이 두 개 이상 포함된 경우 PowerShell은 다음 규칙을 사용하여 실행할 명령을 결정합니다.

명령에 대한 경로를 지정하는 경우 PowerShell은 경로에 지정된 위치에서 명령을 실행합니다.

예를 들어 다음 명령은 디렉터리에서 FindDocs.ps1 스크립트를 C:\TechDocs 실행합니다.

C:\TechDocs\FindDocs.ps1

전체 경로를 사용하여 실행 가능한 명령을 실행할 수 있습니다. 보안 기능인 PowerShell은 환경 변수에 나열된 $env:Path 경로에 명령이 없는 한 PowerShell 스크립트 및 네이티브 명령을 비롯한 실행 가능한 명령을 실행하지 않습니다.

현재 디렉터리에 있는 실행 파일을 실행하려면 전체 경로를 지정하거나 상대 경로를 .\ 사용하여 현재 디렉터리를 나타냅니다.

예를 들어 현재 디렉터리에서 파일을 실행 FindDocs.ps1 하려면 다음을 입력합니다.

.\FindDocs.ps1

경로를 지정하지 않으면 명령을 실행할 때 PowerShell에서 다음 우선 순위 순서를 사용합니다.

  1. Alias
  2. 함수
  3. Cmdlet(Cmdlet 이름 확인 참조)
  4. 외부 실행 파일(PowerShell 스크립트 파일 포함)

따라서 입력 help하는 경우 PowerShell은 먼저 명명된 help별칭을 찾은 다음, 명명 Help된 함수를 찾은 다음, 마지막으로 이름이 지정된 Helpcmdlet을 찾습니다. 찾은 첫 번째 help 항목을 실행합니다.

예를 들어 입력할 때 Get-Map세션에 cmdlet과 함수가 모두 포함된 Get-Map경우 PowerShell은 함수를 실행합니다.

참고 항목

이는 로드된 명령에만 적용됩니다. 현재 세션에 build 로드되지 않은 모듈 내부의 이름을 가진 함수에 Invoke-Build 대한 실행 파일 및 별칭 build 이 있는 경우 PowerShell은 대신 실행 파일을 실행합니다build. 외부 실행 파일을 찾으면 모듈을 자동으로 로드하지 않습니다. 지정된 이름의 별칭, 함수 또는 cmdlet이 호출되는 외부 실행 파일이 없는 경우에만 발생합니다.

이름이 같은 항목 확인

이러한 규칙의 결과로 항목은 이름이 같은 항목으로 바꾸거나 숨길 수 있습니다.

모듈 이름으로 항목 이름을 한정하는 등 원래 항목에 계속 액세스할 수 있는 경우 항목이 숨겨지거나 겨집니다.

예를 들어 세션에서 cmdlet과 이름이 같은 함수를 가져오는 경우 cmdlet은 숨겨지지만 대체되지는 않습니다. 모듈 정규화된 이름을 지정하여 cmdlet을 실행할 수 있습니다.

항목을 바꾸 거나 덮어쓰면 더 이상 원래 항목에 액세스할 수 없습니다.

예를 들어 세션의 변수와 이름이 같은 변수를 가져오면 원래 변수가 바뀝다. 모듈 이름을 사용하여 변수를 한정할 수 없습니다.

명령줄에서 함수를 만든 다음 이름이 같은 함수를 가져오면 원래 함수가 바뀝다.

숨겨진 명령 찾기

Get-Command cmdlet의 All 매개 변수는 숨겨지거나 바뀐 경우에도 지정된 이름의 모든 명령을 가져옵니다. 기본적으로 PowerShell 3.0 Get-Command 부터는 명령 이름을 입력할 때 실행되는 명령만 가져옵니다.

다음 예제에서 세션에는 함수와 Get-Date cmdlet이 포함 Get-Date 됩니다. 어떤 명령이 먼저 선택되었는지 확인하는 데 사용할 Get-Command 수 있습니다.

Get-Command Get-Date
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date

All 매개 변수를 사용하여 사용 가능한 Get-Date 명령을 나열합니다.

Get-Command Get-Date -All
CommandType     Name                 Version    Source
-----------     ----                 -------    ------
Function        Get-Date
Cmdlet          Get-Date             7.0.0.0    Microsoft.PowerShell.Utility
Get-Command where -All
CommandType Name                     Version      Source
----------- ----                     -------      ------
Alias       where -> Where-Object
Application where.exe                10.0.22621.1 C:\Windows\system32\where.exe

동일한 이름을 가질 수 있는 다른 명령과 명령을 구분하는 정규화된 정보를 포함하여 특정 명령을 실행할 수 있습니다. cmdlet의 경우 모듈 정규화된 이름을 사용할 수 있습니다. 실행 파일의 경우 파일 확장자를 포함할 수 있습니다. 예를 들어 실행 가능한 사용 버전을 wherewhere.exe실행합니다.

모듈 정규화된 이름 사용

cmdlet의 모듈 정규화된 이름을 사용하면 동일한 이름의 항목에 의해 숨겨진 명령을 실행할 수 있습니다. 예를 들어 모듈 이름 Microsoft.PowerShell.Utility 또는 해당 경로로 정규화하여 cmdlet을 실행할 Get-Date 수 있습니다. 모듈 정규화된 이름을 사용하는 경우 값 $PSModuleAutoLoadingPreference에 따라 모듈을 세션으로 자동으로 가져올 수 있습니다.

참고 항목

모듈 이름을 사용하여 변수 또는 별칭을 한정할 수 없습니다.

모듈 정규화된 이름을 사용하면 실행하려는 명령을 실행해야 합니다. 배포하려는 스크립트를 작성할 때 cmdlet을 호출하는 권장 방법입니다.

다음 예제에서는 모듈 이름을 포함하여 명령을 한정하는 방법을 보여 줍니다.

Important

모듈 한정은 플랫폼에 관계없이 백슬래시 문자(\)를 사용하여 모듈 이름을 명령 이름과 구분합니다.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM

모듈에서 MapFunctions 명령을 실행 New-Map 하려면 모듈의 정규화된 이름을 사용합니다.

MapFunctions\New-Map

명령을 가져온 모듈을 찾으려면 명령의 ModuleName 속성을 사용합니다.

(Get-Command <command-name>).ModuleName

예를 들어 cmdlet의 원본을 Get-Date 찾으려면 다음을 입력합니다.

(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility

모듈 경로를 사용하여 명령의 이름을 한정하려면 명령 이름 앞에 슬래시(/)를 경로 구분 기호로 사용하고 백슬래시 문자(\)를 사용해야 합니다. 다음 예제를 사용하여 cmdlet을 Get-Date 실행합니다.

//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

경로는 전체 경로 또는 현재 위치를 기준으로 하는 경로일 수 있습니다. Windows에서는 드라이브 정규화된 경로를 사용할 수 없습니다. 이전 예제와 같이 UNC 경로 또는 현재 드라이브에 상대적인 경로를 사용해야 합니다. 다음 예제에서는 현재 위치가 드라이브에 있다고 가정합니다 C: .

/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

호출 연산자 사용

호출 연산자(&)를 사용하여 Get-ChildItem(별칭) 또는 Get-Module에 대한 호출과 결합하여 숨겨진 명령을 실행할 수도 있습니다dirGet-Command.

호출 연산자는 자식 범위에서 문자열 및 스크립트 블록을 실행합니다. 자세한 내용은 about_Operators 참조하세요.

예를 들어 다음 명령을 사용하여 명명Map된 별칭으로 숨겨진 함수 Map 를 실행합니다.

& (Get-Command -Name Map -CommandType Function)

또는

& (dir Function:\map)

또한 변수에 숨겨진 명령을 저장하여 더 쉽게 실행할 수 있습니다.

예를 들어 다음 명령은 함수를 Map 변수에 $myMap 저장한 다음 연산자를 Call 사용하여 실행합니다.

$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)

대체된 항목

대체된 항목은 더 이상 액세스할 수 없는 항목입니다. 모듈에서 같은 이름의 항목을 가져와 항목을 바꿀 수 있습니다.

예를 들어 세션에 함수를 Get-Map 입력하고 호출 Get-Map된 함수를 가져오면 원래 함수가 바뀝니다. 현재 세션에서는 검색할 수 없습니다.

변수 및 별칭은 호출 연산자 또는 정규화된 이름을 사용하여 실행할 수 없으므로 숨길 수 없습니다. 모듈에서 변수와 별칭을 가져올 때 세션의 변수를 동일한 이름으로 바꿉니다.

Cmdlet 이름 확인

cmdlet의 정규화된 이름을 사용하지 않으면 PowerShell에서 검사 cmdlet이 현재 세션에서 로드되었는지 확인합니다. 동일한 cmdlet 이름을 포함하는 여러 모듈이 로드된 경우 PowerShell은 사전순으로 찾은 첫 번째 모듈의 cmdlet을 사용합니다.

cmdlet이 로드되지 않으면 PowerShell은 설치된 모듈을 검색하고 cmdlet이 포함된 첫 번째 모듈을 자동으로 로드하고 해당 cmdlet을 실행합니다. PowerShell은 환경 변수에 정의된 각 경로에서 모듈을 $env:PSModulePath 검색합니다. 경로는 변수에 나열된 순서대로 검색됩니다. 각 경로 내에서 모듈은 사전순으로 검색됩니다. PowerShell은 찾은 첫 번째 일치 항목의 cmdlet을 사용합니다.

이름 충돌 방지

명령 이름 충돌을 관리하는 가장 좋은 방법은 충돌을 방지하는 것입니다. 명령 이름을 지정할 때 고유한 이름을 사용합니다. 예를 들어 명령의 명사에 이니셜 또는 회사 이름 약어를 추가합니다.

PowerShell 모듈 또는 다른 세션에서 세션으로 명령을 가져올 때 Import-Module 또는 Import-PSSession cmdlet의 매개 변수를 사용하여 Prefix 명령 이름에 명사에 접두사를 추가할 수 있습니다.

예를 들어 다음 명령은 모듈을 가져올 때 PowerShell과 함께 제공되는 cmdlet과 Get-DateSet-Date 충돌하지 않도록 방지합니다 DateFunctions .

Import-Module -Name DateFunctions -Prefix ZZ

외부 실행 파일 실행

Windows에서. PowerShell은 환경 변수에 나열된 파일 확장자를 $env:PATHEXT 실행 파일로 처리합니다. Windows 실행 파일이 아닌 파일은 Windows에 전달되어 처리합니다. Windows는 파일 연결을 조회하고 확장에 대한 기본 Windows Shell 동사를 실행합니다. Windows에서 파일 확장명별 실행을 지원하려면 연결이 시스템에 등록되어 있어야 합니다.

CMD 명령 셸의 명령과 assoc 명령을 사용하여 ftype 파일 확장명용 실행 엔진을 등록할 수 있습니다. PowerShell에는 파일 처리기를 등록하는 직접 메서드가 없습니다. 자세한 내용은 ftype 명령에 대한 설명서를 참조하세요.

PowerShell이 현재 세션에서 파일 확장자를 실행 파일로 보려면 환경 변수에 확장 $env:PATHEXT 자를 추가해야 합니다.

참고 항목