我正在编写的脚本是一个为学生活动预留机器人程序的票证,它在指定的循环中等待,直到销售开始,并且write-progress应该让您知道他们何时开始。我对PowerShell相当陌生,如果代码让人感到疼痛,我很抱歉。我只是感到困惑,因为这部分今天早些时候确实工作了,即使循环没有改变iirc。
下面是脚本的相关部分:
While ($currentDate -lt $purchaseTime){
$currentDate = Get-Date
$waitTime = (New-TimeSpan -End $purchaseTime).TotalSeconds
Write-Progress -Activity "Waiting until sales start" -SecondsRemaining $waitTime
Start-Sleep -Milliseconds 10
If ($currentDate -ge $purchaseTime){continue}
}
我也试过这个:
Do {
$currentDate = Get-Date
$waitTime = (New-TimeSpan -End $purchaseTime).TotalSeconds
Write-Progress -Activity "Waiting until sales start" -SecondsRemaining $waitTime
Start-Sleep -Milliseconds 201
} until ($currentDate -gt $purchaseTime)
我试着将循环从While改为Do甚至If语句,但是没有任何变化。有人能解决这个问题吗?我也没有收到任何错误,它只是不能呈现。
EDIT 1这是获取值的方式,$jsonObject由GET请求组成,下面是它的值。
$purchaseTime = $jsonObject.model.product.dateSalesFrom
"2022-11-25T11:00:00+02:00"
型
格式不应该是问题所在,因为在我写这个脚本的整个过程中,它们都是一样的,而且格式也是一样的。
我试着在声明之前插入Mathias建议的代码,但是它没有改变最终结果。他的意思是我应该在循环中插入它吗?这会不会搞砸它,因为我真的需要它在时间上是这个静态的地方,以便脚本按预期工作。我的PSVersion是5.1。为了清楚起见,我应该发布整个脚本吗?
编辑2.
我已经实现了圣地亚哥建议的代码,但是没有任何变化。进度仍然无法呈现。问题可能是来自jsonobject的日期是如何格式化的吗?Santiago发布的代码在powershell示例中可以自己运行和工作,所以我怀疑我的设置或类似的东西是否没有按预期工作。
以下是当前循环的外观:
$nowDate = Get-Date
$targetDate = Get-Date $jsonObject.model.product.dateSalesFrom
$timeSpan = $targetDate - $nowDate
$stopWatch = [System.Diagnostics.Stopwatch]::StartNew()
Do {
$progess = @{
Activity = 'Waiting until sales start'
SecondsRemaining = ($timeSpan - $stopWatch.Elapsed).TotalSeconds
}
Write-Progress @progess
Start-Sleep -Milliseconds 200
}
until($stopWatch.Elapsed -ge $timeSpan)
2条答案
按热度按时间erhoui1w1#
概念验证
这个例子展示了如何实现你的
do
loop(在这个例子中我更喜欢使用do
,尽管它也可以用while
loop来完成),显示一个精确的1分钟,我相信StopWatch
适合这个用例,它大大简化了代码。使用相同的逻辑,您只需要更改以下内容:
这将使您的循环运行到
Friday, November 25, 2022 6:00:00 AM
。6fe3ivhb2#
我已经解决了这个问题。
问题出在
$progressPreference
变量中。我已经将其设置为silentlyContinue以帮助WebRequests更流畅,但我不知道它也影响了Write-Progress
cmdlet。它现在工作正常。