programing

PowerShell 스크립트에서 특정 기능을 "비공개"로 만들 수 있는 방법이 있습니까?

bestprogram 2023. 10. 19. 22:39

PowerShell 스크립트에서 특정 기능을 "비공개"로 만들 수 있는 방법이 있습니까?

셸이 시작되면 테스트할 때 사용하는 몇 가지 기능이 있는 외부 스크립트를 로드합니다.다음과 같은 경우:

# Include Service Test Tools
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
. $scriptPath\SvcTest.ps1

SvcTest.ps1, 저에게는 두 가지 기능이 있습니다.

function isURI ([string] $address)
{
   ($address -as [System.URI]).AbsoluteURI -ne $null
}

뿐만 아니라:

function Test-Service ([string] $url)
{
   if (-Not (isURI($url)))
   {
      Write-Host "Invalid URL: $url"
      return
   }

   # Blah blah blah, implementation not important
}

isURI기능은 기본적으로 다음을 허용하는 유틸리티 기능일 뿐입니다.Test-Service그리고 아마도 다른 함수들이 URI를 검증합니다.하지만, 내가 내 껍데기를 시작했을 때, 나는 그것을 봅니다.isURI는 전역적으로 로드되는 함수입니다.타이핑도 가능합니다.isURI http://www.google.com명령 줄에서 돌아와요True.

내 질문:만들 방법이 있나요?isURI 비공개로, 내부에서만 기능하도록 합니다.SvcTest.ps1허용하면서 사용할 수 있습니다.Test-Service세계적이 되려구요?기본적으로 PowerShell 스크립트 내에서 속성 캡슐화를 사용하는 방법을 찾고 있습니다.

실제로 .ps1 파일을 호출하는 경우 기본적으로 .ps1 파일 내에서 선언된 모든 함수 및 변수는 스크립트 내에서 비공개 범위가 지정됩니다(이를 "스크립트 범위"라고 함).전 세계적으로 정의된 두 함수를 모두 보고 있으니, 도트 소싱 SvcTest.ps1, 즉 이렇게 호출하는 것으로 추측합니다.

PS> . <path>\SvcTest.ps1

이렇게 부르는 것보다

PS> <path>\SvcTest.ps1


두 가지 옵션이 있습니다.

1.스크립트의 다른 하나의 함수에서만 개인 함수를 사용하는 경우 해당 함수를 사용하는 함수 본문 내에서 개인 함수를 선언하고 점 소싱하여 스크립트를 호출할 수 있습니다.

function Test-Service ([string] $url)
{
    function isURI ([string] $address)
    {
        ($address -as [System.URI]).AbsoluteURI -ne $null
    }

    if (-Not (isURI($url)))
    {
        Write-Host "Invalid URL: $url"
        return
    }

    # Blah blah blah, implementation not important
}

2.스크립트 내의 둘 이상의 다른 함수에 개인 함수가 필요한 경우(또는 필요하지 않은 경우에도 이는 위의 기능에 대한 대안입니다), 전역적으로 정의할 함수에 대해 전역 범위를 명시적으로 선언한 다음 스크립트를 도트 소싱이 아닌 호출합니다.

function isURI ([string] $address)
{
   ($address -as [System.URI]).AbsoluteURI -ne $null
}


function global:Test-Service ([string] $url)
{
   if (-Not (isURI($url)))
   {
      Write-Host "Invalid URL: $url"
      return
   }

   # Blah blah blah, implementation not important
}

어느 경우든 테스트 서비스는 글로벌 범위에 정의되고 isURI는 스크립트 범위로 제한됩니다.


* 여기서 이 문제를 혼동할 수 있는 한 가지는 PowerShell이 경로에서 실행 파일만 찾는다는 것입니다. 단, 그렇지 않으면 현재 작업 디렉토리가 아닙니다..경로에 추가되었습니다(기본적으로 그렇지 않음).따라서 작업 디렉토리에서 스크립트를 호출하여 스크립트 이름 앞에 다음을 지정하는 것이 PowerShell의 일반적인 방법입니다..\. 혼동하지 마세요..작업 디렉토리와 닷 sour싱 연산자를 나타냅니다.스크립트를 호출합니다.

PS> .\SvcTest.ps1

이 점이 출처:

PS> . .\SvcTest.ps1

모듈을 만들어 사용할 수 있는 기능을 요구하는 것처럼 들립니다.

모듈을 사용하면 코드를 캡슐화하고 원하는 별칭 및/또는 기능만 내보낼 수 있습니다.모듈 매니페스트가 엄격하게 필요한 것은 아니며 매니페스트를 사용하지 않는 경우 다음을 사용할 수 있습니다.Export-ModuleMember모듈에서 내보낼 멤버를 지정합니다.

보기.help about_Modules자세한 내용은 토픽에 관한 것입니다.

기능에 전용 스코프를 사용하려면 파워셸에서 이렇게 수행됩니다.

function Private:isURI ([string] $address)
{
   ($address -as [System.URI]).AbsoluteURI -ne $null
}

isURI 함수를 스크립트로 이동한 다음 함수로 실행하는 대신 다른 함수에서 dot sourcing을 시도해보셨습니까?

isuri.ps1:

Param([string] $address)
($address -as [System.URI]).AbsoluteURI -ne $null

svctext.ps1:

function Test-Service ([string] $url)
{
   if (-Not (. .\isURI($url)))
   {
      Write-Host "Invalid URL: $url"
      return
   }

   # Blah blah blah, implementation not important
}

.psm1 모듈을 만들 때도 비슷한 문제가 있었습니다."공개" 함수에 Export-ModuleMember(Bill_Stewart에서 제안하는 대로)를 사용하면 선택한 함수를 노출할 수 있습니다.내보내지 않은 다른 모든 기능은 공개적으로 숨겨지지만 모듈에서 계속 사용할 수 있습니다.

모듈에 Export-Module 문을 포함하지 않으면 모든 구성원이 자동으로 노출됩니다.

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/export-modulemember?view=powershell-7.2 [수출-모듈 구성원][1]

function isURI ([string] $address)
{
   ($address -as [System.URI]).AbsoluteURI -ne $null
}

function Test-Service ([string] $url)
{
   if (-Not (isURI($url)))
   {
      Write-Host "Invalid URL: $url"
      return
   }

   # Blah blah blah, implementation not important
}

# only expose Test-Service publicly
Export-ModuleMember -Function Test-Service

언급URL : https://stackoverflow.com/questions/25123877/is-there-a-way-to-make-certain-functions-private-in-a-powershell-script