echo -e эквивалент в Windows? - PullRequest
       27

echo -e эквивалент в Windows?

8 голосов
/ 21 декабря 2010

Есть ли в Windows эквивалент Linux "echo -e", чтобы я мог использовать "echo -e \ xnnn" для вывода символа, код ASCII которого является шестнадцатеричным значением nnn?

Ответы [ 4 ]

12 голосов
/ 21 декабря 2010

Эквивалента нет, но вы можете написать свою собственную функцию.

Я бы разбил проблему на две части.

  • Преобразование шестнадцатеричного числа в десятичное.
  • Преобразование десятичного числа в ASCII.

Преобразование из шестнадцатеричного в десятичное просто с помощью

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, их можно создать с помощью чистого пакета.

Если вам нужно больше, чем вы могли бы использовать vbscript.

Метод forfiles

Более общий способ - использовать команду forfiles ( Dostips: генерировать практически любой символ ... )

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☺☻♥.

5 голосов
/ 24 октября 2012

Существует библиотека манипулирования символами командного файла, написанная Дейвом Бенхамом, которая называется CharLib . Эта библиотека, помимо прочего, способна конвертировать шестнадцатеричные числа в ascii для всех символов в диапазоне от 1..255 (не может быть 0 -> NUL).

Для получения дополнительной информации см. Поток Можно ли преобразовать символ в его значение ASCII? в DosTips.com

Если вам просто нужно использовать один проблемный символ (например, управляющий код) в вашем пакетном скрипте, то это неоценимый ресурс для вырезки и вставки.

например. напечатать символ 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 голосов
/ 08 мая 2012

Вот простой гибридный пакетный / 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

>
1 голос
/ 16 мая 2017

В дополнение к тому, что @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
...