Powershell 中的开关参数
Switch Parameter in Powershell
我一直在寻找,但我似乎无法找到使它按照我想要的方式工作的方法。
我是 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
运行,这不会return任何错误,但也不输出write-host的结果。它基本上什么都不做。我做错了什么,我怎样才能得到正确的输出?
谢谢。
M
编辑:添加我正在经历的截图,因为一些人说它应该可以工作或可以删除 .isPresent
有道理,这是因为在您的函数调用中(脚本的最后一行)您从未给函数任何参数。如果你想从外部源向你的 ps1 脚本传递一个参数,你应该在你的脚本顶部添加一个 param(...)
块。我正在按照您已有的代码进行操作,但在这种情况下,我认为根本不需要函数。
代码可以简化为:
param (
[switch]$Deploy
)
if ($Deploy) {
Write-Host "True"
}
else {
Write-Host "False"
}
但是如果你想使用一个函数:
param (
[switch]$Deploy
)
function Start-Script {
param (
[switch]$Deploy
)
if ($Deploy) {
Write-Host "True"
}
else {
Write-Host "False"
}
}
Start-Script @PSBoundParameters
- 来自 PowerShell:
PS /> .\script.ps1
False
PS /> .\script.ps1 -Deploy
True
- 来自CMD:
D:\> powershell -File script.ps1
False
D:\> powershell -File script.ps1 -Deploy
True
编辑
- 一些上下文,
[switch]$Deploy
仅存在于您的函数范围内,这就是我们在脚本顶部添加 param(...)
块的原因。
- Splatting
$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 his comment.
# If the Argument $Name is called:
if($PSBoundParameters.ContainsKey('Name'))
{
# Call the function
SayHello @PSBoundParameters
}
Start-Script @PSBoundParameters
- 来自 PowerShell:
PS /> .\script.ps1 -Name Santiago -Deploy
Hello Santiago!
Deploy switch is: True
更简单:
function Test {
param (
[switch]$Deploy
)
$Deploy.IsPresent
}
我一直在寻找,但我似乎无法找到使它按照我想要的方式工作的方法。
我是 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
运行,这不会return任何错误,但也不输出write-host的结果。它基本上什么都不做。我做错了什么,我怎样才能得到正确的输出?
谢谢。 M
编辑:添加我正在经历的截图,因为一些人说它应该可以工作或可以删除 .isPresent
有道理,这是因为在您的函数调用中(脚本的最后一行)您从未给函数任何参数。如果你想从外部源向你的 ps1 脚本传递一个参数,你应该在你的脚本顶部添加一个 param(...)
块。我正在按照您已有的代码进行操作,但在这种情况下,我认为根本不需要函数。
代码可以简化为:
param (
[switch]$Deploy
)
if ($Deploy) {
Write-Host "True"
}
else {
Write-Host "False"
}
但是如果你想使用一个函数:
param (
[switch]$Deploy
)
function Start-Script {
param (
[switch]$Deploy
)
if ($Deploy) {
Write-Host "True"
}
else {
Write-Host "False"
}
}
Start-Script @PSBoundParameters
- 来自 PowerShell:
PS /> .\script.ps1
False
PS /> .\script.ps1 -Deploy
True
- 来自CMD:
D:\> powershell -File script.ps1
False
D:\> powershell -File script.ps1 -Deploy
True
编辑
- 一些上下文,
[switch]$Deploy
仅存在于您的函数范围内,这就是我们在脚本顶部添加param(...)
块的原因。 - Splatting
$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 his comment.
# If the Argument $Name is called:
if($PSBoundParameters.ContainsKey('Name'))
{
# Call the function
SayHello @PSBoundParameters
}
Start-Script @PSBoundParameters
- 来自 PowerShell:
PS /> .\script.ps1 -Name Santiago -Deploy
Hello Santiago!
Deploy switch is: True
更简单:
function Test {
param (
[switch]$Deploy
)
$Deploy.IsPresent
}