我试图编写一个服务器构建脚本,其中包含用于各种任务的布尔参数,例如:是否安装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}
想法?
答案 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