programing

PowerShell에서 파일에 함수를 정의하고 PowerShell 명령줄에서 호출하려면 어떻게 해야 합니까?

batch 2023. 4. 21. 20:24
반응형

PowerShell에서 파일에 함수를 정의하고 PowerShell 명령줄에서 호출하려면 어떻게 해야 합니까?

커스텀 함수를 정의하는 .ps1 파일이 있습니다.

파일의 이름은 MyFunctions.ps1이며 내용은 다음과 같습니다.

Write-Host "Installing functions"
function A1
{
    Write-Host "A1 is running!"
}
Write-Host "Done"

이 스크립트를 실행하고 이론적으로 A1 함수를 등록하려면 .ps1 파일이 있는 폴더로 이동하여 파일을 실행합니다.

.\MyFunctions.ps1

출력은 다음과 같습니다.

Installing functions
Done

그러나 A1을 호출하려고 하면 해당 이름의 명령어/함수가 없다는 오류가 나타납니다.

The term 'A1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
 of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:3
+ A1 <<<<
    + CategoryInfo          : ObjectNotFound: (A1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PowerShell의 개념을 잘못 이해한 것 같습니다.스크립트 파일에 함수를 정의할 수 없습니까?

실행 정책은 이미 'RemoteSigned'로 설정되어 있습니다.또한 파일 이름 앞에 점을 사용하여 .ps1 파일을 실행하는 방법을 알고 있습니다.\myFile.ps1

PowerShell 명령줄에서 다음을 시도해 보십시오.

. .\MyFunctions.ps1
A1

도트 연산자는 스크립트(일명 "도트 소싱" 또는 "도트 소싱(또는 "도트 소스 표기")

당신이 말하는 것은 닷소싱이라고 불립니다.그리고 그것은 사악하다.하지만 걱정 마세요. 모듈로 원하는 것을 할 수 있는 더 좋고 쉬운 방법이 있습니다(그것보다 훨씬 무섭게 들립니다).모듈을 사용하는 주된 장점은 필요에 따라 셸에서 언로드할 수 있으며 함수의 변수가 셸에 슬금슬금 들어가는 것을 방지할 수 있다는 것입니다(함수 파일을 닷소스하면 셸의 함수에서 변수 중 하나를 호출해 보면 무슨 뜻인지 알 수 있습니다).

먼저 모든 기능이 포함된 .ps1 파일의 이름을 MyFunctions.psm1로 변경합니다(모듈을 방금 만들었습니다).모듈이 올바르게 로딩되려면 파일을 사용하여 몇 가지 작업을 수행해야 합니다.Import-Module이 모듈을 확인하려면 먼저 특정 위치에 있어야 합니다(이 cmdlet을 사용하여 모듈을 셸에 로드합니다).modules 폴더의 기본 경로는 $home\입니다.문서\Windows PowerShell \ 모듈

이 폴더에 MyFunctions라는 이름의 폴더를 만들고 MyFunctions.psm1 파일을 저장합니다(모듈 파일은 PSM1 파일과 동일한 이름의 폴더에 있어야 합니다).

완료되면 PowerShell을 열고 다음 명령을 실행합니다.

Get-Module -listavailable

My Functions라고 하는 이름의 모듈이 표시되어 있는 경우는, 올바르게 동작하고 있어 모듈을 로드할 수 있는 상태가 되어 있습니다(이것은, 올바르게 설정되어 있는 것을 확인하기 위해서만, 이 조작을 1회만 실시하면 됩니다).

모듈을 사용하려면 셸에 다음과 같이 입력합니다(또는 $profile에 이 행을 입력하거나 스크립트의 첫 번째 행으로 지정합니다).

Import-Module MyFunctions

이제 기능을 실행할 수 있습니다.여기서 멋진 점은 일단 10-15개의 기능을 가지고 있으면 커플의 이름을 잊어버릴 수 있다는 것입니다.모듈에 이러한 기능이 있는 경우 다음 명령을 실행하여 모듈의 모든 기능 목록을 가져올 수 있습니다.

Get-Command -module MyFunctions

그것은 꽤 달콤하고, 전면에 설치하는 데 드는 작은 노력만으로도 충분히 가치가 있다.

. "$PSScriptRoot\MyFunctions.ps1" MyA1Func

v3부터 제공되기 전에 PowerShell 스크립트의 파일 시스템 위치를 얻는 방법을 참조하십시오.그것은 매우 흔하다.

추신: 저는 '모든 것이 모듈이다'라는 규칙에 가입하지 않습니다.내 스크립트는 GIT 이외의 다른 개발자에 의해 사용되고 있기 때문에, 나는 내 스크립트가 실행되기 전에 특정 장소에 물건을 넣거나 시스템 환경 변수를 수정하는 것을 좋아하지 않는다.그냥 대본일 뿐이에요.

스크립트 파일에 함수를 정의할 수 있습니다(부하 시 Powershell 프로파일을 통해 함수를 로드하는 경향이 있습니다).

먼저 다음을 실행하여 기능이 로드되었는지 확인해야 합니다.

ls function:\ | where { $_.Name -eq "A1"  }

그리고 목록에 표시되는지 확인하고(1의 목록이어야 함) 어떤 출력을 얻을 수 있는지 알려주십시오.

파일에 호출/expose할 주요 함수가1개밖에 없는 경우는, 다음의 순서로 파일을 개시할 수도 있습니다.

Param($Param1)

그런 다음 다음과 같이 호출할 수 있습니다.

.\MyFunctions.ps1 -Param1 'value1'

따라서 함수를 Import하지 않고도 해당 함수만 쉽게 호출할 수 있습니다.

다음 항목에 기능을 추가할 수 있습니다.

c:\Users\David\Documents\WindowsPowerShell\profile.ps1

기능을 사용할 수 있습니다.

경로에서 스크립트를 생성했다고 가정해 보겠습니다.C:\Temp\TestScript.sp1

여기에 이미지 설명 입력

이러한 스크립트 내의 스크립트 및 함수는 다음 규칙을 따릅니다.scope.

여기에 이미지 설명 입력

또, 를 사용하는 경우call operator (&)powershell 에디터에서 스크립트파일을 실행하기 위해 아래와 같이 현재 powershell 에디터 범위에도 추가되지 않습니다.

Function-Dumb()라는 이름의 메서드를 가진 Dummy-Name.psm1이라는 모듈파일이 있다고 가정합니다.

Import-Module "Dummy-Name.psm1";
Get-Command -Module "Function-Dumb";
#
#
Function-Dumb;

언급URL : https://stackoverflow.com/questions/6016436/in-powershell-how-do-i-define-a-function-in-a-file-and-call-it-from-the-powersh

반응형