如果我正确理解了这个批处理脚本
for /f "usebackq tokens=*" %%i in (`time /t`) do (
echo "%%i"
)
echo "done"
应该只打印时间然后“完成”
相反,虽然在我的机器上,它打印的是Windows 10 Pro x64
>test.bat
>for /F "usebackq tokens=*" %i in (`time /t`) do (echo "%i" )
>(echo "Active code page: 65001" )
"Active code page: 65001"
>(echo "17:48" )
"17:48"
>echo "done"
"done"
为什么要这样做以及如何修复它以便它只是得到时间而不是“Active code page:65001”结果。这打破了构建脚本,因为FOR命令中的命令并不重要,第一行总是“活动代码页:65001”
要明确我正在寻找操作系统设置修复程序,而不是修复批处理文件。我正在尝试运行的真正批处理文件来自开源项目中的构建脚本,并且由于此问题而导致它们失败。
答案 0 :(得分:2)
当我们运行一个命令并且我们得到正确的输出,但它之前是另一个命令的输出,不知何故,这个意外的命令在我们的预期命令之前运行。
通常的嫌疑人是使用与我们正在调用的命令相同名称创建的批处理文件,但在这种情况下,time
是内部命令,不是这种情况,内部命令优先于外部命令命令(默认行为)。
如果time
是内部命令,那么如何调用另一个命令?
当for /f
需要处理命令的输出时,会创建一个单独的cmd
实例来执行该命令。在此单独实例中生成的输出由do
命令的for /f
子句中的代码处理。
创建此单独实例可能是意外输出的来源。
阅读cmd /?
显示的帮助信息,我们可以看到有两个注册表项
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun
可以配置为每次创建新cmd
实例时运行命令(除非在启动/D
实例时使用cmd
开关)。
这是最有可能找到Active code page: 65001
输出原因的地方。