想在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文档中找到它。
答案 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)
}