programing

PowerShell에서 여러 파라미터를 하나의 함수로 전달하려면 어떻게 해야 합니까?

cafebook 2023. 4. 8. 09:13
반응형

PowerShell에서 여러 파라미터를 하나의 함수로 전달하려면 어떻게 해야 합니까?

여러 문자열 매개 변수를 받아들이는 함수가 있는 경우 첫 번째 매개 변수는 할당된 모든 데이터를 가져오고 나머지 매개 변수는 비어 있는 것으로 전달됩니다.

간단한 테스트 스크립트:

Function Test([string]$arg1, [string]$arg2)
{
    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

Test("ABC", "DEF")

생성되는 출력은 다음과 같습니다.

$arg1 value: ABC DEF
$arg2 value: 

올바른 출력은 다음과 같습니다.

$arg1 value: ABC
$arg2 value: DEF

여러 시스템의 v1과 v2는 일관성이 있는 것 같기 때문에 잘못된 작업을 하고 있는 것이 분명합니다.정확히 뭘 지적할 수 있는 사람?

PowerShell(모든 버전)의 함수에 대한 호출 매개 변수는 쉼표로 구분되지 않고 공백으로 구분됩니다.또한 괄호는 전혀 필요하지 않으며 PowerShell 2.0 이후에서는 다음과 같은 경우 해석 오류가 발생합니다. -Version 2을 사용하다이치NET ★★★★★★★★★★★★★★★★」

function foo($a, $b, $c) {
   "a: $a; b: $b; c: $c"
}

ps> foo 1 2 3
a: 1; b: 2; c: 3

정답은 이미 제공되었지만, 이 문제는 세부 사항을 이해하고자 하는 사용자에게 몇 가지 추가 정보를 제공할 수 있을 정도로 널리 퍼져 있는 것으로 보입니다.

설명을 덧붙이고 싶지만, 예를 들어 PowerShell 기능에 대한 빠른 참조 차트에서 이 내용을 삭제했습니다.은 함수가 "f"라고 합니다.f($a, $b, $c):

함수 호출 구문 함정

따라서 공백으로 구분된 위치 매개 변수 또는 순서 독립적인 명명 매개 변수를 사용하여 함수를 호출할 수 있습니다.다른 함정은 쉼표, 괄호 및 공백을 인식할 필요가 있음을 나타냅니다.

자세한 내용은 기사 Down the Rabbit Hole: A Study in PowerShell Pipeline, Functions, Parameters를 참조하십시오.이 문서에는 빠른 참조/월 차트에 대한 링크도 포함되어 있습니다.

여기 몇 가지 좋은 답변이 있지만, 저는 몇 가지 다른 점을 지적하고 싶습니다.함수 파라미터는 PowerShell이 빛을 발하는 장소입니다.예를 들어 다음과 같은 고급 기능에는 이름 있는 파라미터 또는 위치 파라미터 중 하나를 사용할 수 있습니다.

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=1)]
         [int] $Id
    )
}

그런 다음 매개 변수 이름을 지정하여 호출하거나 명시적으로 정의된 위치 매개 변수만 사용할 수 있습니다.따라서 다음 중 하나가 작동합니다.

Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34

, 하다, , 하다.Name파라미터 이름을 명시적으로 사용했기 때문에 두 번째로 제공됩니다.에 따라 하기 때문에, 이렇게 하면 됩니다.Name 옵션을모두 사용할 수 항상 가능하면 두 가지 옵션을 모두 사용할 수 있도록 항상 위치를 정의하려고 합니다.

PowerShell은 파라미터 세트를 정의할 수도 있습니다.메서드 오버로드 대신 이 기능을 사용하여 다음과 같이 편리합니다.

function Get-Something
{
    [CmdletBinding(DefaultParameterSetName='Name')]
    Param
    (
         [Parameter(Mandatory=$true, Position=0, ParameterSetName='Name')]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=0, ParameterSetName='Id')]
         [int] $Id
    )
}

이제 함수는 이름 또는 ID를 갖지만 둘 다 가질 수 없습니다.위치 또는 이름으로 사용할 수 있습니다.다른 타입이기 때문에 PowerShell에서 해결할 수 있습니다.이 모든 것이 유효합니다.

Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23

다양한 파라미터 세트에 추가 파라미터를 할당할 수도 있습니다.(이것은 매우 기본적인 예입니다.)함수 내부에서 $PsCmdlet과 함께 사용된 파라미터 세트를 확인할 수 있습니다.Parameter SetName 속성.예를 들어 다음과 같습니다.

if($PsCmdlet.ParameterSetName -eq "Name")
{
    Write-Host "Doing something with name here"
}

