【问题标题】:PowerShell While Loop Multiple Conditions not workingPowerShell While循环多个条件不起作用
【发布时间】:2019-11-26 02:26:43
【问题描述】:

想要检查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"}

以上代码给出如下结果:

真的 错误的 真的

注意,其中一个结果是“假”。

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

不执行循环,即使其中一个结果为“假”。

归档我的目标的可能方法是什么?为什么这个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 "基准","Feiertag","Wochentag","值" "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 文档中没有找到它。

【问题讨论】:

  • -and更改为-or
  • (Get-Date $_).Date 将来自管道的当前输入转换为DateTime 对象,然后通过对象的Date 属性仅获取时间戳的日期部分。括号是一个分组表达式,允许运行一个语句,然后访问结果的属性或方法。

标签: powershell


【解决方案1】:

不执行循环,即使其中一个结果是“假”。 [...] 为什么这个 while 循环不起作用?

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

我不太确定您的条件应该是什么样子,但至少您需要条件为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 在 cmets 中所怀疑的那样。但是,子句中的运算符不得在此之上取反(您需要-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)
}

【讨论】:

  • 谢谢你的回答,它没有按预期发生:我编辑了原始线程,并试图解释:) 希望你能帮助我
  • 我发现我必须检查“-cointains”而不是“-notcointains”,现在效果更好,但周六/周日检查剂量有效,周六停止。
  • 非常感谢您抽出宝贵的时间 :) 我已经编辑了上面的帖子。
  • @z.z.代码无限循环 b/c 我是个白痴。 AddDays() 不会就地更新变量。该值必须重新分配给变量,否则它只会在变量不变的情况下被回显。查看更新的答案。
  • 感谢您的信息,现在必须检查并尝试。我注意到我想做的事情有点复杂:)(自动回答取决于 p-holiday 和 wekkend)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
相关资源
最近更新 更多