如何在powershell中隐藏任务延迟输出?

How to hide task delay output in powershell?

提问人:Teknowledgist 提问时间:11/4/2023 更新时间:11/4/2023 访问量:33

问:

我正在尝试在 PoSh 脚本中使用任务延迟 .NET 函数,但是当我尝试保持安静时,我发现奇怪的行为。

[system.threading.tasks.task]::Delay(1000*$seconds)

等待几秒钟并给出如下输出:$seconds

Result                 : System.Threading.Tasks.VoidTaskResult
Id                     : 99
Exception              :
Status                 : RanToCompletion
IsCanceled             : False
IsCompleted            : True
CreationOptions        : None
AsyncState             :
IsFaulted              : False
AsyncWaitHandle        : System.Threading.ManualResetEvent
CompletedSynchronously : False

我不想要那个输出,但这些中的任何一个

$null = [system.threading.tasks.task]::Delay(1000*$seconds)
[system.threading.tasks.task]::Delay(1000*$seconds) |out-null
[void]([system.threading.tasks.task]::Delay(1000*$seconds))

除非很大,否则立即返回,因此延迟最小。为什么会这样以及如何解决它?$seconds

谢谢。

.NET 多线程 PowerShell

评论

0赞 TheMadTechnician 11/4/2023
在删除它之前,请使 PowerShell 格式化它...[system.threading.tasks.task]::Delay(1000*$seconds) |format-table|out-null
0赞 mklement0 11/4/2023
顺便说一句:丢弃输出也不会等待,因为返回值是一个异步任务对象。

答:

1赞 mklement0 11/4/2023 #1

直接的解决方法是调用 .Wait() 等待 [System.Threading.Tasks.Task]::D elay();由于 has return type ,它不输出任何内容,因此您不需要输出抑制:.Wait()void

[System.Threading.Tasks.Task]::Delay(1000 * $seconds).Wait()

但是,一种更简单、更有效的同步等待方法是调用 [System.Threading.Thread]::Sleep():

[System.Threading.Thread]::Sleep(1000 * $seconds)

或者,使用 PowerShell 的 Start-Sleep cmdlet:

Start-Sleep -Seconds $seconds