如果我正确理解这个批处理脚本
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"
为什么要这样做以及如何修复它,以便它只获取时间而不是“事件代码页:65001”结果。这会破坏构建脚本,因为无论 FOR 命令中使用什么命令,第一行始终是“事件代码页:65001”
需要明确的是,我正在寻找操作系统设置修复,而不是批处理文件的修复。我尝试运行的真正批处理文件来自开源项目中的构建脚本,并且由于此问题而失败。
最佳答案
当我们运行一个命令并得到正确的输出时,但它之前是另一个命令的输出,不知何故,这个意外的命令在我们预期的命令之前运行。
通常的怀疑是使用与我们正在调用的命令同名创建的批处理文件,但在这种情况下,时间
是一个内部命令,情况不可能是这样,内部命令有优先于外部命令(默认行为)。
如果time
是一个内部命令,如何调用另一个命令?
当 for/f
需要处理命令的输出时,会创建一个单独的 cmd
实例来执行该命令。此单独实例中生成的输出由 for/f
命令的 do
子句中的代码处理。
此单独实例的创建可能是意外输出的根源。
阅读cmd/?
显示的帮助信息我们可以看到有两个注册表项
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun
可以配置为每次创建新的 cmd
实例时运行命令(除非在启动 cmd
时使用 /D
开关> 实例)。
这是最有可能查找为何获得 Active code page: 65001
输出的地方。
关于batch-file - 如何修复 Windows 批处理文件 FOR 命令返回 "Active code page: 65001",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48183570/