『楼 主』:
【分享】自认为某些命令的经典用法
不知道还有多少热情,快了...呵呵
半年了,学到了些东西,趁着现在还有热度,把这些自己认为的好方法与大家共享,算是给大家的回报。遗憾的是从头到尾还只会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 ]
|