批处理文件中有什么因素会使暂停命令失效?

3

我为一份清理USB病毒批处理文件中的“暂停”语句不起作用而感到烦恼,这种病毒似乎在我工作的地方很普遍。

我通过研究发现,当您调用另一个批处理文件并且它失败或具有退出语句时,可能会出现此类问题,并使用了“call”来防止它发生。

问题是,批处理文件继续运行,它不会停止,它运行得非常好,但它只忽略第一个暂停事件。

另一件事是,当我使用@echo off时,无论如何都不起作用。如果我去掉REM @echo off并从cmd运行批处理文件,则第一次运行暂停将失败,然后如果我再运行一次,则暂停将正常工作。

尽管在互联网上寻找解决方案,但我似乎找不到原因。

我保留了标题/签名的东西,只是因为它可能是其中之一的原因,但我尝试过没有它仍然不起作用。

以下是代码:

@echo off
mode con: cols=80 lines=30
title USBFix by Tamok

:Signature
echo " __    __       _______..______    _______  __  ___   ___"
echo "|  |  |  |     /       ||   _  \  |   ____||  | \  \ /  /"
echo "|  |  |  |    |   (----`|  |_)  | |  |__   |  |  \  V  / "
echo "|  |  |  |     \   \    |   _  <  |   __|  |  |   >   <  "
echo "|  `--'  | .----)   |   |  |_)  | |  |     |  |  /  .  \ "
echo " \______/  |_______/    |______/  |__|     |__| /__/ \__\"
echo Par T. Tamok
echo Version 0.1
echo.
echo.
echo Bienvenue dans le programme de desinfection de clefs USB et volumes externes. Appuyez sur une touche pour continuer.
pause >nul
echo.
echo Voici une liste des disques reconnus sur votre ordinateur.
echo.
call wmic logicaldisk get caption,providername,drivetype,volumename
echo.

:Volume Check
    set /p vName=Veuillez saisir la lettre correspondant au volume que vous souhaitez reparer : 
    if not exist %vName%:\nul goto :failed

:Repair
    echo Appuyez sur une touche pour continuer la reparation ou fermez la fenetre pour quitter.
    pause >nul
    echo Reparation en cours, veuillez patienter...
    call attrib -h -r -s /s /d %vName%:\*.*
    echo Restauration des fichiers caches terminee. Suppression des fichiers infectes...
    if exist %vName%:\iTunesHelper.vbe goto :vbdel
    echo Pas de virus iTunesHelper.vbe.
    :keep1
    if exist %vName%:\*.lnk goto :lnkdel
    echo Pas de fichiers .lnk.
    :keep2
    goto :eof

:failed
    echo Cette lettre ne correspond a aucun volume. Appuyez sur une touche pour quitter.
    goto :eof

:vbdel
    del %vName%:\iTunesHelper.vbe
    echo Virus iTunesHelper.vbe repere.
    echo Suppression de iTunesHelper.vbe OK.
    goto keep1

:lnkdel
    del %vName%:\*.lnk
    echo Suppression des fichiers .lnk OK.
    goto keep2

:eof
    pause >nul
    :exit

1
似乎没有任何问题。也许尝试使用sleep命令并查看会发生什么(或删除对nul的重定向)。 - Monacraft
非交互性。如果暂停不认为人类可以按任何键,它就不会暂停。我不知道规则,但启动脚本是一个例子。虽然看你的代码,这可能是脚本错误。 - phd443322
@Monacraft 我试着去掉重定向到nul的操作,可惜没有改变任何东西。然后我尝试用timeout替换pause,结果成功了。我不确定为什么timeout可行而pause不行。这是一个好的解决方法,但我仍然很想知道为什么使用pause会发生什么。 - Tamok
1个回答

3

:eof 是CMD中使用的内部文件结尾标签,它将退出程序。

请将其更改为不同的标签。

以下是一个演示此功能的示例:

@echo off
echo start
goto :eof
echo this will never appear and pause will not function
pause

谢谢你的建议。我已经改成了“:endplz”,但这并没有解决暂停的问题。不过,了解这些东西总是很好的! - Tamok
你也改了每一个 goto :eof 吗? - foxidrive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接