为什么批处理文件中的"超时"命令突然不再起作用?

Koe*_*ich 8 windows timeout batch-file

我错过了Windows内部"超时"命令的更改吗?

我有一个批处理文件很长一段时间,它显示了程序的版本号.我添加了timeout命令以保持CMD窗口打开几秒钟.所以我的批处理文件现在看起来像这样:

context -version
timeout 7
Run Code Online (Sandbox Code Playgroud)

这工作正常但是由于某些Windows更新(显然),CMD窗口直接关闭,好像超时命令不再起作用.当我从CMD窗口启动文件时,我收到一条消息:

D:\ CTX> timeout 7
尝试'timeout --help'以获取更多信息.

该文件就像我创建它一样,但这种行为对我来说是新的.

所以有人能告诉我这里出了什么问题吗?

Mag*_*goo 9

我相信你可能已经获得了不同的版本,timeout因为帮助提示--help是一个\*nixy样式选项说明符.

从提示中尝试

where /T timeout.*
Run Code Online (Sandbox Code Playgroud)

应该列出timeout版本,path并可能有助于找到流氓版本.


Mof*_*ofi 6

TIMEOUT不是cmd.exe(Windows命令解释器)的内部命令,如FOR或DIR.

它是一个外部命令,表示控制台应用程序位于Windows目录中%SystemRoot%\System32.

在timeout没有文件扩展名且没有完整路径的情况下使用时,Windows命令解释程序首先在当前目录中搜索timeout.*具有在环境变量PATHEXT中列出的文件扩展名的文件.

如果在当前目录中找不到此类文件,Windows命令解释程序将继续timeout.*使用PATHEXT中列出的文件扩展名搜索环境变量PATH中定义的目录.

在Windows Vista和更高版本的Windows上,系统PATH定义为:

%SystemRoot%\system32;%SystemRoot%\system32;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
Run Code Online (Sandbox Code Playgroud)

因此,通常首先%SystemRoot%\System32\timeout.exe在timeout批处理文件中使用它.

但是,如果当前目录包含一个文件,其名称timeout.*具有在环境变量PATHEXT中列出的文件扩展名,或者PATH在本地或系统范围内由安装程序重新定义,安装程序将其他目录路径放在开头,而不是将它们附加到末尾,并且其中一个目录包含一个timeout.*文件,Windows命令解释程序运行此可执行文件或脚本.

解决这个问题的建议:

  1. 在批处理文件中使用,%SystemRoot%\System32\timeout.exe因为Windows命令解释器不能搜索此可执行文件,并且不能错误地timeout执行错误,除了环境变量SystemRoot在本地修改,这与PATH操作相比是非常不可能的.

  2. 打开Windows 控制面板-系统-高级系统设置(在左边蓝色链接),选择标签高级,点击按钮环境变量...,在列表下半部搜索系统变量的路径,选择这个环境变量,点击编辑,并将所有目录路径向左或向上移动(取决于Windows版本)%SystemRoot%\system32到目录列表的末尾.

  3. 请向应用程序或软件包的作者报告哪些修改了系统PATH并在开头插入了他们的目录路径,而不是在结尾处附加有关Windows 系统PATH的错误修改.

正如Magoo所写的那样:timeout.*由于输出帮助声明,从Unix到Windows 的移植显然在你的Windows机器上执行.要在Windows上获得有关命令的帮助,必须通常使用参数执行命令,/?而不是使用-h或--help在Unix上执行.