powershell Write-Progress在循环中调用时根本不呈现

xfyts7mz  于 2022-12-18  发布在  Shell
关注(0)|答案(2)|浏览(104)

我正在编写的脚本是一个为学生活动预留机器人程序的票证,它在指定的循环中等待,直到销售开始,并且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)
erhoui1w

erhoui1w1#

概念验证

这个例子展示了如何实现你的do loop(在这个例子中我更喜欢使用do,尽管它也可以用while loop来完成),显示一个精确的1分钟,我相信StopWatch适合这个用例,它大大简化了代码。

$nowDate    = Get-Date
$targetDate = $nowDate.AddMinutes(1)
$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)

使用相同的逻辑,您只需要更改以下内容:

$nowDate    = Get-Date
$targetDate = Get-Date $jsonObject.model.product.dateSalesFrom

这将使您的循环运行到Friday, November 25, 2022 6:00:00 AM

6fe3ivhb

6fe3ivhb2#

我已经解决了这个问题。
问题出在$progressPreference变量中。我已经将其设置为silentlyContinue以帮助WebRequests更流畅,但我不知道它也影响了Write-Progress cmdlet。它现在工作正常。

相关问题