Function 공급자
Function 공급자 (about_Function_Provider)
PowerShell의 Function 공급자는 세션에 정의된 함수와 필터를 다루는 방법을 보여주는 문서예요. Function: 드라이브라는 공간에서 함수를 조회하고, 새로 만들고, 내용을 바꾸고, 삭제하는 흐름을 하나씩 따라가 보면서, 함수를 파일처럼 탐색하는 감각을 익혀볼게요. 코드는 그대로 두고 설명만 우리말로 풀었어요.
본문
공급자 이름 (Provider name)
Function
드라이브 (Drives)
Function:
기능 (Capabilities)
ShouldProcess
간단한 설명
PowerShell에 정의된 함수에 접근할 수 있게 해줘요.
자세한 설명
PowerShell의 Function 공급자는 PowerShell 안의 함수와 필터를 가져오고(get), 추가하고(add), 바꾸고(change), 비우고(clear), 삭제하는(delete) 일을 해줘요.
함수(function)는 이름이 붙은 코드 블록으로, 어떤 동작을 수행해요. 함수 이름을 입력하면 그 안의 코드가 실행되지요. 필터(filter)는 어떤 동작의 조건을 정해두는 이름 붙은 코드 블록이에요. Where-Object 명령 같은 데에서 조건 자리에 필터 이름을 써넣을 수 있어요.
Function: 드라이브는 함수와 필터 개체만 담는 평평한(flat) 이름 공간이에요. 함수와 필터 모두 자식 항목은 없어요.
Function 공급자는 다음 cmdlet을 지원하는데, 이 글에서 모두 다룰게요.
- Get-Location https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-location?view=powershell-7.6
- Set-Location https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-location?view=powershell-7.6
- Get-Item https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-item?view=powershell-7.6
- New-Item https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-item?view=powershell-7.6
- Remove-Item https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-item?view=powershell-7.6
- Clear-Item https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/clear-item?view=powershell-7.6
이 공급자가 다루는 형식 (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
- New-Item https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-item?view=powershell-7.6
- Set-Item https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-item?view=powershell-7.6
파이프라인 사용하기
공급자 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: