在 Windows 2012 Server 上,从登录的管理员(本地和域)通过将控制台输入重定向到文件创建批处理文件“test.bat”:
echo Hello
当从 PowerShell cmd 提示符运行时.\test.bat
,它会回显:
'■e' is not recognized as an internal or external command,
批处理文件位于登录用户的 C:\users\%username% 目录中。
该文件是从控制台创建的,因此:
echo "echo Hello" > test.bat
然后使用记事本进行编辑。在记事本中看起来没问题... 没什么异常。
你知道发生了什么事吗?
編輯:
根据建议,我修改了命令行输入以删除引号。因此,输入了如下命令:echo echo Yowzer > test.bat
Ran as:.\test.bat
并得到了与上面相同的响应。还请注意,如果我在记事本中编辑上述 test.bat(即在 cmd 行中创建)并重新运行,它仍然会返回垃圾响应。但是,如果我在记事本中创建/保存文件从头开始,它工作正常。
有人可以复制这个吗?
答案1
看起来重定向>
已将您的批处理文件编码为 unicode,而它应该是 ascii。在 Powershell 中,使用Out-File
重定向代替,如下所示:
"echo test" | Out-File test.bat -Encoding ascii
在以下编码后运行批处理文件将重现错误:
"echo test" | Out-File test.bat -Encoding unicode
答案2
遇到了同样的问题,我以为我疯了。
在另一台计算机上创建批处理文件。我在打开记事本并正常输入命令时遇到了同样的问题。它总是给我同样的消息。一旦我在本地 Win7 设备上重新创建批处理文件(不要复制旧文件),将其复制回我的 Win 2012R2 服务器,它就会像冠军一样工作。
答案3
您很可能在某个地方看到了一些奇怪的字符。我敢肯定,如果您看到了,xxd -p blah.bat
那么您会在批处理文件中看到一些奇怪的字符。
然后,您可以思考它们是如何到达那里的,并将它们移除。这可以使用 xxd 和 sed 来完成。或者,如果您知道它们是什么字符,也许还有另一种方法。
你可以从下载 VIM 7.X 或 cygwin 获取 xxd
或者您可以找到一个十六进制编辑器并将批处理文件放入十六进制编辑器中。
你说你正在从 stdin 创建批处理文件。好吧,你可以详细说明你的意思,例如,你的意思是指copy con blah.bat
CTRL-Z 吗?但不管你的意思是什么,它都是在文件中放入一些有趣的字符。
添加
我看到您声明您使用 echo 和重定向完成了此操作。
您可以轻松地简化此过程以进行一些故障排除
尝试 type blah.bat
如果显示出一个有趣的字符,那么尝试将
echo H>blah.bat
其构建到您所输入的内容中,并查看在什么时候您会得到有趣的字符。
另一件需要尝试的事情是输入和输出编码
尝试 chcp。chcp 850 和 chcp 65001,看看是否有任何差异。chcp 将改变输入和输出编码,但 chcp 只会显示输入编码。
如果你看我在这里的回答https://stackoverflow.com/questions/30904504/font-is-right-why-cant-i-get-this-unicode-character-to-display-in-this-c-sharp/32418703#32418703 您会看到我之前编写的一个名为 chcpa 的程序,您可以使用它来比 chcp 更灵活地更改输入和输出编码。或者您可以只使用 chcp,但如果您发现 chcp 限制了您的故障排除,那么您可以尝试 chcpa。
但是,正如所提到的,在排除故障时,最好的工具之一就是十六进制编辑器或 xxd。并尝试进一步简化您的线路,正如所建议的那样。
此类步骤将帮助您找出错误所在。当您在此处或之后尝试任何操作时,请发表评论。