programacion por off lotes lista lenguaje ejemplos comandos batch bat avanzados avanzada archivos batch-file for-loop cmd ascii

batch file - off - Bucle a través de códigos ASCII en archivo por lotes



lista de comandos batch (5)

Bucle a través de códigos ASCII en archivo por lotes

Cualquier solución por lotes para hacer lo que quieras sería mucho más compleja que lo que ya tienes.

Considere usar PowerShell en su lugar:

for($i=65;$i -le 90; $i++){[char]$i}

Ejemplo de salida:

PS F:/test> for($i=65;$i -le 90; $i++){[char]$i} A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Quiero hacer eco de A a Z sin escribir for %%J in (ABCDEFGHIJKLMNOPQRSTU VWXYZ) do echo %%J comandos tan largos e infructuosos. Entonces me preguntaba si puedo pasar por los códigos ASCII. Algo así como for %%J in (ASCII of A ie.65 to Z) do echo %%J

Cualquier ayuda sería apreciada.


En Vbscript, puedes hacer algo como esto:

For i = 65 To 90 Car = Car & Chr(i) & vbTab Next wscript.echo Car

Y puede generarlo con un archivo por lotes como este:

@echo off Call :vbs Pause exit /b :vbs ( echo For i = 65 To 90 echo Car = Car ^& Chr(i^) ^& vbTab echo Next echo wscript.echo Car )>"%tmp%/%~n0.vbs" Cscript /NoLogo "%tmp%/%~n0.vbs"


Esta respuesta es una compilación y comparación de los métodos dados antes.

En la pregunta, el OP solicitó que se repitieran las letras de la A a la Z en un archivo por lotes . Si el propósito de la solución no es solo mostrar letras , sino procesar las letras de cualquier otra forma, entonces el método de la variable = ExitCodeAscii es el único que hace eso con el código de lote, aunque la modificación requerida en los otros dos métodos para hacer el lo mismo es simple

El siguiente código incluye los tres métodos y los compara de la manera más simple posible: a través del tiempo requerido por cada uno para completar.

@if (@CodeSection == @Batch) @then @echo off setlocal set "start=%time%" for /L %%a in (65,1,90) do ( cmd /C exit %%a call echo Batch: %%^=ExitCodeAscii%% ) echo First method: using =ExitCodeAscii variable echo Start: %start% echo End: %time% echo/ set "start=%time%" for /F %%a in (''powershell "65..90 | %%{ [char]$_ }"'') do echo PS: %%a echo Second method: using PowerShell echo Start: %start% echo End: %time% echo/ set "start=%time%" for /F %%a in (''cscript //nologo //E:JScript "%~F0"'') do echo JScript: %%a echo Third method: using JScript echo Start: %start% echo End: %time% goto :EOF @end for (var i=65; i<=90; i++) WSH.Echo(String.fromCharCode(i));

Varias ejecuciones de este código muestran resultados consistentes: el método PowerShell es el más lento, el método = ExitCodeAscii se ejecuta un 280% más rápido que PowerShell, y el método JScript se ejecuta un 240% más rápido que = ExitCodeAscii. Estas diferencias disminuirán a medida que todo el programa crezca y realice más cosas que solo mostrar las letras, pero en los archivos por lotes estándar / pequeños, esta relación siempre será la misma: PowerShell es el método más lento y JScript el más rápido. El método VBScript es similar a JScript.


La solución más simple es incluir este PowerShell one-liner en tu script bat:

powershell "65..90 | %{ [char]$_ }"

Sin embargo, no es necesariamente el más rápido.

Aquí hay una solución de VBScript similar a la de Hackoo , pero en un formato híbrido que no depende de escribir un archivo .vbs externo. Guárdelo con una extensión .bat. La línea cscript es lo que desencadena la ejecución del código híbrido de VBScript.

<!-- : batch portion @echo off & setlocal cscript /nologo "%~f0?.wsf" goto :EOF : VBScript --> <job> <script language="VBScript"> For i = 65 to 90 WSH.Echo(Chr(i)) Next </script> </job>

O si está más cómodo con la sintaxis de JavaScript, aquí hay un híbrido Batch + JScript.

@if (@CodeSection == @Batch) @then @echo off & setlocal cscript /nologo /e:JScript "%~f0" goto :EOF @end // end Batch / begin JScript for (var i=65; i<=90; i++) WSH.Echo(String.fromCharCode(i));


Sorprendentemente, hay una solución que hace uso de una variable de entorno incorporada indocumentada llamada =ExitCodeAscii , que contiene el carácter ASCII del código de salida actual 1 ( ErrorLevel ):

@echo off for /L %%A in (65,1,90) do ( cmd /C exit %%A call echo %%^=ExitCodeAscii%% )

El ciclo for /L recorre los códigos de caracteres (decimales) de A a Z cmd /C exit %%A establece el código de retorno ( ErrorLevel ) en el código iterado actualmente, que se repite como un carácter después. call , junto con los dos signos%% introducen una segunda fase de análisis para la línea de comando para obtener el valor actual de =ExitCodeAscii lugar del presente antes de que se ejecute todo el ciclo for /L (esto sucedería con un simple línea de comando como echo %=ExitCodeAscii% ). Alternativamente, también podría usarse la expansión retardada .

La idea básica se acredita a rojo y se aplica en esta publicación: ¿Cómo obtengo una salida de letra aleatoria en lote ?

1) El código de salida (o código de retorno) no es necesariamente lo mismo que el valor ErrorLevel . Sin embargo, la línea de comando cmd /C exit 1 establece ambos valores en 1 . Para asegurarse de que el código de salida sea igual a ErrorLevel , use algo como cmd /C exit %ErrorLevel% .