2017-11-24 20 views
1

저는 PowerShell을 처음 사용했지만 Windows 시스템에서 많은 양의 작업을 자동화하는 것을 좋아했습니다. 나는 당신이 다른 스크립트의 함수를 호출 할 수 있다는 것을 좋아하지만, 필자가 작성한 스크립트는 사용자가 제공 할 수있는 모든 매개 변수를 사용한다. (그래서 동료가 쉽게 사용할 수있다.)Powershell이 ​​스크립트에 필수 매개 변수가있는 경우 함수를 호출합니다.

스크립트에는 일반적으로 필수적인 매개 변수가 특히 있습니다. 내가 직면하고있는 문제는 스크립트에서 필수 매개 변수를 사용하여 함수를 호출하는 것입니다. 당신이 -VirtualMachine "VMnameHere" -Attempts 123를 제공 할 스크립트로이 실행

Param(

[Parameter()] 
[ValidateNotNullOrEmpty()] 
[string]$VirtualMachine=$(throw "Machine name missing!"), 

[int]$Attempts = 150 

) 

Function DoSomething($VirtualMachine, $Attempts){ 

    write("$VirtualMachine and $Attempts") 

} 

:

다음은 간단한 예입니다. 이것을 실행하면 VMnameHere and 123가 생성됩니다. 완전한! 여기

예 .. 다른 스크립트에서 함수로이 호출하려고하면 그러나 .. : 필드가 있기 때문에

Machine name missing! 
At C:\Users\something\Desktop\Dump\play\Manage-Machine.ps1:33 char:28 
+ [string]$VirtualMachine=$(throw "Machine name missing!"), 
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : OperationStopped: (Machine name missing!:String) [], RuntimeException 
    + FullyQualifiedErrorId : Machine name missing! 

분명히 :

. ".\Manage-Machine.ps1" 

DoSomething -VirtualMachine "nwb-thisisamachine" -Attempts 500 

오류가 발생 필수. 이 경우에 함수를 호출하는 방식이 잘못 되었습니까? 매개 변수에 대한 유효성 검사를 제거하면 모든 매개 변수가 작동하기 때문에 함수가 속한 스크립트에 필수 매개 변수가있는 경우 함수를 호출하는 다른 방법이 있습니까?

일부 입력을 환영합니다.

감사합니다.

+1

ps1 파일에 함수를 호출하는 행이 있습니까? 귀하의 견본이 산출물을 생성해서는 안되기 때문입니다. 그럴 경우 ps1을 호출하고 인수를 제공하십시오. – Matt

+0

'[parameter (Mandatory = $ true)]'를 사용하고'= $ (Machine name missing!)을 던져 버리십시오. ' –

+0

@Matt 아닙니다 , 순간에, 함수를 호출하면 (필수 매개 변수없이 설명 된 것처럼) 잘 실행됩니다. 스크립트를 실행해도 문제가 없지만 하나의 스크립트에서 여러 함수를 사용한 다음 전체 스크립트를 실행하는 대신 다른 스크립트에서 각 함수를 호출 할 때마다 여러 함수를 호출하는 것이 좋습니다. 결국 어떤 함수를 호출하면 함수를 한 번에 사용할 수 없게됩니다. –

답변

2

[parameter(Mandatory = $true)]을 사용하고 =$(throw "Machine name missing!")을 제거합니다.

-NonInteractive 플래그 (documentation link)를 사용하여 powershell을 실행할 수 있으며 누락 된 필수 매개 변수가 있으면 오류가 발생하고 0이 아닌 종료 코드가 반환됩니다.

이 반환 코드는 CI 프로세스에서 선택해야하며 자체에서 오류를 처리합니다.

+0

당신이 제안하는 것은 OP의 문제와 관련이 없습니다. 당신의 제안은 오직 한가지 만 바꿀 것입니다 : _interactive_ 호출 시나리오에서, 예외를 던지기보다는 강제적 인 매개 변수 값이 없을 때'[Parameter (Mandatory)]'는 _prompt_에 _prompt_ 할 것입니다 ('Machine name missing! ")). – mklement0

0

는 나는이 작업을 수행하는 등 좋은 생각 모르겠지만, 다음 작동 것 같은데 :

Param(

    [ValidateNotNullOrEmpty()] 
    # Do NOT use = $(Throw ...) or [Parameter(Mandatory)]. 
    [string]$VirtualMachine, 

    [int]$Attempts = 150 

) 

# Determine if the script is being "dot-sourced". 
# Note: The `$MyInvocation.Line -eq ''` part detects being run from the 
#  ISE or Visual Studio Code, which implicitly perform sourcing too. 
$isDotSourced = $MyInvocation.InvocationName -eq '.' -or $MyInvocation.Line -eq '' 

# NOT sourced? Enforce mandatory parameters. 
if (-not $isDotSourced) { 
    if (-not $VirtualMachine) { Throw "Machine name missing!" } 
} 

Function DoSomething($VirtualMachine, $Attempts) { 
    "$VirtualMachine and $Attempts" 
} 


# NOT sourced? Call the default function or 
# do whatever you want the script to do when invoked as a whole. 
if (-not $isDotSourced) { 
    DoSomething $VirtualMachine $Attempts 
} 
  • . .\Manage-Machine.ps1는 단순히 는 함수를 정의한다이의 (DoSomething 경우), 나중에 호출;
    스크립트 매개 변수 중 기술적으로 선언 된 매개 변수가 없으므로 매개 변수없이 호출하면 성공합니다 (시도가 달리 throw 진술서가 직접 호출되거나 점으로 소싱되는 경우와 달리). 반대로 $VirtualMachine 매개 변수 값의 존재를 강제하고 DoSomething을 즉시 호출하여 매개 변수 값을 전달합니다.

물론 매개 변수를 입력하고 유효성 검사 속성을 추가하면 기능에 도움이 될 수 있습니다.