在Windows中的echo -e等效命令是什么?

9

在Windows中是否有Linux "echo -e"的等效命令,使我可以使用"echo -e \xnnn"打印出ASCII码为十六进制值nnn的字符?

4个回答

16

没有等价方法,但是您可以编写自己的函数。

我会把问题分成两部分。

  • 将十六进制数转换为十进制数。
  • 将十进制数转换为ASCII码。

将十六进制数转换为十进制数很简单:

set "myHex=4A"
set /a decimal=0x%myHex%

将数字转换为ASCII码更加棘手,这取决于所需的ASCII范围。
如果您只需要32(空格)到126'~'的范围,则可以使用=ExitCodeAscii变量。

set "decimal=%1"
cmd /c exit /b %decimal%
echo "%=ExitCodeAscii%"

如果您需要像CRLFESCDEL这样的特殊字符,可以使用纯批处理创建它们。
如果您需要更多内容,可以使用vbscript。
forfiles方法
一种更通用的方法是使用命令forfiles (Dostips: Generate nearly any character...) echo-e.bat
@echo off
set "arg1=%~1"
set "arg1=%arg1:\x=0x%"
forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(%arg1%"

您可以通过 echo-e.bat "Hello\x01\x02\x03" 调用它,然后您将获得 Hello☺☻♥

3
谢谢你的提示!了解%=ExitCodeAscii%及其他晦涩的动态环境变量真是太好了。 - mousio
2
由于某种原因,“众所周知”的=ExitCodeAscii直到现在才被我发现。 :) 感谢您分享这个很棒的知识! - Andriy M
请问 echo -ne \x01\x02\x03\x04 的等效命令是什么? - Zibri
@Zibri 我已经添加了 -e 的解决方案。对于 -n,你应该搜索 echo without newline - jeb

5

有一个由Dave Benham编写的批处理字符操作库叫做CharLib。除其他功能外,该库可以将16进制转换为ASCII码,适用于所有1至255范围内的字符(无法转换0-> NUL)。

更多信息请参见DosTips.com上的主题“是否可能将字符转换为其ASCII值?”

如果您只需要在批处理脚本中使用单个有问题的字符(例如控制代码),那么这是一个非常有用的剪切和粘贴资源。

例如,在批处理脚本中打印CR字符(不带LF)...

@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"
echo 1234567890!ASCII_13!xxxxxx

预期的结果是将在控制台上打印“xxxxxx7890”。


2
这里是一个简单的混合批处理/JScript文件,可用于回显任何有效JScript表达式的结果,包括使用\xnn的表达式。它支持从\x00到\xFF的所有字节码。
该批处理需要一个被双引号包含的参数。参数应为有效的JScript表达式,双引号不属于表达式的一部分。表达式中的JScript字符串应在单引号内。
默认情况下,结果末尾不打印换行符。/N选项用于在结果末尾添加换行符。
如果在批处理文件中使用,则必须使用CALL调用脚本。
@if (@X)==(@Y) @end /* harmless hybrid line that begins a JScrpt comment

::: Batch part ::::
@echo off
cscript //nologo //e:JScript "%~f0" %*
exit /b

*** JScript part ***/
if (WScript.Arguments.Named.Exists("n")) {
  WScript.StdOut.WriteLine(eval(WScript.Arguments.Unnamed(0)));
} else {
  WScript.StdOut.Write(eval(WScript.Arguments.Unnamed(0)));
}

下面是一个使用\xnn在输出中引入新行的示例调用,同时还包括一些浮点数运算。

>jEval " 'Hello world!\x0a4/5=' + 4/5 " /n
Hello world!
4/5=0.8

>

2
补充一下@jeb所说的,您可以重新创建
echo -n -e "win\x01\x02\x03\x04" > file.exe

使用

@echo off
setlocal
set LF=^


set "arg1=%~1"
set "arg1=%arg1:\x=0x%"
for /f eol^=^%LF%%LF%^ delims^= %%A in (
    'forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo|set /p=%arg1%"'
) do if "%~2" neq "" (set %~2=%%A) else echo|set /p=%%A

变成:

echone.bat "win\x01\x02\x03\x04" > file.exe

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