在Powershell中切换参数

问题描述 投票:0回答:2

我一直在寻找,但我似乎找不到让这项工作按照我想要的方式工作的方法。

我是 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

powershell parameters switch-statement
2个回答
8
投票

有道理,这是因为在函数调用(脚本的最后一行)中,您从未给函数提供任何参数。如果您想从外部源将参数传递给 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
  • 来自 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(...)
    块,以便可以使用与调用
    .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
  • 来自 PowerShell:
PS /> .\script.ps1 -Name world -Deploy
Hello world!
Deploy switch is: True

1
投票

更简单:

function Test {
param (
    [switch]$Deploy
)
$Deploy.IsPresent
}

© www.soinside.com 2019 - 2024. All rights reserved.