???' 不被识别为内部或外部命令

mie*_*mia 30 encoding batch psexec

当使用 PsExec 执行某些文件(主要是批处理)时,我得到这些奇怪的 ???' 我的命令前的符号。我最初的想法是,我使用了错误的编码,但经过检查,我意识到我所有的文件都使用了 UTF-8。

use*_*686 37

我觉得这些很奇怪???” 我的命令之前的符号 [...] 我所有的文件都使用 UTF-8。

这有两个原因:

  1. cmd.exe不支持 UTF-8。它始终使用一种通常称为“OEM”的单字节编码——cp437、cp775 等,具体取决于系统的区域设置。

    (我希望它也支持 UTF-16,但显然不是;即使我添加了 UTF-16 BOM。)

  2. 您的文本编辑器正在向EF BB BF所有 UTF-8 文件的开头添加一个 UTF-8“字节顺序标记”(bytes )。

    cmd.exe读取您的脚本时,它不知道如何处理标记 - 它会将 BOM 视为三个普通的 cp437 字符 ? ?,并尝试将它们用作命令名称的一部分。

配置您的编辑器以停止向 UTF-8 编码文件添加 BOM。(它只在 UTF-16 中有意义,在 UTF-8 中非常无用。)

将批处理文件编译成 exe 会解决问题吗?

什么

  • 我不会说 BOM 在 UTF-8 中“非常无用”;尽管他们是在这种特殊情况下。许多应用程序使用它们来确定文本实际上是 UTF-8 而不是另一种编码。 (3认同)

Cod*_*ick 25

为了进一步@dsolimano 的回答,如果您专门使用Visual Studio并且在我的情况下是2013,我通过执行以下操作来修复它:

  1. 打开Visual Studio
  2. 单击工具>选项
  3. 单击文本编辑器>文件扩展名
  4. 扩展框中,输入bat
  5. Editor下拉列表中,选择Source Code (Text) Editor With Encoding并单击Add
  6. 单击“确定”保存并退出。

现在,当您从Visual Studio 中打开.bat文件时,您最初会收到以下提示:

在此处输入图片说明

您将希望深入了解这些选项,直到找到您所用语言的DOS选项:

在此处输入图片说明

单击“确定”以完成打开文件。


好的,尽管此时应该相当明显,但如果您可以看到???文件开头的字符,则您应该删除它们并保存文件,现在使用正确的编码。这是防止您下次再次收到提示的原因。


有了所有这些,您会很高兴知道您现在可以Visual Studio 中查看编辑保存您的.bat文件,以便cmd.exe不再给您上述令人发指的错误:

'???' 不是内部或外部命令,也不是可运行的程序或批处理文件。

  • 我永远不会猜到这一点。仍然是 VS2019 的有效解决方案。 (5认同)
  • 此修复程序也适用于 VS2017 (3认同)

dso*_*ano 10

这些是 Unicode字节顺序标记。Cmd.exe 不理解它们。如果您使用 ANSI 编码在记事本中重新保存文件,则应该可以解决问题。

例如,我创建了这个批处理文件:

echo Hello World
Run Code Online (Sandbox Code Playgroud)

首先我用UTF-8编码保存

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>???echo Hello World
'???echo' is not recognized as an internal or external command,
operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

然后用 Unicode

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>?e
'?e' is not recognized as an internal or external command,
operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

最后与 ANSI

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>echo Hello World
Hello World
Run Code Online (Sandbox Code Playgroud)


小智 6

如前所述,此字符是用作签名的 unicode 字符 BOM(字节顺序标记),cmd.exe 无法识别该字符。

您可以通过多种方式安全地删除它。

我发现很容易做到如下:

  1. 记事本++中打开文件
  2. 转到编码菜单
  3. 勾选选项:在没有 BOM 的情况下以 UTF-8 编码
  4. 保存,就是这样。