中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 07:01
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 通过大家努力,批处理可告别choice
16 发表于 2008-12-10 08:32 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
Originally posted by s11ss at 2008-12-9 22:48:


无按键是直接回车的情况么?如果只用0号的话,al是0d啊



无按键就是沒动键盘.
17 发表于 2008-12-10 14:00 ·  中国 福建 三明 电信
中级用户
★★
积分 458
发帖 211
注册 2006-07-26 19:42
UID 59307
状态 离线
真的很强,像我等不懂汇编的就只能望洋兴叹了。
┌───────┐
├→学习→实践→┤
└───────┘
18 发表于 2008-12-10 14:31 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 2,223
发帖 789
注册 2005-01-27 00:00
UID 35703
性别 男
状态 离线
上面的程序中mov ax,0长3字节,改mov ah,0或xor ah,ah或sub ah,ah就能少1个字节。

其实,此类程序最短的只要8字节。

DEBUG
a
mov ah,0
int 16h
mov ah,4Ch
int 21h

rcx
8
nkeycode.com
w
q
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
s11ss +7 2008-12-10 14:53
my major is english----my love is dos----my teacher is the buddha----my friends--how about U
19 发表于 2008-12-10 14:55 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
Originally posted by 本是 at 2008-12-10 02:31 PM:
上面的程序中mov ax,0长3字节,改mov ah,0或xor ah,ah或sub ah,ah就能少1个字节。

其实,此类程序最短的只要8字节。

DEBUG
a
mov ah,0
int 16h
mov ah,4Ch
...


我的意思就是不用int 16h的1号功能,看来还是行的~

其实好像可以不写com,直接用debug调用:)
20 发表于 2008-12-10 15:32 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
Originally posted by 本是 at 2008-12-10 14:31:
上面的程序中mov ax,0长3字节,改mov ah,0或xor ah,ah或sub ah,ah就能少1个字节。

其实,此类程序最短的只要8字节。

DEBUG
a
mov ah,0
int 16h
mov ah,4Ch
...



还是误解了,试一下12楼的例子就会发现与上面的程序不一样之处
21 发表于 2008-12-10 15:45 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
@echo off
call inc 2>nul
if %errorlevel%==1 (
>inc.src echo ecs:100 B8 00 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21
>>inc.src echo rcx
>>inc.src echo 10
>>inc.src echo w
>>inc.src echo q
debug inc.com < inc.src 2>nul 1>nul
del inc.src
)
:loop
inc


echo %errorlevel%



if not %errorlevel%==0 (
if %errorlevel%==81 goto :eof ::q or Q exit
if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop


或试一下这个,没输入时循环一直在跑.而不是等输入.

本帖主要就是用int 16h的ah=1,(也就是它与choice的主耍区别)没说清楚就毫无意义.
也许是我的表达能力不行,站内高手云云,有谁能邦我说明白?

[ Last edited by wangff on 2008-12-10 at 17:51 ]
22 发表于 2008-12-10 17:47 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
Originally posted by s11ss at 2008-12-10 14:55:


我的意思就是不用int 16h的1号功能,看来还是行的~

其实好像可以不写com,直接用debug调用:)


不用com也行,但要有脚本 如 c.txt


a
MOV AX,0100
INT 16
MOV AX,0000
JZ 010C
INT 16
MOV AH,4C
INT 21

g
q


p代码:

@echo off

:loop
debug <c.txt>nul


echo %errorlevel%



if not %errorlevel%==0 (
if %errorlevel%==81 goto :eof ::q or Q exit
if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop



效果一样.

[ Last edited by wangff on 2008-12-10 at 17:52 ]
23 发表于 2008-12-10 18:56 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
只用int 16h功能ah=0的例子:

脚本: a.txt
a
mov ah,0
int 16
mov ah,4C
int 21

g
q


p代码:
@echo off

:loop
debug <a.txt>nul


echo %errorlevel%



if not %errorlevel%==0 (
if %errorlevel%==81 goto :eof ::q or Q exit
if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop
24 发表于 2008-12-10 19:07 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
可以不要临时文件的


goto :main
a
;MOV AX,0100
;INT 16
MOV AX,0000
;JZ 010C
INT 16
MOV AH,4C
INT 21

g
q

:main
@echo off

:loop
debug <"%~f0">nul


echo %errorlevel%



if not %errorlevel%==0 (
if %errorlevel%==81 goto :eof ::q or Q exit
if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop

本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
wangff +2 2008-12-10 19:24
zh159 +20 2008-12-10 21:45
25 发表于 2008-12-10 21:47 ·  中国 广西 玉林 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
加两行快速清除“goto :main”显示和支持中文显示(XP测试)
......

:main
cls
@echo off
chcp 437|graftabl 936>nul

......
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
wangff +2 2008-12-10 22:45
wxcute +2 2008-12-12 12:44
26 发表于 2008-12-10 23:32 ·  中国 陕西 西安 电信
初级用户
积分 54
发帖 26
注册 2007-02-10 12:34
UID 79167
性别 男
状态 离线
好帖子
27 发表于 2008-12-11 09:19 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
2楼可带参数的完善版:

@echo off
goto main
a
MOV AL,
CMP AL,20
JNZ 0110
MOV AH,01
INT 16
MOV AX,0000
JZ 0112
INT 16
MOV AH,4C
INT 21

g
q
:main
chcp 437|graftabl 936>nul
set/p =input:<nul
::有参数(任意)等待输入一个字符,通过errorlevel返回
debug a.com i<"%~f0">nul 2>nul
echo %errorlevel%
:loop
::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键
debug<"%~f0">nul
echo %errorlevel%
if not %errorlevel%==0 (
if %errorlevel%==81 goto :eof ::q or Q exit
if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
zh159 +20 2008-12-11 09:31
28 发表于 2008-12-11 10:56 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
自动运行:

@echo off
goto main
a
MOV AL,
CMP AL,20
JNZ 0110
MOV AH,01
INT 16
MOV AX,0000
JZ 0112
INT 16
MOV AH,4C
INT 21

g
q
:main
chcp 437|graftabl 936>nul
set/p =等待...<nul&set/a n=0
:loop
set/a n+=1
set/p =.%n%<nul
debug<"%~f0">nul
if not %errorlevel%==0 (
if %errorlevel%==81 goto :eof ::q or Q exit
if %errorlevel%==113 goto :eof
)
if %n% gtr 5 goto p1
ping -n 2 127.1>nul
goto loop

:p1
echo.
echo 计时到,自动运行!
pause
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
Helloworld +1 2008-12-11 13:19
29 发表于 2008-12-11 13:19 ·  中国 广东 江门 新会区 电信
新手上路
积分 9
发帖 9
注册 2008-11-29 18:01
UID 132439
性别 男
状态 离线
兄们的创造能力实在是厉害!
30 发表于 2008-12-11 13:23 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
告别choice,这么说好像有点牵强,choice功能还是相对强大的说:)
论坛跳转: