代码页850可用,65001失败!"调用foo.cmd"没有响应。内部命令正常运行。

4

这个问题基本上解释了问题所在。

我正在使用 Windows XP Pro Service Pack 3
ComSpec=C:\WINDOWS\system32\cmd.exe
我通过开始菜单... 运行对话框... cmd.exe 启动控制台

这是我的控制台的“视图”:
命令,然后是输出(以及我的 // 注释)

C:\> chcp 850
Active code page: 850
// output is as expected

C:\> echo @chcp ^& REM 850>test850.cmd
// no output; as ecpected)

C:\> type test850.cmd
@chcp & REM 850
// output is as expected

C:\> call test850.cmd
Active code page: 850
// output is as expected

上述内容在Windows环境下运行良好(如预期)。 但是,当我切换到代码页65001时,“调用”失败了。
C:\> chcp 65001
Active code page: 65001
// output is as expected

C:\> echo @chcp ^& REM 65001>test65001.cmd
// no output; as ecpected

C:\> type test65001.cmd
@chcp & REM 65001
// output is as expected

C:\> call test65001.cmd
// NO OUTPUT, NO ERROR, NO ANYTHING, NADA... other than frustration :)

这里发生了什么(没有发生)?

我刚在我的Win7 x64的非提升cmd上运行了这些代码,并得到了预期的输出。你用的是什么操作系统? - Franci Penov
@Franci:规格(一个好主意)...我正在使用Windows XP Pro Service Pack 3--ComSpec=C:\WINDOWS\system32\cmd.exe(我已经添加到主要问题中)。 - Peter.O
我的经验是,即使在当前代码页为65001时直接在cmd窗口中运行批处理程序也无法正常工作。使用msysgit(或mingw,我猜),如果您尝试在vi/vim中编辑任何内容,您将看到垃圾文字,而不是实际文本。 - ryenus
2个回答

4

有趣的是,实际上它并没有运行它。如果你执行以下操作:

pax> echo echo yy >xx.cmd
pax> chcp 850
pax> xx
yy
pax> chcp 65001
pax> xx
pax> _

你将得到空白。它不仅仅是缺少输出,而是根本没有运行(可以通过在echo行之前放置start .来证明)。在代码页850中,资源管理器可以运行,而在代码页65001中则不行。
这个问题有一些讨论,可以在此处查看:这里。你可以用以下方法让你的脚本运行:
chcp 65001 && xx.cmd && chcp 850

似乎在输入指令前,命令文件的代码页为65001时出现了某种问题!其他人在网上似乎建议使用PowerShell,鉴于cmd.exe的支持不太稳定。这是你需要自行评估的决定,但我在一个拥有许多执行同一任务工具的大型组织中工作,我怀疑微软将会把任何增强努力集中在PowerShell上,而不是老旧的命令行壳程序。他们的资源是庞大但并非无限的。

谢谢...你的建议有效:(chcp 65001 && call test65001.cmd && chcp 850)...并且你已经给出了一个很好的总体概述...(但是:(我没有足够的最低积分来标记你的答案)---虽然它提出了另一个问题(实际上是我的起源问题)...我认为解决.cmd的问题也会解决.py Python脚本,但它们什么也没做...现在一个.py脚本抛出一个错误:致命的Python错误:Py_Initialize:无法初始化sys标准流 LookupError:未知编码:cp65001 ---有任何想法的人吗? - Peter.O
请查看http://bugs.python.org/issue6058以获取可能即将推出的修复方案。此外,很少有SO用户会在我的答案评论中看到那个问题。我建议您将其作为另一个问题提出,这样您更有可能得到回复。 - paxdiablo

1
这是由于Windows XP中的cmd.exe内部调用具有值1的参数dwFlags的函数MultiByteToWideChar引起的。文档上说:"对于UTF-8,dwFlags必须设置为0。否则,该函数将失败"。
这里提供了补丁:http://consolesoft.com/p/cmd-xp-65001-fix/index.html

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