Powershell 转换;是”;或;否";布尔值

Powershell 转换;是”;或;否";布尔值,powershell,boolean,boolean-expression,Powershell,Boolean,Boolean Expression,我想解析.CSV文件中包含的用户值。我不希望我的用户输入“是”或“否”,而是输入“真”或“假”。在每种情况下,我都希望转换为等效的布尔值:$true或$false。理想情况下,我想要一个默认值,因此如果出现“Yes”或“No”错误,我将返回默认值:$true或$false 因此,我想知道是否有一个整洁的方法来做这件事,除了 if(){} else (){} 啊,powershell函数的魔力,以及调用表达式 function Yes { $true } function No { $false

我想解析.CSV文件中包含的用户值。我不希望我的用户输入“是”或“否”,而是输入“真”或“假”。在每种情况下,我都希望转换为等效的布尔值:
$true
$false
。理想情况下,我想要一个默认值,因此如果出现“Yes”或“No”错误,我将返回默认值:
$true
$false

因此,我想知道是否有一个整洁的方法来做这件事,除了

if(){} else (){}

啊,powershell函数的魔力,以及调用表达式

function Yes { $true }
function No { $false }

$magicBool = & $answer 

注意:这不区分大小写,但不会处理拼写错误。一种方法是
开关
语句:

$bool = switch ($string) {
  'yes' { $true }
  'no'  { $false }
}
如果要处理既不是“是”也不是“否”的值,请添加一个子句
default

另一种选择可能是简单的比较:

$string -eq 'yes'            # matches just "yes"


如果字符串匹配,这些表达式的计算结果将为
$true
,否则将为
$false

,如果没有现有代码的完整片段,类似这样的表达式可能是一种替代路径,而不是一个if语句字符串

注意:这不会处理简单的“Y”或“N”输入,但不区分大小写。因此,您应该能够看到“是”或“是”也在工作

$myVar = Read-Host 'What is your answer?'
switch ($myVar)
{
  Yes {$myVarConverted = $true; break}
  True {$myVarConverted = $true; break}
  No {$myVarConverted = $false; break}
  False {$myVarConverted = $false; break}
  default {"Invalid Input"; break}
}
Write-Host $myVarConverted

请参阅我对您关于“拼写错误”警告的问题的补充意见。如果没有特定的限制或要求,很难进行编码。

如果唯一可能的值是“是”和“否”,那么最简单的方法可能是

$result = $value -eq 'Yes'
对于拼写错误的值和默认值
$false
,上述操作也可以

对于拼写错误的值和默认值
$true
,这将起作用

$result = $value -ne 'No'

以下是我的做法是否回答:

function ask-user
{
   [CmdletBinding()]
   Param(
      [Parameter(Mandatory=$true)]
      [string] $question
   )
   Process
   {  $answer = read-Host $question
      if ("yes" -match $answer) {$true}
      elseif ("no" -match $answer) {$false}
      else {ask-user $question}
   }
}
您可以很容易地用“是”和“否”替换“是”和“否”。
这一个不区分大小写,将匹配有效的缩写。(Y或N)。
在拼写错误的情况下,它会再次询问。是的,我本可以不用递归就完成它,但我很懒。

所有这些都是有效的方法。如果您正在寻找一个单行程序,这将验证它是否是可接受的值,如果在“真”值集中,则将其设置为布尔真。这还将为您提供默认的$false值

$result = @("true","false","yes","no") -contains $value -and @("true","yes") -contains $value
对于默认的$true值,您需要这样的值

$result = $true

if (@("true","false","yes","no") -contains $value) {
    $result = @("true","yes") -contains $value
}

以上这些都是很好的解决方案,但我要说的是,整个主题恰恰证明了Powershell的巨大缺陷

  [System.Convert]::ToBoolean("False") -eq $true ? 
  [System.Convert]::ToBoolean("0") -eq $true ?  
真的吗?
让我休息一下。

我对你在这里的“拼写错误”警告有问题。那么,你是说如果用户输入“日元”,你希望它是$true?条件是什么?第一个字母必须匹配?不要忘记默认的
子句
-ieq
-imatch
将使它们不区分大小写。@Eris PowerSh默认情况下,ell比较操作不区分大小写。您需要使用
-ceq
/
-cmatch
使它们区分大小写。@Ansgar非常感谢。我讨厌键入$string匹配,因此我将测试它-我想我需要学习regex-tho;-)。如果使用“是”和“是”,那就好了“
-如'y*'
将匹配任何以
y
开头的字符串。我认为这可能太宽泛了,所以我选择不列出这个变量。$result=$ForcePasswordChange-ne“No”似乎是最优雅的解决方案,因为我希望默认值为$true,除非客户端显式请求。每个人都有很多好的建议。ThanksIt是一个非常有趣的游戏,直到有人键入
rd*
。OP说他们正在解析一个文件,我假设他们可以控制输入。我知道你在做什么,你强制回答“是”或“否”,其他人再问一次。我可能会将其大写,以便也能处理它。很好的建议。它不区分大小写,因为-match就是这样工作的。我用大写字母Y或N试过了。
$result = $true

if (@("true","false","yes","no") -contains $value) {
    $result = @("true","yes") -contains $value
}
  [System.Convert]::ToBoolean("False") -eq $true ? 
  [System.Convert]::ToBoolean("0") -eq $true ?