繁体   English   中英

如果脚本具有必需参数,PowerShell会调用函数

[英]Powershell calling a function if script has mandatory parameters

我对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!

这显然是因为该字段是必填字段。 在这种情况下,我在调用函数时是否做错了什么? 如果该函数所属的脚本具有强制性参数,是否有另一种方法来调用该函数,因为如果删除该参数的验证,则所有方法都可以工作。

希望有一些投入,

谢谢!

我将使用[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将强制存在$VirtualMachine参数值,并立即调用DoSomething ,将参数值传递通过。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM