我对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
,通过传递参数值。
请注意,当然,您的函数也可以从输入参数和添加验证属性中受益。