batch fil - ekko -e ækvivalent i Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Er der nogen Linux 'echo -e' -kvivalent i Windows, så jeg kan bruge 'echo -e \ xnnn' til at udskrive karakteren, hvis ASCII-kode er den hexadecimale værdi nnn?

Bedste reference


Der er ingen tilsvarende, men du kan skrive din egen funktion.


Jeg ville opdele problemet i to dele.



  • Konverter hex-nummer til decimaltal.

  • Konverter decimaltal til ASCII.



Konvertering fra hex til decimal er simpel med


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


Konvertere et nummer til en ASCII er mere vanskelig, det afhænger af det krævede ASCII-interval

Hvis du kun har brug for området fra 32 (mellemrum) til 126 '~', kan du bruge variablen =ExitCodeAscii


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


Hvis du også har brug for nogle specialtegn som CR, LF, ESC, DEL, er det muligt at oprette dem med rent batch.


Hvis du har brug for mere end du kunne bruge vbscript.


forfiles metode



En mere generel måde er at bruge kommandoen forfiles (Dostips: Generer næsten ethvert tegn ...) [18]


ekko-e.bat


@echo off
set "arg1=\%~1"
set "arg1=\%arg1:x=0x\%"
forfiles /p "\%~dp0." /m "\%~nx0" /c "cmd /c echo(\%arg1\%"


Du kan ringe det via echo-e.bat "Hellox01x02x03"
og du får Hello☺☻♥.

Andre referencer 1


Der er et batch fil tegn manipulation bibliotek skrevet af Dave Benham kaldet CharLib.
  Dette bibliotek er blandt andet i stand til at konvertere hex til ascii, for alle tegn i intervallet 1..255 (det kan 't til 0 -> NUL). [19]


For mere info se tråden Er det muligt at konvertere et tegn til sin ASCII-værdi? på DosTips.com [20]


Hvis du bare skal bruge et enkelt problematisk tegn (fx en kontrolkode) i dit batch script, så er det en uvurderlig ressource til at skære og indsætte.


f.eks. at udskrive et CR-tegn (uden LF) i et batch script ...


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


vil ende med at udskrive 'xxxxxx7890' på konsollen som forventet.

Andre referencer 2


Her er en simpel hybridbatch/JScript-fil, der kan bruges til at ekko resultaterne af et gyldigt JScript-udtryk, herunder en, der bruger \ xnn. Den understøtter alle byte koder fra \ x00 til \ xFF.


Batchen tager et enkelt argument indeholdt i dobbelt citater. Argumentet skal være et gyldigt JScript-udtryk. De dobbelte citater er ikke en del af udtrykket. JScript-strenge i udtrykket skal vedlægges inden for enkelt citater.


Som standard udskrives en ny linje ikke i slutningen af ​​resultatet. Alternativet/N bruges til at tilføje en ny linje til slutningen af ​​resultatet.


Hvis det bruges i en batchfil, så skal scriptet naturligvis kaldes ved hjælp af 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)));
}


Her er et eksempelopkald, der bruger \ xnn til at introducere en ny linje i outputen, samt indeholder nogle flytende punktmatematik.


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

>

Andre referencer 3


Tilføjelse til hvad @jeb sagde du kan genskabe


echo -n -e "winx01x02x03x04" > file.exe


med


@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


som bliver:


echone.bat "winx01x02x03x04" > file.exe