batch-file - 如何修复 Windows 批处理文件 FOR 命令返回 "Active code page: 65001"

标签 batch-file windows-10

如果我正确理解这个批处理脚本

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/

相关文章:

batch-file - 抑制 FORFILES "no files found"错误

matlab - MATLAB 的堆栈大小是多少?

.net - 找不到 "Microsoft.NET.CoreRuntime"

azure - 将 ADFS 与 Azure AD 集成后,对加入 Windows 10 的 Azure AD 计算机有何影响?

java - 如何使用 ProcessBuilder 启动批处理文件而不是作为子进程?

java - 使用批处理文件执行Jar中的Main类

javascript - 是否可以在没有 ActiveX 的情况下运行 JS/html 中的批处理文件?

具有多个 OUT 参数的 Java 存储过程批处理

uwp - 如何使用任意参数从 UWP 启动完全信任(桌面桥)应用程序

.net - 从桌面应用程序调用 Windows 10 通用类库