如果脚本具有强制参数,Powershell将调用一个函数

我对PowerShell相当陌生,但对于在Windows机器上自动执行大量任务表示欢迎。 我喜欢你可以从其他脚本调用函数,但是我写的脚本都使用用户可以提供的参数(所以同事可以使用它们更容易)。

特别有一个参数在我的脚本中通常是强制的。 我面临的问题是从具有强制参数的脚本调用函数。

这是一个简单的例子:

Param( [Parameter()] [ValidateNotNullOrEmpty()] [string]$VirtualMachine=$(throw "Machine name missing!"), [int]$Attempts = 150 ) Function DoSomething($VirtualMachine, $Attempts){ write("$VirtualMachine and $Attempts") } 

运行这个脚本你会提供-VirtualMachine "VMnameHere" -Attempts 123 。 运行这将产生VMnameHere and 123 。 完善! 但是..如果我尝试从另一个脚本中调用这个函数..

示例:

 . ".\Manage-Machine.ps1" DoSomething -VirtualMachine "nwb-thisisamachine" -Attempts 500 

这产生了一个错误:

 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! 

这显然是因为这个领域是强制性的。 我在这种情况下如何调用函数做错了吗? 是否有另一种方法来调用该函数,如果它所属的脚本具有强制性参数,因为如果我删除参数的validation,这一切工作。

会喜欢一些input,

谢谢!

我会使用[parameter(Mandatory = $true)]和删除=$(throw "Machine name missing!")

然后,您可以使用-NonInteractive标志( 文档链接 )运行powershell,并且任何缺少的必需参数都将导致错误,并返回非零的退出代码。

这个返回码应该由你的CI进程拾取,它本身将处理错误。

我不确定这样做是个好主意,但听起来像下面这样:

 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 . .\Manage-Machine.ps1将仅仅定义函数 (在这种情况下是DoSomething ),以便以后调用;
    因为没有任何脚本参数在技术上被声明为强制的,所以不带参数的调用将会成功(不像在你的尝试中, throw语句总是被踢入 – 不管是直接调用的还是点源的)。

  • .\Manage-Machine.ps1相比之下, .\Manage-Machine.ps1将强制存在一个$VirtualMachine参数值,并立即调用DoSomething ,通过传递参数值。

请注意,当然,您的函数也可以从输入参数和添加验证属性中受益。