中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【分享】自认为某些命令的经典用法
作者:
标题: 【分享】自认为某些命令的经典用法 上一主题 | 下一主题
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『楼 主』:  【分享】自认为某些命令的经典用法

不知道还有多少热情,快了...呵呵
半年了,学到了些东西,趁着现在还有热度,把这些自己认为的好方法与大家共享,算是给大家的回报。遗憾的是从头到尾还只会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来确定那个子过程退出的方法在简单情况下可以起这个作用。

  Quote:
一个进程"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 [num] [:label1] [STR] [:LABEL2]
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 [num] [:label1] [STR] [:LABEL2]
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 ]

   此帖被 +12 点积分      点击查看详情   
评分人:【 ThinKing 分数: +4  时间:2008-4-27 08:11
评分人:【 kennyfan 分数: +3  时间:2008-4-28 00:30
评分人:【 26933062 分数: +5  时间:2008-4-29 17:30




山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-26 23:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 2 楼』:  

强烈支持楼主这种精神,但保留自己对某些问题的看法。



批处理之家新域名:www.bathome.net
2008-4-27 00:27
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 3 楼』:  

我发现
set a=12345
然后可以直接--
echo %a:~1,4%

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

2008-4-29 17:15
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: