PowerShell布尔值 - 如何处理null与false不同?

时间:2017-09-14 16:02:37

标签: powershell boolean

我试图编写一个服务器构建脚本,其中包含用于各种任务的布尔参数,例如:是否安装IIS。如果用户没有以这种方式指定此参数,我希望脚本提示做出决定,但为了方便和无人参与执行,我希望用户能够通过设置明确选择安装IIS或不安装IIS命令行上的值为True或False,因此避免被提示。我的问题是,当我创建一个布尔参数时,如果没有在命令行中指定,PowerShell会自动将其设置为False,而不是将其保留为null。这是我认为会有效的设计:

param(
    [bool]$IIS
)

if ($IIS -eq $null) {
    $InstallIIS = Read-Host "Do you want to install IIS? (Y/N)"
    if ($InstallIIS -eq "Y") {$IIS = $true}
}

if ($IIS) {Do stuff here}

对于如何实现我想要的结果的任何建议都将非常感激。然后,如果这改变了什么,我真正想要做的是利用PSRemoting在用户的系统主机上接受这些构建决策参数,然后将它们作为ArgumentList传递给目标,并且我'我想知道这是否会影响这些布尔人的处理方式。例如:

param (
    [string[]]$Computers
    [bool]$IIS
)

$Computers | Foreach-Object {
    Invoke-Command -ComputerName $_ -ArgumentList $IIS -ScriptBlock {
        param(
            [bool]$IIS
        )

        if ($IIS -eq $null) {
            $InstallIIS = Read-Host "Do you want to install IIS? (Y/N)"
            if ($InstallIIS -eq "Y") {$IIS = $true}
        }
        if ($IIS) {Do stuff here}

想法?

4 个答案:

答案 0 :(得分:2)

实现此目的的方法是使用参数集:

[CmdletBinding()]
param (
    [Parameter()]
    [string[]]$Computers ,

    [Parameter(ParameterSetName = 'DoSomethingWithIIS', Mandatory = $true)]
    [bool]$IIS
)

$Computers | Foreach-Object {
    Invoke-Command -ArgumentList $IIS -ScriptBlock {
        param(
            [bool]$IIS
        )

        if ($PSCmdlet.ParameterSetName -ne 'DoSomethingWithIIS') {
            $InstallIIS = Read-Host "Do you want to install IIS? (Y/N)"
            if ($InstallIIS -eq "Y") {$IIS = $true}
        }
        if ($IIS) {Do stuff here}

答案 1 :(得分:2)

当然,即使我在发布此处之前搜索了相当多的内容,包括发现[AllowNull()]参数并发现它在我的用例中没有帮助,我最终在第一个Google中找到答案发布后搜索。这是有用的:

[nullable[bool]]$IIS

我对这种语法的唯一抱怨是,对脚本运行Get-Help现在返回显示IIS参数:

-IIS <Nullable`1>

而不是:

-IIS <Boolean>

但除非有更优雅的方式来实现我的需要,否则我认为我可以通过为该参数添加有用的描述以及示例来实现。

答案 2 :(得分:0)

即使布尔运算符处理$null$False''""0相同,您也可以进行相等比较以查看哪个是哪个。

If ($Value -eq $Null) {}
ElseIf ($Value -eq $False) {}
..etc..

在您的情况下,您想使用[Switch]$IIS。默认情况下为$False,如果使用la $True命令输入,则为Command -IIS,然后您可以在代码中处理它,如:

If ($IIS) {}

如果使用$True

在命令行输入,则只会-IIS

答案 3 :(得分:0)

而不是使用相同的测试,试图强制值使测试工作:

if ($IIS -eq $Null)

使用-is直接检查类型:

PS C:\> $iis = $null
PS C:\> $iis -is [bool]
False