bat脚本(四)

六、用7-ZIP实现命令行压缩和解压功能

语法格式:(详细情况见7-zip帮助文件,看得头晕可以跳过,用到再学)
7z <command> [<switch>...] <base_archive_name> [<arguments>...]

7z.exe的每个命令都有不同的参数<switch>,请看帮助文件
<base_archive_name>为压缩包名称
<arguments>为文件名称,支持通配符或文件列表

其中,7z是至命令行压缩解压程序7z.exe,<command>是7z.exe包含的命令,列举如下:

a: Adds files to archive. 添加至压缩包
a命令可用参数:
  -i (Include)
  -m (Method)
  -p (Set Password)
  -r (Recurse)
  -sfx (create SFX)
  -si (use StdIn)
  -so (use StdOut)
  -ssw (Compress shared files)
  -t (Type of archive)
  -u (Update)
  -v (Volumes)
  -w (Working Dir)
  -x (Exclude) 

b: Benchmark 

d: Deletes files from archive. 从压缩包中删除文件
d命令可用参数:
  -i (Include)
  -m (Method)
  -p (Set Password)
  -r (Recurse)
  -u (Update)
  -w (Working Dir)
  -x (Exclude) 

e: Extract解压文件至当前目录或指定目录
e命令可用参数:
  -ai (Include archives)
  -an (Disable parsing of archive_name)
  -ao (Overwrite mode)
  -ax (Exclude archives)
  -i (Include)
  -o (Set Output Directory)
  -p (Set Password)
  -r (Recurse)
  -so (use StdOut)
  -x (Exclude)
  -y (Assume Yes on all queries) 

l: Lists contents of archive.
t: Test 
u: Update 

x: eXtract with full paths用文件的完整路径解压至当前目录或指定目录
x命令可用参数:
  -ai (Include archives)
  -an (Disable parsing of archive_name)
  -ao (Overwrite mode)
  -ax (Exclude archives)
  -i (Include)
  -o (Set Output Directory)
  -p (Set Password)
  -r (Recurse)
  -so (use StdOut)
  -x (Exclude)
  -y (Assume Yes on all queries) 




七、调用VB******程序

使用 Windows 脚本宿主,可以在命令提示符下运行脚本。C******.exe 提供了用于设置脚本属性的命令行开关。


用法:C****** 脚本名称 [脚本选项...] [脚本参数...]

选项:
//B         批模式:不显示脚本错误及提示信息
//D         启用 Active Debugging
//E:engine  使用执行脚本的引擎
//H:C****** 将默认的脚本宿主改为 C******.exe
//H:W****** 将默认的脚本宿主改为 W******.exe (默认)
//I         交互模式(默认,与 //B 相对)
//Job:xxxx  执行一个 WSF 工作
//Logo      显示徽标(默认)
//Nologo    不显示徽标:执行时不显示标志
//S         为该用户保存当前命令行选项
//T:nn      超时设定秒:允许脚本运行的最长时间
//X         在调试器中执行脚本
//U         用 Unicode 表示来自控制台的重定向 I/O


“脚本名称”是带有扩展名和必需的路径信息的脚本文件名称,如d:\admin\vb******s\chart.vbs。
“脚本选项和参数”将传递给脚本。脚本参数前面有一个斜杠 (/)。每个参数都是可选的;但不能在未指定脚本名称的情况下指定脚本选项。如果未指定参数,则 C****** 将显示 C****** 语法和有效的宿主参数。




八、将批处理转化为可执行文件:

由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。
小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。

这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:Bat2Com
FileName,这样就会在同一目录下生成一个名为FileNme.com的可执行文件,执行的效果和原来的.bat文件一样。

九、时间延迟

本条参考引用[英雄]教程
什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
延迟的应用见下节:“模拟进度条”。
1、利用ping命令延时
例:
  @echo off
  echo 延时前:%time%
  ping /n 3 127.0.0.1 >nul
  echo 延时后:%time%
  pause 
解说:用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip(127.0.0.1)。127.0.0.1可简写为127.1。“>nul”就是屏蔽掉ping命令所显示的内容。

2、利用for命令延时
例:
  @echo off
  echo 延时前:%time%
  for /l %%i in (1,1,5000) do echo %%i>nul
  echo 延时后:%time%
  pause
解说:原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。

3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内

例:
    @echo off
    echo %time%
    call :delay 5000
    echo %time%
    pause
    exit

    :delay
    echo W******.Sleep %1>delay.vbs
    C****** //B delay.vbs
    del delay.vbs
    goto :eof

运行显示:
10:44:06.45
10:44:11.95
请按任意键继续. . .

上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。误差在一秒之内。


4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内

仅用批处理命令就可以实现延迟操作。

例:

@echo off
set /p delay=请输入需延迟的毫秒数:
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
echo 程序开始时间:%NowTime%
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
::读取起始时间的分钟数
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将起始时间的秒数转为毫秒
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
:: 读取现在时间的分钟数
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将现在时间的秒数转为毫秒
set /a TotalTime+=(%minute2%-%minute1%+60)%`*60000+%second2%-%second1%
if %TotalTime% lss �lay% goto delay_continue
echo 程序结束时间:%time%
echo 设定延迟时间:�lay%毫秒
echo 实际延迟时间:%TotalTime%毫秒
pause

运行显示:

   请输入需延迟的毫秒数:6000
   程序开始时间:15:32:16.37
   程序结束时间:15:32:22.37
   设定延迟时间:6000毫秒
   实际延迟时间:6000毫秒
   请按任意键继续. . .

实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。

误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。
      经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。

为了方便引用,可将上面的例子改为子程序调用形式:

@echo off
echo 程序开始时间:%Time%
call :delay 10
echo 实际延迟时间:%totaltime%毫秒
echo 程序结束时间:%time%
pause
exit

::-----------以下为延时子程序--------------------
:delay
@echo off
if "%1"=="" goto :eof
set DelayTime=%1
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
set /a TotalTime+=(%minute2%-%minute1%+60)%`*60000+%second2%-%second1%
if %TotalTime% lss �layTime% goto delay_continue
goto :eof






十、模拟进度条

下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。

@echo off
mode con cols=113 lines=15 &color 9f
cls
echo.
echo  程序正在初始化. . . 
echo.
echo  ┌──────────────────────────────────────┐
set/p=  ■<nul
for /L %%i in (1 1 38) do set /p a=■<nul&ping /n 1 127.0.0.1>nul
echo   100%%
echo  └──────────────────────────────────────┘
pause

解说:“set /p a=■<nul”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。“ping /n 0 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。


十三、变量嵌套 与 命令嵌套

    和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。

先复习一下前面的“字符串截取”的关键内容:

**********************************************
截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。

百分号如果需要当成单一字符,必须写成%%

以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。

比如设变量word为“abcdefghij”,变量num为“123456789”
%word:~4,1%为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
%word:~%num:~3,1%,1% 经测试这种写法不能正确执行,写成%word:~(%num:~3,1%),1%同样不行,那么,怎么实现这种变量嵌套呢?这就必须结合命令嵌套。

什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。

例:用call语句实现命令嵌套
@echo off
set str1=aaa echo ok bbb
echo 初始字符串:%str1%
echo 生成命令字符串如下:
echo %str1:~4,7%
echo 运行命令字符串生成最终结果为:
call %str1:~4,7%
pause

运行显示:
初始字符串:aaa echo ok bbb
生成命令字符串如下:
echo ok
运行命令字符串生成最终结果为:
ok
请按任意键继续. . .  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值