在Windows中echo -e等效?

时间:2010-12-21 01:24:44

标签: windows batch-file echo

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

4 个答案:

答案 0 :(得分:12)

没有等价物,但你可以编写自己的功能。

我会将问题分成两部分。

  • 将十六进制数转换为十进制数。
  • 将十进制数转换为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方法

更通用的方法是使用命令forfilesDostips: Generate nearly any character...

<强>回波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☺☻♥

答案 1 :(得分:5)

Dave Benham编写了一个名为CharLib的批处理文件字符操作库。   除其他外,该库能够将十六进制转换为ascii,适用于1..255范围内的所有字符(不能为0 - > NUL)。

有关详细信息,请参阅主题是否可以将字符转换为ASCII值? DosTips.com

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

e.g。在批处理脚本中打印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 :(得分:2)

这是一个简单的混合批处理/ JScript文件,可用于回显任何有效JScript表达式的结果,包括使用\ xnn的表达式。它支持从\ x00到\ xFF的所有字节代码。

批处理用双引号括起一个参数。参数应该是有效的JScript表达式。双引号不是表达式的一部分。表达式中的JScript字符串应该用单引号括起来。

默认情况下,结果末尾不会打印换行符。 / N选项用于在结果的末尾附加换行符。

如果在批处理文件中使用,那么当然应该使用CALL调用脚本。

<强> jEval.bat

@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

>

答案 3 :(得分:1)

添加@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