中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-08 09:48
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【分享】自认为某些命令的经典用法 查看 1,069 回复 2
楼 主 【分享】自认为某些命令的经典用法 发表于 2008-04-26 23:44 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
不知道还有多少热情,快了...呵呵
半年了,学到了些东西,趁着现在还有热度,把这些自己认为的好方法与大家共享,算是给大家的回报。遗憾的是从头到尾还只会bat。

call的一些用法
@echo off
::这个是一维数组的,大家可以扩展为2维,的定义。
call:arr arr + d d+ 258 68 944 ddd pp dd plp df
for /l %%a in (0 1 10) do set arr%%a
pause
:arr
set/a n+=1
if %2.==. goto:eof
set %1%n%=%2
shift /2
goto:arr


@echo off
::将输入的字符串作为变量然后赋值。这个用处可大了
set/p var=
call:x %var% plp626
for /f %%a in ("%var%")do call echo %%%%a%%
pause

:x
set %1=%2

for 的集合里,还支持复合语句:
  for /f %%a in ('if exist 1.txt ^(echo ++^) else echo -- ')do echo %%a
大家不妨将if换成for在发现发现。

有关start的用法
@echo off&if not %1.==. goto%*&exit/b
::将子过程作为for的集合的分析对象。(这个还可以再递归,)可以最大限度减少产生临时文件

for /f "delims=" %%a in ('%~s0 :a 1 2 3')do echo %%a
pause
for /f "delims=" %%a in ('%~s0 :b')do echo %%a
pause
::多进程
start/b %~s0 :a + - * /
pause&exit

:a
echo %*
exit/b
:b
echo ---b
exit/b


这个 第一行语句“if not %1.==. call%*&exit”我在许多代码经常用,位置已经固化了。它使代码可读性增强许多,同时也简洁了许多。

vbs知道一点点,下面这个代码包含的混合编程的思想,和批处理技巧不可小觑:
@echo off&if not %1.==. call%*&exit
::隐藏"调用" 原帖请搜索借尸还魂(请不要用这个来干坏事)
pause
goto:hid
:code
set set1=ping -n 2 127.1 1^>nul 2^>nul
for /l %%i in (1 1 5) do md test-%%i&%set1%
for /l %%i in (5 -1 1) do rd test-%%i&%set1%
msg %username% /v /w "~~~~~测试完毕,点确定退出cmd~~~~"
exit
:: /*-------- hideme ----------
:hid
if not %1.==. (goto:code) else mshta vbscript:createobject("wscript.shell").run("%~s0 :hid 0",0)(window.close)&exit
:: -------- hideme ----------*/


多进程的:(这两个代码我也不知能说明什么)
@echo off&if not %1.==. call%*&exit||by plp626@cn-dos.net
for /l %%a in (0 1 9) do start/b %~s0 :%%a
exit
:0
:1
:2
:3
:4
:5
:6
:7
:8
:9
echo 进程%0开始于%time%
title 右键暂停,左键继续,注意看时间先后顺序
for /l %%a in (1 1 1000)do echo 我是进程%0 当前时间:%time%
goto:eof

@echo off&if not %1.==. call%*&exit||by plp626@cn-dos.net
for /l %%a in (0 1 9) do start/b %~s0 :%%a
exit
:0
:1
:2
:3
:4
:5
:6
:7
:8
:9
echo 进程%0开始于%time%
title 右键暂停,左键继续,注意看时间先后顺序
for /l %%a in (1 1 1000)do echo 我是进程%0 当前时间:%time%>%tmp%\txt
goto:eof


如果你的机子是10核的:
@echo off
::六为纯数字,需要外部工具unrar.exe
set file=6位破解
if not "%1"=="" call%*&exit
for /l %%a in (0 1 9) do start/b %~s0 :%%a
exit
:0
:1
:2
:3
:4
:5
:6
:7
:8
:9
echo 进程%0 开始时间:%time%
for /l %%a in (0 1 9)do if "%0"==":%%a" set p=%%a
for /l %%a in (0 1 9)do for /l %%b in (0 1 9)do for /l %%c in (0 1 9)do for /l %%d in (0 1 9)do for /l %%e in (0 1

9)do call:key %%a %%b %%c %%d %%e %0
echo 进程%0 结束时间:%time%
goto:eof

:key
title 进程%6 正在试探:%p%%1%2%3%4%5 当前时间:%time%
unrar t -p%p%%1%2%3%4%5 "%file%.rar">nul 2>nul &&(
echo %p%%1%2%3%4%5 >key.txt
msg %username% /v "密码为%p%%1%2%3%4%5"
tskill /a cmd

)
goto:eof

多进程之间通信
现在用临时文件的方法还算可靠,修改系统环境变量的方法比如date我还没试,
另外,用exit/b?(?为0-9数字)然后用errorlevel来确定那个子过程退出的方法在简单情况下可以起这个作用。

一个进程"pause"(实际上它还是处于执行态只是执行pause命令暂停罢了),另一个进程处于执行状态,若当这个进程变为也pause时,不管这个进程的优先级有多高,按键相应第一个执行pause的进程,

@echo off&if not "%1"=="" call%*&exit
::纯批实现等待指定输入
:begin
call:timeout 5 :tsk1 626 :tsk2
:tsk1
echo\&echo "默认计划"
echo\&echo 按回车键退出
exit

:tsk2
echo "自定义计划"
pause
exit
:: /*----------------- timeout --------------------
:timeout
setlocal&del/a/q %tmp%\' 2>nul||(echo 未知错误!&pause&exit)
start/b/REALTIME %~s0 :timeout_1 %1 %2 %3 %4
:timeout_2
set "v="
set/p v=
if %v%.==%3. title %ComSpec%&cd.>%tmp%\'&endlocal&goto%4
if exist %tmp%\' exit ::没有输入,退出timeout
goto:timeout_2
:timeout_1
for /l %%a in (%1 -1 0)do (
title 倒计时:%%a /输入:%3 跳过默认计划 %2/
if exist %tmp%\' title %ComSpec%&exit
ping/n 2 127.1 >nul)
title %ComSpec%&cd.>%tmp%\'&goto%2
:: --------------------- timeout -------------------*/



关于call的用法很多,主要是参数,得把setlocal掌握好,大家有空多关注下面两个帖子。

【共同参与】"批处理函数库"
http://www.cn-dos.net/forum/viewthread.php?tid=38969&fpage=1
【共享】常用子过程、函数收集【专用帖】
http://www.cn-dos.net/forum/viewthread.php?tid=39777&fpage=2
多与别人分享,受益匪浅

[ Last edited by plp626 on 2008-4-27 at 12:04 AM ]
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
ThinKing +4 2008-04-27 08:11
kennyfan +3 2008-04-28 00:30
26933062 +5 2008-04-29 17:30
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2 发表于 2008-04-27 00:27 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
强烈支持楼主这种精神,但保留自己对某些问题的看法。
批处理之家新域名:www.bathome.net
3 发表于 2008-04-29 17:15 ·  中国 广东 揭阳 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
我发现
set a=12345
然后可以直接--
echo %a:~1,4%

之前我这个白痴一直 set a2=%a:~1,4% 然后才 echo %a2%
论坛跳转: