Function 공급자

Function 공급자 (about_Function_Provider)

PowerShell의 Function 공급자는 세션에 정의된 함수와 필터를 다루는 방법을 보여주는 문서예요. Function: 드라이브라는 공간에서 함수를 조회하고, 새로 만들고, 내용을 바꾸고, 삭제하는 흐름을 하나씩 따라가 보면서, 함수를 파일처럼 탐색하는 감각을 익혀볼게요. 코드는 그대로 두고 설명만 우리말로 풀었어요.

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

본문

공급자 이름 (Provider name)

Function

드라이브 (Drives)

Function:

기능 (Capabilities)

ShouldProcess

간단한 설명

PowerShell에 정의된 함수에 접근할 수 있게 해줘요.

자세한 설명

PowerShell의 Function 공급자는 PowerShell 안의 함수와 필터를 가져오고(get), 추가하고(add), 바꾸고(change), 비우고(clear), 삭제하는(delete) 일을 해줘요.

함수(function)는 이름이 붙은 코드 블록으로, 어떤 동작을 수행해요. 함수 이름을 입력하면 그 안의 코드가 실행되지요. 필터(filter)는 어떤 동작의 조건을 정해두는 이름 붙은 코드 블록이에요. Where-Object 명령 같은 데에서 조건 자리에 필터 이름을 써넣을 수 있어요.

Function: 드라이브는 함수와 필터 개체만 담는 평평한(flat) 이름 공간이에요. 함수와 필터 모두 자식 항목은 없어요.

Function 공급자는 다음 cmdlet을 지원하는데, 이 글에서 모두 다룰게요.

이 공급자가 다루는 형식 (Types exposed by this provider)

각 함수는 System.Management.Automation.FunctionInfo https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.functioninfo 클래스의 인스턴스로 표현되고, 각 필터는 System.Management.Automation.FilterInfo https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.filterinfo 클래스의 인스턴스로 표현돼요.

Function 드라이브 탐색하기

Function 공급자는 데이터 저장소를 Function: 드라이브로 노출해요. 함수를 다루려면 Function: 드라이브로 위치를 옮기면 돼요(Set-Location Function:). 물론 다른 PowerShell 드라이브에서도 작업할 수 있고, 다른 위치에서 함수를 참조할 때는 경로에 드라이브 이름(Function:)을 넣어줘요.

Set-Location Function:

파일 시스템 드라이브로 돌아가려면 드라이브 이름을 입력하면 돼요. 예를 들면 이렇게요.

Set-Location C:\

Function 공급자는 다른 어떤 PowerShell 드라이브에서도 쓸 수 있어요. 다른 위치에서 함수를 참조할 땐 경로에 드라이브 이름 Function:을 넣어주면 된답니다.

참고: PowerShell은 별칭(alias)을 지원해서 공급자 경로를 익숙한 방식으로 다룰 수 있게 해줘요. dir, ls 같은 명령은 이제 Get-ChildItem https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7.6의 별칭이고, cd는 Set-Location https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-location?view=powershell-7.6의 별칭, pwd는 Get-Location https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-location?view=powershell-7.6의 별칭이에요.

함수 가져오기

이 명령은 현재 세션의 모든 함수 목록을 가져와요. 어떤 PowerShell 드라이브에서든 사용할 수 있어요.

Get-ChildItem -Path Function:

Function 공급자에는 컨테이너가 없어서, 위 명령을 Get-ChildItem로 써도 결과는 같아요.

Get-ChildItem -Path Function:

함수의 정의(definition)는 아래처럼 Definition 속성으로 꺼내볼 수 있어요.

(Get-Item -Path Function:more).Definition

함수 정의는 경로 앞에 달러 기호($)를 붙여서 가져올 수도 있어요.

$Function:more

이름에 대시(-)가 들어간 함수의 정의를 가져올 때는 달러 기호 뒤의 값을 중괄호로 감싸주세요.

${Function:Clear-Host}

원하는 함수만 가져오기

이 명령은 Function: 드라이브에서 man 함수를 가져와요. Get-Item cmdlet으로 함수를 얻고, 파이프라인 연산자(|)로 결과를 Format-Table에 넘겨요. -Wrap 매개 변수는 줄에 안 들어가는 텍스트를 다음 줄로 넘겨주고, -AutoSize 매개 변수는 텍스트에 맞게 표의 열 크기를 조절해줘요.

Get-Item -Path man | Format-Table -Wrap -AutoSize

Function 공급자 경로 다루기

아래 두 명령은 모두 C:라는 이름의 함수를 가져와요. 첫 번째 명령은 어떤 드라이브에서든 쓸 수 있고, 두 번째 명령은 Function: 드라이브 안에서 써요. 이름이 드라이브 문법인 콜론으로 끝나기 때문에, 경로를 드라이브 이름으로 한정(qualify)해줘야 해요. Function: 드라이브 안에서는 두 형식 모두 사용할 수 있어요. 두 번째 명령에서 점(.)은 현재 위치를 뜻해요.

