【问题标题】:Random time selection logic is not working and loops forever随机时间选择逻辑不起作用并永远循环
【发布时间】:2016-12-10 14:19:07
【问题描述】:

我的输入是带有车牌和轮胎维修日期的文本文件。然后提示我写一个时间,例如 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
$file = Get-Content Desktop/database.txt
[datetime]$time = Read-Host "Time for date?"
$start = $time
$check = $time
$help = 0
echo $time
foreach ($line in $file) {
    #here I check if the date is free
    $out = $line.Split()
    while ($true) {
        #until I found a good time
        for ($i=0; $i -lt 30; $i++) {
            #check the next half hour if good
            if ($time -eq $out[1]) {
                $help = 1
            }
            $time = $time.AddMinutes(1)
        }
        for ($i=0; $i -lt 60; $i++) {
            #back check the half hour
            if ($time -eq $out[1]) {
                $help = 1
            }
            $time = $time.AddMinutes(-1)
        }
            $time = $time.AddMinutes(30)
        if ($help -eq 0) {
            break
        } else {
            $hour = Get-Random -Minimum 8 -Maximum 20
            $minute = Get-Random -Minimum 0 -Maximum 59
            $start = "$ora`:$perc" 
            $time = $start
            $help = 0
            #echo $time
        }
    }
}
if ($start-ne $check) {
    echo "There wasnt a free date, but there is a free spot at " + $start
} else {
    echo "This is free date"
}

【问题讨论】:

  • 我试着稍微修正一下措辞。还有you really need to use some indentation coding style。它使代码更易于阅读,并且您可以看到嵌套语句如何更轻松地流动。这是对您想要帮助您的人的奖励。
  • 谢谢,是的,我现在也在我的本地脚本中做了,但仍然不知道问题出在哪里:/ 如果我写了一个明显的糟糕时间,比如 12:15,那么它得到了那,这是一个糟糕的价值,但它会不断产生随机时间,如果我打破它,那么它会停在第 6 次,而不是第一次,所以我很困惑 :)
  • 我想我已经想到了解决方案。所以问题是在它随机化了一段时间之后,它一直在从最后一条记录开始的 while 循环中移动,不知何故我应该回到 while/foreach 循环的开始。
  • $_ 是一个automatic variable。不要(ab)将其用作foreach 循环的循环变量。
  • 编辑为 $line 但仍然相同。我不知道为什么,但我仍然得到 16:04 作为答案,但在 16:15 有一个日期。

标签: powershell random cycle


【解决方案1】:

我会推荐一种不同的方法。首先从输入文件中提取时间并将它们转换为DateTime 值:

$times = Get-Content 'Desktop/database.txt' |
         ForEach-Object { $_.Split("`t")[1] | Get-Date }

从该列表中确定实际上足够宽以适应另一个约会的间隔(分别在上一个约会之后和下一个约会之前至少 30 分钟,因此最短时间窗口为 60 分钟):

$available = 0..($times.Count-1) |
             Where-Object { ($times[$_+1]-$times[$_]).TotalMinutes -ge 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

这种方法可确保您在没有可用时隙时不会陷入无限循环。

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2020-08-12
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多