如果脚本具有强制参数,则 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
标志 (documentation link) 运行 powershell 并且任何缺少的强制参数将导致错误并且非零退出代码将是 returned.
此 return 代码应由您的 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
将仅定义函数(在本例中为DoSomething
),稍后调用;
由于 none 的脚本参数在技术上被声明为强制性的,因此没有参数的调用将成功(与您的尝试不同,throw
语句总是被启动 - 无论是直接调用还是点源)。
.\Manage-Machine.ps1
,相比之下,将强制存在 $VirtualMachine
参数值并立即调用 DoSomething
,传递参数值。
请注意,当然,您的函数也可以从键入参数和添加验证属性中受益。
我是 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
标志 (documentation link) 运行 powershell 并且任何缺少的强制参数将导致错误并且非零退出代码将是 returned.
此 return 代码应由您的 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
将仅定义函数(在本例中为DoSomething
),稍后调用;
由于 none 的脚本参数在技术上被声明为强制性的,因此没有参数的调用将成功(与您的尝试不同,throw
语句总是被启动 - 无论是直接调用还是点源)。.\Manage-Machine.ps1
,相比之下,将强制存在$VirtualMachine
参数值并立即调用DoSomething
,传递参数值。
请注意,当然,您的函数也可以从键入参数和添加验证属性中受益。