그런 다음 PowerShell에서도 파라미터 검증이 이루어집니다.이것은 제가 좋아하는 PowerShell 기능 중 하나이며, 기능 내 코드를 매우 깔끔하게 만들어 줍니다.사용할 수 있는 검증은 여러 가지가 있습니다.예를 들어 다음과 같습니다.

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [ValidatePattern('^Some.*')]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=1)]
         [ValidateRange(10,100)]
         [int] $Id
    )
}

첫 번째 예에서는 ValidatePattern은 지정된 파라미터가 예상한 것과 일치하도록 하는 정규 표현을 받아들입니다.그렇지 않으면 무엇이 문제인지 정확히 알려주는 직관적인 예외가 발생합니다.따라서 이 예에서는 'Something'은 정상적으로 동작하지만 'Summer'는 검증을 통과하지 못합니다.

ValidateRange는 파라미터 값이 정수로 예상되는 범위 내에 있는지 확인합니다.10이나 99는 가능하지만 101은 예외입니다.

또 다른 유용한 것은 ValidateSet입니다.이것에 의해, 허용 가능한 값의 배열을 명시적으로 정의할 수 있습니다.다른 항목을 입력하면 예외가 느려집니다.다른 것도 있지만 가장 유용한 것은 Validate Script일 입니다.여기에는 $true로 평가해야 하는 스크립트 블록이 필요하므로 sky가 한계입니다.예를 들어 다음과 같습니다.

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
         [ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
         [string] $Path
    )
}

이 예에서는 $Path가 존재할 뿐만 아니라 (디렉토리가 아닌) 파일이며 확장자가 .csv인 것이 확실합니다.($_는 스크립트 블록 내에 있는 경우 파라미터를 나타냅니다.또한 이 수준이 필요한 경우 훨씬 더 큰 여러 줄의 스크립트 블록을 전달하거나 여기서와 같이 여러 스크립트 블록을 사용할 수도 있습니다.매우 유용하고 깔끔한 기능과 직관적인 예외를 제공합니다.

괄호 없이 콤마를 구분자로 사용하지 않고 PowerShell 함수를 호출합니다.사용 방법:

test "ABC" "DEF"

PowerShell에서 콤마(,)는 어레이 연산자입니다.

$a = "one", "two", "three"

굳어지다$a3월 1일, 3번으로 하다

Function Test([string]$arg1, [string]$arg2)
{
    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

Test "ABC" "DEF"

만약 당신이 C# / Java / C++ / Ruby / Python / Pick-A-Language-From-This-Century 개발자이고, 당신의 함수를 쉼표로 호출하고 싶다면, 당신은 항상 그래왔기 때문에 다음과 같은 것이 필요합니다.

$myModule = New-Module -ascustomobject { 
    function test($arg1, $arg2) { 
        echo "arg1 = $arg1, and arg2 = $arg2"
    }
}

지금 전화:

$myModule.test("ABC", "DEF")

그러면 알게 될 것이다

arg1 = ABC, and arg2 = DEF

자주 보는 질문이기 때문에 PowerShell 함수는 승인된 동사(함수명은 Verb-Noun)를 사용해야 합니다.이름의 동사 부분은 cmdlet이 수행하는 작업을 식별합니다.이름의 명사 부분은 작업이 수행되는 엔티티를 식별합니다.규칙은 고급 PowerShell 사용자의 cmdlet 사용을 간소화합니다.

또한 매개 변수가 필수인지 여부와 매개 변수의 위치 을 지정할 수 있습니다.

function Test-Script
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true, Position=0)]
        [string]$arg1,

        [Parameter(Mandatory=$true, Position=1)]
        [string]$arg2
    )

    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

매개변수를 함수에 전달하려면 다음 위치 중 하나를 사용합니다.

Test-Script "Hello" "World"

또는 다음 파라미터 이름을 지정합니다.

Test-Script -arg1 "Hello" -arg2 "World"

C# 내의 함수를 호출할 때처럼 괄호를 사용하지 않습니다.


여러 파라미터를 사용할 때는 파라미터 이름을 항상 전달할 것을 권장합니다.이는 가독성이 높기 때문입니다.

함수에 전달할 인수의 수를 모르는(또는 신경 쓰는) 경우 다음과 같은 매우 간단한 방법을 사용할 수도 있습니다.

코드:

function FunctionName()
{
    Write-Host $args
}

그러면 모든 주장이 출력됩니다.예를 들어 다음과 같습니다.

FunctionName a b c 1 2 3

산출량

a b c 1 2 3

이 기능은 특히 외부 명령어를 사용하여 다양한 파라미터(옵션)를 가질 수 있지만 구문 오류 등에 대한 피드백을 제공하는 함수를 작성할 때 유용합니다.

다음은 또 다른 실제 예(잘린 이름을 기억해야 하는 tracert 명령어에 대한 함수를 만드는 것)입니다.