PS C:\> Get-Item -Path Function:c:
PS Function:\> Get-Item -Path .\c:

함수 만들기

이 명령은 New-Item cmdlet으로 Win32:라는 함수를 만들어요. 중괄호 안의 식은 함수 이름이 나타내는 scriptblock이에요.

New-Item -Path Function:Win32: -Value {Set-Location C:\Windows\System32}

범위 (Scopes)

변수와 마찬가지로 함수도 특정 범위(scope)에 속해요. 함수를 만들면 그 함수는 만들어진 범위 안에서만 사용할 수 있어요. 함수를 다른 범위에서도 쓰고 싶다면 함수를 만들 때 범위 한정자(scope modifier)를 사용하면 돼요. 자세한 내용은 about_Scopes https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.6를 참고하세요.

다음 예시는 Global: 범위 한정자를 사용해서 함수를 전역 범위에 만드는 모습이에요.

function New-Function {
 param(
 [string] $Name,
 [scriptblock] $Script
 )

 $lp = "Function:\Global:$($Name)"
 Set-Item -LiteralPath $lp -Value $Script -PassThru -Force
}

New-Function -Name 'Win32:' -Script { Set-Location C:\Windows\System32 }

Global: 범위 한정자를 빼면 함수는 로컬 범위에 만들어져요. New-Function이 끝나는 순간 새로 만든 함수는 더 이상 존재하지 않게 되지요.

함수 삭제하기

이 명령은 현재 세션에서 more 함수를 삭제해요.

Remove-Item Function:more

함수 바꾸기

이 명령은 Set-Item cmdlet으로 prompt 함수를 바꿔서, 경로 앞에 시간이 표시되게 만들어요.

Set-Item -Path Function:prompt -Value {
 'PS '+ (Get-Date -Format t) + " " + (Get-Location) + '> '
 }

함수 이름 바꾸기

이 명령은 Rename-Item cmdlet으로 help 함수의 이름을 gh로 바꿔요.

Rename-Item -Path Function:help -NewName gh

함수 복사하기

이 명령은 prompt 함수를 oldPrompt로 복사해서, prompt 함수가 연결된 scriptblock에 새 이름을 사실상 만들어줘요. 원래 prompt 함수를 나중에 바꿀 계획이라면 그 전에 이렇게 원본을 저장해둘 수 있어요. 새 함수의 Options 속성 값은 None이에요. Options 속성 값을 바꾸려면 Set-Item을 사용하세요.

Copy-Item -Path Function:prompt -Destination Function:oldPrompt

동적 매개 변수 (Dynamic parameters)

동적 매개 변수는 PowerShell 공급자가 추가한 cmdlet 매개 변수로, 해당 매개 변수는 cmdlet을 공급자가 활성화된 드라이브 안에서 사용할 때만 쓸 수 있어요.

Options <[System.Management.Automation.ScopedItemOptions]>

함수의 Options 속성 값을 결정해요.

  • None: 옵션 없음. None이 기본값이에요.
  • Constant: 함수를 삭제할 수 없고, 속성도 바꿀 수 없어요. Constant는 함수를 만들 때만 사용할 수 있어요. 이미 존재하는 함수의 옵션을 Constant로 바꿀 수는 없어요.
  • Private: 함수가 현재 범위에서만 보여요. (자식 범위에서는 보이지 않아요.)
  • ReadOnly: -Force 매개 변수를 쓰지 않는 한 함수의 속성을 바꿀 수 없어요. Remove-Item으로 함수를 삭제하는 것은 가능해요.
  • AllScope: 새 범위가 만들어질 때마다 함수가 그 범위로 복사돼요.

지원하는 cmdlet

파이프라인 사용하기

공급자 cmdlet은 파이프라인 입력을 받아들여요. 파이프라인을 쓰면 한 cmdlet의 공급자 데이터를 다른 공급자 cmdlet으로 넘겨서 작업을 간단하게 만들 수 있어요. 공급자 cmdlet에서 파이프라인을 사용하는 방법을 더 자세히 알고 싶다면 이 글 곳곳에 걸어둔 cmdlet 참조 문서를 확인해보세요.

도움말 얻기

Windows PowerShell 3.0부터, 파일 시스템 드라이브에서 공급자 cmdlet이 어떻게 동작하는지 설명하는 맞춤형 도움말 항목을 얻을 수 있어요.

파일 시스템 드라이브용으로 맞춤화된 도움말 항목을 가져오려면 파일 시스템 드라이브에서 Get-Help https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/get-help?view=powershell-7.6 명령을 실행하거나, Get-Help https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/get-help?view=powershell-7.6-Path 매개 변수로 파일 시스템 드라이브를 지정하면 돼요.

Get-Help Get-ChildItem
Get-Help Get-ChildItem -Path Function:

더 알아보기