批处理之家's Archiver

huajinghua 发表于 2008-4-4 10:51

批处理几个常用技巧

转载请声明:
[url]http://hi.baidu.com/huajinghua[/url]
仔细看完,你就成为高手了
用批处理时经常会用到某些重复的语法,这样我们就可以用参数来避免重复写代码了。
经典语法一:
比如在我的博客广告中有这样一段代码[code]for /l %%i in (1,1,600) do ver >nul[/code]这种延迟是经长要使用到的。所以我们可以使用参数来解决这个问题!
例如[code]:yanchi
for /l %%i in (1,1,%1) do ver >nul
goto :eof
……
call :yanchi 2000[/code]这样我们就可以调用延迟标签并修改延迟所需时间。
经典语法二:
一个绝对经典的是通用的IP函数[code]:ip
for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i /c:%1') do set "%~2=%%i"
goto :eof[/code]绝对经典的这段代码。
向获得IP,就可以使用[code]call :ip "IP Address" "ip"[/code]这样就把ip付给了变量ip
其他的比如[code]call :ip "DNS Servers" "dns"
call :ip "Subnet Mask" "subnet"
call :ip "Default Gateway" "gateway"
call :ip "Physical Address" "phyaddr"
call :ip "Dhcp Enabled" "dhcp"[/code]分别获得DNS 子网掩码 网关 物理地址 dhcp是否开启
经典语法三:
获取ping一个网站后获得的最大,最小,平均延迟,是我在写《多功能批处理》时想到的,呵呵,不知道以前别人有没有用过[code]:sudu
for /f "tokens=3,6,9 delims=, " %%i in ('ping -n 3 %1^|find /i "mini"') do (
set min=%%i
set max=%%j
set ave=%%k
set min=!min:~0,-2!
set max=!max:~0,-2!
set ave=!ave:~0,-3!
echo\)
goto :eof[/code]这样只要这样调用这个标签[code]call :sudu www.163.com[/code]就可以获得ping网易后的延迟了,分别赋在变量min max ave中。
经典语法四:
获取磁盘分区,看见很多人用这个笨方法[code]for %%i in (a b c d e f g h i ……)[/code]其实有一个更好的获取硬盘分区的方法:[code]for /f "skip=1 tokens=1,2 delims=\" %%i in ('fsutil fsinfo drives^|find /v ""') do (
set drive=%%i
set drive=!drive:~-2!
……)[/code]其实这个方法也挺好用的,也不难,磁盘分区被赋给了 !drive!变量。
经典语法五:
下面这个语法可以防止用户删除了批处理本身,可以使用下面这个语法。这个是我在《多功能批处理》中用到的,目的是方便执行计划任务命令。[code]if not exist %windir%\everybat.exe copy "%~0" %windir%\everybat.exe >nul[/code]这样不仅可以防止用户删除批处理本身后(或是改名)批处理本身被删除(或改名),而且也简化了路径。毕竟批处理本身不大,复制到%windir%下先凑合着,或者自己建立一个文件夹在%progra~1%下,将自身复制到其中。
经典语法六:[code]:dong
for /l %%i in (1,1,%i) do (
set ",=%2"
set/p=!%2:~%%i,1!
for /l %%i in (1,1,%3 do ver>nul)
goto :eof[/code]调用这个动画,不仅可以修改长度,而且可以修改动画显示内容和速度。[code]call :dong 37 "新青年世界,http://hi.baidu.com/huajinghua" 600[/code]这样就达到了动画显示效果啦。而且避免动画显示空内容。

经典语法七:[code]:start
@reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v help /t reg_sz /d %1
@reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v help1 /t reg_sz /d %1
@reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v help /t reg_sz /d %1
goto :eof[/code]开机自动运行批处理,其实这个是最简单的,呵呵,不用说你也知道怎么用,可以配合上面的自身复制达到很好的效果 例如; call :start %windir%\*.bat
:经典技巧八
很多初学者最讨厌看帮助命令,认为不够人性化,但其实里面的帮助信息足够让你成为高手(如果你全部看懂的话),其中有一个很好用的语法就是
另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:
[quote]     ~I         - 删除任何引号("),扩充 %I
     %~fI        - 将 %I 扩充到一个完全合格的路径名
     %~dI        - 仅将 %I 扩充到一个驱动器号
     %~pI        - 仅将 %I 扩充到一个路径
     %~nI        - 仅将 %I 扩充到一个文件名
     %~xI        - 仅将 %I 扩充到一个文件扩展名
     %~sI        - 扩充的路径只含有短名
     %~aI        - 将 %I 扩充到文件的文件属性
     %~tI        - 将 %I 扩充到文件的日期/时间
     %~zI        - 将 %I 扩充到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩充到
                   空字符串
可以组合修饰符来得到多重结果:
     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
                   到找到的第一个驱动器号和路径。
     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR[/quote]
这个很多人看不懂,其实%~i ,i是指一任意一个参数 0,1,2,3……等,比如获取自身的路径,就可以用%~dp0,%~z0,获取自身的大小,而其,这些参数也可以进行拖放操作,拖放进入的第一个文件就是%~1了,以此类推……
实例:
将一个文件拖放到一个批处理中,要获得该文件的文件名,大小等可以用这个批处理[code]@echo off
echo 文件名为:%~n1
echo 文件扩展名为:%~x1
echo 文件全名为:%~nx1
echo 文件路径为:%~f1
echo 文件修改时间为: %~t1
echo 文件所在盘符为: %~d1
echo 文件目录为:%~dp1
echo 文件属性为: %~a1
echo 文件大小为:%~z1字节
pause[/code]怎么样,这个例子足够你理解%~i的作用了吧,呵呵,很好,很强大!
暂时想到这几个常用的经典语法技巧,其他的希望各位网友能补充,呵呵

『寂寞雨夜』 发表于 2008-4-30 21:39

顶下 慢慢看了  本人是一新手需要比较简单的例子可以给几个不

youxi01 发表于 2008-4-30 22:31

对楼上观点提几个“看法”
1、经典语法一中别让新手产生误会,利用重复ver命令来实现延时有优点,但也有其缺点,它是以牺牲电脑资源为代价的(但是利用它做出来的动画更象动画,呵呵)

2、经典语法四,别人的办法未必是笨办法,楼上提出的方法也是以牺牲效率和资源为代价的。

葱头 发表于 2008-4-30 23:52

不明白~~~~~~~~~~~~~~~~~~~~~~~~~~

xzhong19856 发表于 2008-6-2 18:58

一新手,不明天!min:~0,-2!是啥玩意,只知道~是不要引号,!!是环境变量扩展中所用的,但合起来是啥玩意啊

xouou_53320 发表于 2008-8-14 21:49

学习一下  谢谢楼主分享

konghero 发表于 2009-8-26 15:36

基本没看懂.....还是选看最基本的.....

canyuexiaolang 发表于 2009-8-28 07:37

for的选项语法
看不懂

keen 发表于 2009-8-28 10:15

回复 8楼 的帖子

请参看for语句从入门到精通:
[url]http://www.bathome.net/thread-2189-1-1.html[/url]

canyuexiaolang 发表于 2009-8-28 11:48

回复 9楼 的帖子

谢谢哈~~我学习学习
我是个FOR白痴(— —)
技术组成员我这辈子别想考了[code]能熟练使用FOR语句[/code]

5566ljlj 发表于 2009-10-17 22:18

学习学习啦!!!!!!

Seter 发表于 2009-10-17 23:32

同意youxi大的第二说..为什么a b c d...是笨办法呢?这个办法效率高啊!
不过还是顶!

小河都江堰 发表于 2013-1-11 18:27

[color=Green]容俺慢慢消化,谢谢。[/color]

tt-xb 发表于 2014-1-12 10:57

路漫漫其修远兮

学习批 发表于 2015-4-26 09:44

很好,但是不懂

MCRGZN 发表于 2015-8-13 14:41

不错不错不错不错不错

MCRGZN 发表于 2015-8-13 14:41

不错不错不错不错不错

winload 发表于 2015-10-8 10:45

实用,挺经典的说

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.