PowerShell While循环多个条件不起作用

时间:2019-07-17 09:30:49

标签: powershell

想在while循环中检查多个条件,但它们不起作用。

#Debug
if ($DatumArray -notcontains $DatumAktuellerFeiertag) {echo "true"} else {echo "false"}
if ($TagAktuellerFeiertag -ne "Samstag") {echo "true"} else {echo "false"}
if ($TagAktuellerFeiertag -ne "Sonntag") {echo "true"} else {echo "false"}

上面的代码给出以下结果:

true
false
true

请注意,结果之一是“ false”。

while (($DatumArray -notcontains $DatumAktuellerFeiertag) -and ($TagAktuellerFeiertag -ne "Samstag") -and ($TagAktuellerFeiertag -ne "Sonntag")) {
    # some code...
}

即使结果之一为“ false”,也不会执行循环。

存档目标的可能方法是什么?为什么此while循环不起作用?

编辑:

此工作与预期不符,因为您不知道我的状况。因此,我将尝试解释:

有一个公共假期$DatumArray组成的数组(像这样... 01.01.2019,19.04.2019,21.04.2019 ...)

$DatumAktuellerFeiertag是实际的公共假期日期。

$TagAktuellerFeiertag是实际的公共假日工作日。

现在我正试图找出下一个工作日(但是如果下一个工作日也是公共假期,则必须考虑这一点。)

所以我的情况将是这样:在有公共假日或星期六或星期日的情况下,将$DatumAktuellerFeiertag增加1。

while (($DatumArray -notcontains $DatumAktuellerFeiertag) -and (($TagAktuellerFeiertag -ne "Samstag") -or ($TagAktuellerFeiertag -ne "Sonntag"))) {
    $DatumAktuellerFeiertag = (Get-Date $DatumAktuellerFeiertag).AddDays(1).ToString("dd/MM/yyy")
    $TagAktuellerFeiertag = (Get-Date $DatumAktuellerFeiertag -Format "dddd")

    echo $DatumAktuellerFeiertag
}

编辑:

尝试过您的版本,可以在“正常”的日子里正常工作,但是在公共假期给了我无限循环。

$ListPublicHoliday = Import-Csv 'datum.csv'

$DateArray = $ListPublicHoliday.Datum
$DateArray = $DateArray | ForEach-Object { (Get-Date $_).Date }

$ActuallyDay = Get-Date 19.04.2019

while (($DateArray -contains $ActuallyDay.Date) -or ('Samstag', 'Sonntag' -contains $ActuallyDay.DayOfWeek)) {
    $ActuallyDay.AddDays(1)
}

我的CSV:

#TYPE Selected.System.String
"Datum","Feiertag","Wochentag","Value"
"01.01.2019","Neujahrstag","Dienstag","01.01.2019 18:33:01"
"19.04.2019","Karfreitag","Freitag","19.04.2019 18:33:01"
"21.04.2019","Ostersonntag","Sonntag","21.04.2019 18:33:01"

PS:您能解释一下吗? (Get-Date $_).Date?我没有在Microsoft文档中找到它。

1 个答案:

答案 0 :(得分:3)

  

即使结果之一为“ false”,也不执行循环。 [...]为什么这个while循环不起作用?

循环不起作用,因为结果之一是$false。您的条件由与-and运算符连接的3个子句组成,这意味着所有 all 子句必须求值为$true才能使循环运行。但是,由于您的第二和第三子句是互斥的,因此永远不会发生。

我不太确定您的情况应该是什么样,但是至少您需要将条件设为A && (B || C)而不是A && B && C

更改此:

while (($DatumArray -notcontains $DatumAktuellerFeiertag) -and ($TagAktuellerFeiertag -ne "Samstag") -and ($TagAktuellerFeiertag -ne "Sonntag")) {
    # some code...
}

对此:

while (($DatumArray -notcontains $DatumAktuellerFeiertag) -and (($TagAktuellerFeiertag -ne "Samstag") -or ($TagAktuellerFeiertag -ne "Sonntag"))) {
    # some code...
}

编辑:

更新问题,澄清您实际上要完成的工作后,您的子句确实应该与-or运算符相关联,正如Mathias在评论中所怀疑的那样。但是,子句中的运算符不能以此为前提(您需要-contains-eq而不是-notcontains-ne)。此外,如果$DatumArray包含DateTime对象而不是字符串,您的代码将变得简单得多。两个工作日的比较也可以合并为一个。

类似的事情应该起作用:

$DatumArray = $DatumArray | ForEach-Object { (Get-Date $_).Date }

$startDate = ...
$cur = Get-Date $startDate
while (($DatumArray -contains $cur.Date) -or ('Samstag', 'Sonntag' -contains $cur.DayOfWeek)) {
    $cur = $cur.AddDays(1)
}