如果语句永远不会评估为false

Eth*_* K. 2 powershell if-statement

我正在研究的脚本的另一个业余问题.我在If声明中退出脚本和控制台时遇到问题.

我已经试过exit,exit(),$host.exit[Environment]::Exit(1)我的内Else部分.无论用户输入是什么,if语句都会继续.

我觉得我错过了一些非常简单的东西,但我无法理解.如果用户输入"Y"或"y",我只希望它继续.还有别的什么我只想让它失败并关闭......

我也在$confirm用户输入后调用,确保它正在捕获正确的字母,这是.

以下是脚本失败的部分:

$confirm = Read-Host "Continue deletion? [Y/N]"

if ($confirm -eq "Y" -or "y") {
    for ($i = 0; $i -le 4; $i++) {
        Get-ChildItem -Path $path0, $path1 -Filter "$dval*"| 
        % { Write-Host 'Deleting' $_.FullName $dval; Remove-Item $_.FullName -Recurse }
        $dval++ } 

} else { [Environment]::Exit(1) }
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 7

以下陈述没有按照您的想法行事.

if ($confirm -eq "Y" -or "y")
Run Code Online (Sandbox Code Playgroud)

这里的问题是,这里有两个单独的语句,你可能没想到$confirm -eq "Y""y".后者会将自己的一个评估为真,因为它是一个非空非空字符串.

考虑一下[bool]"y"将要回归的孤独陈述True.

所以你打算写的是$confirm -eq "Y" -or $confirm -eq "y".但是这是多余的,因为-eq默认情况下不区分大小写.所以$confirm -eq "Y"就足够了.

额外的阅读将是关于如何about_Logical_Operators工作.它有一些简单的例子,说明如何进行多重比较.要说左侧独立于右侧进行评估将是不正确的.

PowerShell逻辑运算符仅评估确定语句真值所需的语句.如果包含和运算符的语句中的左操作数为FALSE,则不评估右操作数.如果包含or语句的语句中的左操作数为TRUE,则不评估右操作数.

使用您的代码输入任何字母或值都没有效果,因为-or "y"始终是真的.使用更新的答案输入任何非y值将$confirm -eq "y"返回False


如果有一个理由来评价,你会寻求在多个不同的可能性-contains-in.我会留给你进一步研究那些(保持切线下降)

$confirm -in "y","m","b"
Run Code Online (Sandbox Code Playgroud)

其中Y =是,M =可能,B =百吉饼

  • @ eknack87你的代码输入任何字母或数值都没有效果,因为`-or"y"`总是如此.输入我的任何非y值会使`$ confirm -eq"y"`返回false (2认同)