코드:

Function traceroute
{
    Start-Process -FilePath "$env:systemroot\system32\tracert.exe" -ArgumentList $args -NoNewWindow
}

시도할 경우:

PS > Test("ABC", "GHI") ("DEF")

다음과 같은 것이 있습니다.

$arg1 value: ABC GHI
$arg2 value: DEF

괄호 안에 파라미터가 구분되어 있는 것을 볼 수 있습니다.


시도할 경우:

PS > $var = "C"
PS > Test ("AB" + $var) "DEF"

다음과 같은 것이 있습니다.

$arg1 value: ABC
$arg2 value: DEF

이제 괄호의 즉각적인 유용성을 찾을 수 있습니다. 공백은 다음 파라미터의 구분자가 되지 않습니다. 대신 평가 함수를 사용할 수 있습니다.

여기에서는 설명하지 않지만 인수를 분할하는 것은 유용한 대안이며 (사용하는 것과 반대로) 명령어에 대한 인수를 동적으로 작성할 때 특히 유용합니다.Invoke-Expression는 위치 로, 의 경우 수 위치 인수의 경우 배열로, 명명된 인수의 경우 해시 테이블을 사용하여 스플래트할 수 있습니다.을 하다

참고: 외부 명령어 인수와 함께 위치 스플랫을 비교적 쉽게 사용할 수 있지만, 외부 명령어에서는 이름 있는 스플랫이 유용하지 않습니다.동작합니다만, 프로그램은, 다음의 인자를 받아 들일 필요가 있습니다.-Key:Value해시 테이블키/해시 테이블키/값 쌍에 관련지어집니다.로서 「」를 들 수 있습니다.chocoWindows chocolate Chocolatey 。

어레이를 사용한 스플래트(위치 인수)

Positional 인수를 사용한 테스트 연결

Test-Connection www.google.com localhost

어레이 스플래팅 포함

$argumentArray = 'www.google.com', 'localhost'
Test-Connection @argumentArray

를 스플래트할 는 스플래트 변수는 스플래트 변수입니다.@$해시 테이블을 사용하여 스플래트할 때도 마찬가지입니다.

해시 테이블을 사용한 스플래트(이름 있는 인수)

명명된 인수를 사용한 테스트 연결

Test-Connection -ComputerName www.google.com -Source localhost

해시 테이블 스플래팅 사용

$argumentHash = @{
  ComputerName = 'www.google.com'
  Source = 'localhost'
}
Test-Connection @argumentHash

스플래트 위치 인수와 이름 있는 인수를 동시에 사용

Positional 인수와 Named 인수를 모두 사용한 테스트 연결

Test-Connection www.google.com localhost -Count 1

어레이와 해시 테이블의 스플래팅

$argumentHash = @{
  Count = 1
}
$argumentArray = 'www.google.com', 'localhost'
Test-Connection @argumentHash @argumentArray
Function Test([string]$arg1, [string]$arg2)
{
    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

Test("ABC") ("DEF")

이 함수로 무엇을 하고 있는지 모르겠지만, 'param' 키워드를 사용해 보세요.이것은 매개변수를 함수에 전달하기 위해 훨씬 더 강력하며 사용자 친화적입니다.아래 링크에서는 Microsoft의 지나치게 복잡한 기사에 대한 링크를 제공합니다.그것은 그 기사가 말하는 것처럼 그렇게 복잡하지 않다.

파라미터 사용방법

또, 이 사이트의 질문의 예를 다음에 나타냅니다.

이것을 확인해 보세요.

앞서 다음과 같이 말씀드렸습니다.

한다는 것입니다.$arg틀렸습니다.항상 다음과 같이 복수여야 합니다.$args.

문제는 그게 아니다.ㅇㅇㅇㅇ.$arg을 사용하다문제는 쉼표와 괄호 사용이었다.

다음 코드를 실행해도 동작하고 출력은 다음과 같습니다.

코드:

Function Test([string]$var1, [string]$var2)
{
    Write-Host "`$var1 value: $var1"
    Write-Host "`$var2 value: $var2"
}

'ABC' 'DEF' 테스트

출력:

$var1 value: ABC
$var2 value: DEF
Function Test {
    Param([string]$arg1, [string]$arg2)

    Write-Host $arg1
    Write-Host $arg2
}

은 것이다params★★★★★★ 。

개요_Functions_Advanced_Parameters.

그리고 그것은 정말로 효과가 있다.

다음과 같은 함수에서 파라미터를 전달할 수도 있습니다.

function FunctionName()
{
    Param ([string]$ParamName);
    # Operations
}

언급URL : https://stackoverflow.com/questions/4988226/how-do-i-pass-multiple-parameters-into-a-function-in-powershell

반응형