【问题标题】:Sleep in CMD - Need dirty workaround在 CMD 中睡眠 - 需要肮脏的解决方法
【发布时间】:2023-03-06 12:14:01
【问题描述】:

如果您在 .cmd 中编写脚本并需要程序休眠,您通常有多种选择。 您可以使用

ping -n 5 localhost > nul

timeout /T 5 /NOBREAK > nul

或从 powershell 调用 Start-Sleep 方法。

这是我的问题:所有这些方法都会产生额外的进程。例如,如果使用 timeout-method,则会创建以下流程:

ping 方法也是如此。如果您使用 Start-Sleep,则会创建一个 powershell 进程。 由于难以解释的原因(无论如何对其他人来说不是很有趣),我不能这样做。我必须确保我的 .cmd-Script 停止大约 5 秒。 谁能想到一个肮脏的把戏,该怎么做,让 .cmd-Scrpt 暂停大约 5-7 秒?唯一的要求是:(1) 不产生子进程和 (2) 资源不要太密集(CPU 使用率不应该太高)

【问题讨论】:

  • 你问的是不可能的。批处理或 .cmd 文件不是多线程的,因此如果它被暂停,它不能做任何事情来计时或在没有用户输入的情况下恢复。这就是为什么您在以前的解决方案中看到的所有内容最终都会产生一个外部进程来执行延迟的实际计时。
  • 即使我们可以想出一些想法来做到这一点,我们也需要能够在其余代码的上下文中提供它。为此,您需要edit 您的代码,以提交真实世界的示例。例如,通常需要延迟以在继续之前让其他东西运行和完成,只是延迟脚本似乎不合逻辑。如果您要解释为什么需要它,这也会有所帮助。我能想到的唯一原因是您正在恶意运行某些东西,并试图阻止受害者检测到。
  • 如果cmd 有一个原生的睡眠功能,那么就不需要这些黑客了。有了足够的聪明才智,您可以围绕内置 %time% 原语的输出编写一个繁忙的等待循环,但是由于这会涉及到繁忙的等待,所以它根本不比启动一个进程更可取。
  • 您还需要准确解释是什么。与“CPU使用率”相关的“太高”是什么意思,以及这是如何相关的。因为您可以使用基本的For 循环和@For /L %%G In (1,1,4200000) Do @Rem 之类的东西。 我刚刚在一台旧笔记本上实际测试过,花了 6 秒,(你说 5-7 秒),CPU 使用率达到 17% 左右,(IMO 不太高)
  • @Compo:考虑到处理器种类繁多,以及它们对单线程代码的不同速度,使用恒定迭代次数的循环甚至比旋转%time% 更糟糕。在我的(不是太新的)机器上,循环在 4 秒内完成,较新的机器可能会更快。 CPU 使用率或多或少与(硬件)线程的数量成反比,因为循环将占用不超过其中一个。当然,如果您确切知道它将在哪台机器上运行,该方法或多或少是有用的,因为您可以调整迭代。

标签: windows cmd sleep


【解决方案1】:

你可以试试这个方法:

    @echo off

    call :wait 5

    goto :eof

    :wait
    setlocal ENABLEDELAYEDEXPANSION
    set "HOW=%1"
    set "CNT=0"

    call :GetTime NOW

    :again
    call :GetTime NEXT
    if not "!NOW!" == "!NEXT!" (
        set /A "CNT+=1"
        set "NOW=!NEXT!"
    ) else (
        goto :again
    )
    if not "!CNT!" == "%HOW%" (
        goto :again
    )
    endlocal
    goto :eof
    
    :GetTime
    for /f "usebackq tokens=1,2,3,* delims=,: " %%a in ('%time%') do (
        set "%1=%%c"
    )
    goto :eof

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多