在Windows中是否有Linux "echo -e"的等效命令,使我可以使用"echo -e \xnnn"打印出ASCII码为十六进制值nnn的字符?
在Windows中是否有Linux "echo -e"的等效命令,使我可以使用"echo -e \xnnn"打印出ASCII码为十六进制值nnn的字符?
没有等价方法,但是您可以编写自己的函数。
我会把问题分成两部分。
将十六进制数转换为十进制数很简单:
set "myHex=4A"
set /a decimal=0x%myHex%
将数字转换为ASCII码更加棘手,这取决于所需的ASCII范围。
如果您只需要32(空格)到126'~'的范围,则可以使用=ExitCodeAscii
变量。
set "decimal=%1"
cmd /c exit /b %decimal%
echo "%=ExitCodeAscii%"
CR
、LF
、ESC
、DEL
这样的特殊字符,可以使用纯批处理创建它们。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☺☻♥
。有一个由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”。
@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
>
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
%=ExitCodeAscii%
及其他晦涩的动态环境变量真是太好了。 - mousio=ExitCodeAscii
直到现在才被我发现。 :) 感谢您分享这个很棒的知识! - Andriy M-e
的解决方案。对于-n
,你应该搜索echo without newline
。 - jeb