Powershell 随机时间选择逻辑不起作用,永远循环

Powershell 随机时间选择逻辑不起作用,永远循环,powershell,random,cycle,Powershell,Random,Cycle,我的输入是一个文本文件,上面有车牌和轮胎维修日期。然后提示我写一个时间,例如12:30。然后脚本检查时间是否合适。如果在不使用之前和之后都有30分钟是很好的 由于12:00-13:00块包含一个条目,因此使用该示例将不起作用。然后时间不好,所以脚本必须为我搜索一个好的日期。我试着每分钟逐行检查。之后,如果$help变量没有改变,那么它是好的,但是如果它改变了,那么就做一个随机时间来检查。你知道为什么这个逻辑不起作用吗 编辑:自从我编辑之后,我看到唯一一件不起作用的事情是,我的脚本生成了一个随机时

我的输入是一个文本文件,上面有车牌和轮胎维修日期。然后提示我写一个时间,例如12:30。然后脚本检查时间是否合适。如果在不使用之前和之后都有30分钟是很好的

由于12:00-13:00块包含一个条目,因此使用该示例将不起作用。然后时间不好,所以脚本必须为我搜索一个好的日期。我试着每分钟逐行检查。之后,如果
$help
变量没有改变,那么它是好的,但是如果它改变了,那么就做一个随机时间来检查。你知道为什么这个逻辑不起作用吗

编辑:自从我编辑之后,我看到唯一一件不起作用的事情是,我的脚本生成了一个随机时间,但它没有检查该时间是否正确,只需接受该时间,然后再见。不知何故,我应该让它检查更多次,不要在第一次生成时停止,检查它,如果它仍然错误,然后再次随机

样本数据

ABC-145 8:30 BDE-540 9:45 EDS-598 10:30 SDF-478 11:30 HUT-434 12:15 JEC-238 13:15 ASD-325 14:00 VRA-123 16:15 HGV-456 18:00
我建议采用不同的方法。首先从输入文件中提取时间,并将其转换为
DateTime
值:

$times = Get-Content 'Desktop/database.txt' |
         ForEach-Object { $_.Split("`t")[1] | Get-Date }
根据该列表确定适合另一次约会的实际间隔(前一次约会后至少30分钟,下一次约会前至少30分钟,因此最小时间窗口为60分钟):

从该列表中选择一个随机索引,并将30分钟添加到相应的时间:

$index = $available[(Get-Random -Maximum $available.Count)]
$start = $times[$index].AddMinutes(30)
'{0:HH:mm}' -f $start
或者,如果需要更多变化,请计算新的开始时间,从上次约会后30分钟到下次约会前30分钟,如下所示:

$index  = $available[(Get-Random -Maxmimum $available.Count)]
$delta  = ($times[$index+1]-$times[$index]).TotalMinutes - 60
$offset = 30 + [int](Get-Random -Maximum ($delta + 1))

$start = $times[$index].AddMinutes($offset)
'{0:HH:mm}' -f $start

这种方法可以确保在没有可用时隙的情况下不会陷入无限循环。

我尝试稍微修改一下措辞。也。它使代码更易于阅读,并且您可以看到嵌套语句的流动更容易。这是对你和那些想帮助你的人的奖励。谢谢你,是的,我刚才也用了我的本地脚本,但仍然不知道问题出在哪里:/如果我写了一个明显的坏时间,比如12:15,那么它得到了,这是一个坏值,但它继续随机生成时间,如果我打破了它,那么它会停在第6位,而不是第一位,所以我很困惑:)我想我已经想到了解决办法。所以问题是在它随机化了一段时间后,它在while循环中从上一条记录开始不断移动,不知何故,我应该回到while/foreach循环的开始。不要(ab)将其用作
foreach
循环的循环变量。编辑为$line,但仍然相同。我不知道为什么,但我仍然得到16:04的答案,但有一个日期是16:15。
$index = $available[(Get-Random -Maximum $available.Count)]
$start = $times[$index].AddMinutes(30)
'{0:HH:mm}' -f $start
$index  = $available[(Get-Random -Maxmimum $available.Count)]
$delta  = ($times[$index+1]-$times[$index]).TotalMinutes - 60
$offset = 30 + [int](Get-Random -Maximum ($delta + 1))

$start = $times[$index].AddMinutes($offset)
'{0:HH:mm}' -f $start