我希望在没有输入for %%J in (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) do echo %%J
如此冗长且无用的命令的情况下回显A到Z.所以我想知道我是否可以循环使用ASCII码。像for %%J in (ASCII of A ie.65 to Z) do echo %%J
任何帮助都将不胜感激。
答案 0 :(得分:12)
令人惊讶的是,有一个解决方案使用了一个名为=ExitCodeAscii
的未记录的built-in environment variable,其中包含当前退出代码 1 的ASCII字符({{1} }):
ErrorLevel
@echo off
for /L %%A in (65,1,90) do (
cmd /C exit %%A
call echo %%^=ExitCodeAscii%%
)
循环遍历for /L
到A
的(十进制)字符代码。 Z
将返回代码(cmd /C exit %%A
)设置为当前迭代的代码,然后ErrorLevel
作为字符编辑。 echo
与double - call
- 符号一起引入命令行的第二个解析阶段,以获得%
的当前值,而不是整个=ExitCodeAscii
之前的值。 1}}循环被执行(这可以通过像for /L
这样的简单命令行来实现。或者,也可以使用delayed expansion。
基本想法归功于rojo并在此帖子中应用:How do i get a random letter output in batch。
1)退出代码(或返回代码)不一定与echo %=ExitCodeAscii%
值相同。但是,命令行ErrorLevel
会将两个值都设置为cmd /C exit 1
。要确保退出代码等于1
,请使用类似ErrorLevel
的内容。
答案 1 :(得分:6)
任何能够做你想做的批处理解决方案都比你现有的要复杂得多。
请考虑使用PowerShell:
for($i=65;$i -le 90; $i++){[char]$i}
示例输出:
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
答案 2 :(得分:4)
这个答案是对之前给出的方法的汇编和比较。
在OP要求在批处理文件中回显A到Z字母的问题中。如果解决方案的目的不仅仅是显示字母,而是以任何其他方式处理字母,那么= ExitCodeAscii变量方法是唯一使用批处理代码执行该方法的方法,尽管需要修改另外两种方法也很简单。
下面的代码包括三种方法,并以最简单的方式对它们进行比较:通过每个方法完成所需的时间。
@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));
此代码的多次执行显示了一致的结果:PowerShell方法是最慢的方法,= ExitCodeAscii方法运行速度比PowerShell快280%,JScript方法运行速度比= ExitCodeAscii快240%。随着整个程序的增长和执行更多的事情而不仅仅是显示字母,这些差异会减少,但在标准/小批处理文件中,这种关系将始终是相同的:PowerShell是最慢的方法,JScript是最快的方法。 VBScript方法类似于JScript。
答案 3 :(得分:2)
在Vbscript中,您可以执行以下操作:
For i = 65 To 90
Car = Car & Chr(i) & vbTab
Next
wscript.echo Car
您可以使用如下批处理文件生成它:
@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"
答案 4 :(得分:2)
最简单的解决方案是在您的bat脚本中包含此PowerShell单行程序:
powershell "[char[]](65..90)"
但是,它不一定是最快的。
这是一个VBScript解决方案similar to Hackoo's,但是混合格式不依赖于编写外部.vbs文件。使用.bat扩展名保存。 cscript
行是触发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>
或者,如果您对JavaScript语法更加熟悉,那么这就是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));
答案 5 :(得分:0)
awk 提供了功能。
asc () { awk -v n=$1 'BEGIN { printf "%c", n }'; }
for n in $(seq 65 90)
do
echo $(asc $n)
done
如果我们有 bash shell,我们可以使用几个printf
命令将数字转换为ascii:
asc () { bash -c "printf '%b\n' $(printf '\\\x%x' $1)"; }
for n in $(seq 65 90)
do
echo $(asc $n)
done
答案 6 :(得分:-1)
这个小宝石浮现在脑海中,因为它没有混淆和合理的性能:
@set _ASCII=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
@for %%J in (%_ASCII%) do @echo %%J
将数据与程序流逻辑分开,读取效果更好。我的系统运行时间不到一微秒,比其他方案快一个数量级。
Windows批处理脚本可以执行的唯一类型转换是它暂时将字符串提升为整数然后再返回字符串。