我正在尝试编写一个服务器构建脚本,其中包含各种任务的 boolean 参数,例如是否安装IIS。如果用户没有以某种方式指定此参数,我希望脚本提示做出决定,但为了方便和无人值守执行,我希望用户能够通过设置来明确选择安装 IIS 或不安装 IIS在命令行上将值设置为 True 或 False,从而避免出现提示。我的问题是,当我创建 boolean 参数时,如果未在命令行上指定,PowerShell 会自动将其设置为 False,而不是将其保留为空。这是我认为可行的设计:
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 传递给目标,我想知道这是否会影响这些处理 boolean 值。例如:
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}
想法?
最佳答案
实现这一点的方法是使用参数集:
[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}
关于PowerShell boolean 值——如何以不同的方式处理 null 和 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46223726/