我一直在寻找,但我似乎找不到让这项工作按照我想要的方式工作的方法。
我是 PS 参数的新手,我认为一些东西应该相当简单...我希望能够运行脚本并检测开关是否存在。如:
myscript.ps1 -Deploy
-或-
myscript.ps1
我一直在玩的代码:
function start-script {
param (
[parameter()]
[switch]$Deploy
)
if ($Deploy.IsPresent) {
Write-Host "True"
}
else {
Write-Host "False"
}
}
start-script
运行,不会返回任何错误,但也不会输出写主机的结果。它基本上什么也不做。我做错了什么,如何获得正确的输出?
谢谢。 中号
编辑:添加我正在经历的屏幕截图,因为一些人说它应该起作用或可以删除
.isPresent
有道理,这是因为在函数调用(脚本的最后一行)中,您从未给函数提供任何参数。如果您想从外部源将参数传递给 ps1 脚本,您应该在脚本顶部添加一个
param(...)
块。我正在使用您已有的代码,但在这种情况下,我认为根本不需要函数。
代码可以简化为:
param (
[switch] $Deploy
)
if ($Deploy) {
Write-Host "True"
return
}
Write-Host "False"
但是如果你想使用一个函数:
param (
[switch] $Deploy
)
function Start-Script {
param (
[switch] $Deploy
)
if ($Deploy) {
Write-Host "True"
return
}
Write-Host "False"
}
Start-Script @PSBoundParameters
PS /> .\script.ps1
False
PS /> .\script.ps1 -Deploy
True
D:\> powershell -File script.ps1
False
D:\> powershell -File script.ps1 -Deploy
True
为答案添加更多上下文:
[switch] $Deploy
仅存在于您的函数范围内,这就是为什么我们也在脚本顶部添加 param(...)
块,以便可以使用与调用 .ps1
相同的参数来调用该函数
脚本。
$PSBoundParameters
进行泼溅可以使用多种功能。
示例:
param (
[switch] $Deploy,
[string] $Name
)
function Start-Script {
param (
[switch] $Deploy
)
"Deploy switch is: {0}" -f $Deploy.IsPresent
}
function SayHello {
param(
[string] $Name
)
"Hello $Name!"
}
# This is what mclayton was referring to in their comment.
# If the Argument $Name is called:
if ($PSBoundParameters.ContainsKey('Name')) {
# Call the function
SayHello @PSBoundParameters
}
Start-Script @PSBoundParameters
PS /> .\script.ps1 -Name world -Deploy
Hello world!
Deploy switch is: True