热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WindowsBAT批处理编写要点

批处理可以说是windows下的shell,虽然没有shell强大吧,但也足以用来完成很多任务了。这里记录了大部分的批处理用法,最后有一个调用yuicompressor压缩js/css的脚本。基础先说使用批处理要注意的几点:尽量不要将批处理要操作的文件放在不同的盘符下,所
批处理可以说是windows下的shell,虽然没有shell强大吧,但也足以用来完成很多任务了。这里记录了大部分的批处理用法,最后有一个调用yuicompressor压缩js/css的脚本。

基础
先说使用批处理要注意的几点:
尽量不要将批处理要操作的文件放在不同的盘符下,所有要处理的文件最好放在同一个目录下;
文件/夹名最好不要空格,因为批处理的命令参数一般是用空格分隔的,有空格的话,用文件名做参数容易出错;
尽量使用相对路径,不要用绝对路径;
对于要使用但又不理解的命令,一定要先查看命令的使用说明:help cmdName

一些命令 禁止命令回显
echo off 表示此语句后的所有运行的命令都不显示命令本身。
@ 与 echo off 相似,但它是加在每个命令的最前面,只作用于当前命令,表示运行时不显示这一命令。

注释
rem 用来注释。

输出信息

echo 表示显示此命令后的字符,也可以用于将命令后的字符串输出到文件,如下面所示
echo abc to file >> targetfile.txt 上面的命令将把abc to fil写到targetfile.txt。

暂停

pause 暂停执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续。

退出脚本

exit /b code 加上/b选项表示退出当前批处理脚本,而不是cmd.exe,相当于函数的return语句。code是个数字,表示执行结果。

调用其他批处理

call 用来调用另一个批处理,就像函数调用(如果不用call而直接调用别的批处理文件,那么执行完成那个批处理文件后将无法返回当前文件后续的命令)
在被调用的批处理里,%[1-9] 表示传递进来的参数,参数是指调用者在文件名后加以空格分隔的字符串。 %0 表示批处理命令本身,其他参数字符串用%1到%9表示
批处理调用示例,不带参数
call for.bat firstparamvalue

输出文件内容

type 用来输出文件内容,下面的命令输出subfor.bat文件的内容
type subfor.bat

定义变量
set 用于定义变量。

for 循环
for循环遍历一个集合并执行指定命令: FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。

for 循环遍历集合
set items=a b c d
set letters=x y z
for %%a in (%items%) do (
    for %%b in (%letters%) do (
        call subfor.bat %%a %%b
    )
)
subfor.bat
@echo off
echo echo in subfor.bat :  %1 %2

for循环处理用通配符指定的一组文件
for %%a in (*.txt) do (
    rem 如果文件名有空格,必须使用""
    rem type "%%a"
)

for 循环处理文件内容
rem 读取text.txt中的每一行作为参数%%a的值,调用循环体
for /F "delims=" %%a in (text.txt) do (
    echo %%a
)

数值范围迭代
格式: for /L %%i in (start, step, end) do cmd
for /L %%i in (1, 1, 5) do echo %%i
for 循环命令的使用比较复杂,必须认真阅读使用说明。

if语句
if语句有三种格式:
判定参数是否符合期望值:if [not] "参数" == "字符串" 待执行的命令
if "%1" == "abc 123"  (
    echo first var'value is :abc 123
) else (
    echo first var'value not excepted, it is :%1
)
判定文件是否存在:if [not] exist [路径\\文件名] 待执行的命令
if exist "abc 123.txt"  (
    echo content of file abc 123.txt is :
    type "abc 123.txt"
) else (
    echo abc 123.txt is exist .
)
call subif.bat 3
根据errorlevel来执行命令
if errorlevel <数字> 待执行的命令
返回值必须按照从大到小的顺序排列 。
    if errorlevel 3 (
        echo errorlevel is three .
    ) else if errorlevel 2 (
        echo errorlevel is two .
    ) else if errorlevel 1 (
        echo errorlevel is one .
    ) else (
        echo execute success .
    )
subif.bat
@echo off
if "%1" == "" (
    rem 加上/b选项表示退出当前批处理,而不是退出cmd.exe
    exit /b 0
) else (
    exit /b %1
)

goto 语句
goto语句可以结合标签进行跳转。
标签就是用冒号加单词定义,单独放在一行如: :labelName
@echo off
if "%1" == "" (
    goto default
) else if "%1" == "helloworld" (
    goto helloworld
)
:default
echo you come to default .
goto end
:hellowrold
echo why you come to hello world ?
goto end
:end

一个输出系统命令帮助文档的脚本
createHelp.bat 此脚本可以输出系统命令的帮助文档。
@echo off
set cmds=FIND SORT DISKPART
for /F "usebackq" %%i in (`help`) do (
    for %%a in (%cmds%) do (
        if not "%%a" == "%%i" (
            help "%%i" > help/%%i-help.txt
        )
    )
)

一个文件处理的示例
以xml为例,增加字符串处理示例。config.xml文件:

www.google.com.kh
8080


dealContent.bat
@echo off
rem 把config.xml里的127.0.0.1替换成www.google.com.kh
if exist config_tmp.xml del config_tmp.xml
rem 使用for循环命令读取文件内容时,先从文件里读取一行,然后用默认的分隔符对行进行划分,再用得到的每一项调用循环体
rem 所以要处理的文件的行最好不要有空格或tab
for /F %%i in (config.xml) do (
    rem 如果项是xml的标签,要对转义
    if %%i == ^127.0.0.1^^> (
        rem >>前面是没有空格
        echo ^www.google.com.kh^^>>> config_tmp.xml
    ) else (
        echo %%i>> config_tmp.xml
    )
)
del config.xml
ren config_tmp.xml config.xml

字符串处理
主要是字符串截取、替换,通过替换删除指定字符串:

字符串拼接
语法:newStr=%str1%%str2%
set str1=abc
set str2=123
set newStr=%str1%%str2%
echo %newStr%

字符串截取
语法:%var:~x,y% (x,y∈Z), 说明:
当x为正数时表示从左到右第x+1位开始截取,当x为负数时表示从右到左第x位开始截取(右一位是-1)
当省略x时采用默认值0;
当y为正数时表示截取的长度,当y为负数时表示截取到从右到左的第y+1位,当省略y时采用默认值-1。
set src=abc  123 456
set trunk=%src:~2,4%
echo %trunk%
echo %src:~-5,4%

字符串替换
语法:%var:str1=str2%
说明:将字符串var中所有的str1替换为str2
echo %src:123=789%
替换功能也可以用于完成删除操作,只需要替换为空就行了。
删除字符串里的空格
set str5=abc 123 4 5 6 7 8
echo %str5: =%
删除字符串里的tab
echo %str5: =%

特殊标记符:
CR(0D)      命令行结束符
Space(20)   空格,常用的参数界定符
Tab(09)     不常用的参数界定符
+           命令文件连接符
*, ?        文件通配符
""          字符串界定符
^           转义符,其后面的特殊字符按原样输出
|           命令管道符
, >>    文件重定向符
@           命令行回显屏蔽符
/           参数开关引导符
:           批处理标签引导符
%           批处理变量引导符

组合命令: &
Usage: 第一条命令 & 第二条命令 [& 第三条命令...]
同时执行多条命令,而不管命令是否执行成功。
&&
Usage: 第一条命令 && 第二条命令 [&& 第三条命令...]
同时执行多条命令,当碰到执行出错的命令将不执行后面的命令,如果一直没有出错则一直执行完所以命令。
||
Usage: 第一条命令 || 第二条命令 [|| 第三条命令...]
同时执行多条命令,当碰到执行正确的命令将不执行后面的命令,如果一直没有出现正确执行的命令则一直执行完所以命令。

| 管道命令
Usage: 第一条命令 | 第二条命令 [| 第三条命令...]
将第一条命令的结果作为第二条命令的参数来使用
sample: netstat -n -p tcp | find "49194"

重定向
>, >>, 输出重定向命令
将一条命令或某个程序输出结果重定向到特定文件中。> 与 >> 的区别在于:
> 会清除原有文件中的内容后写入指定文件,
>> 只会追加内容到指定文件中,而不会改变其中的内容。
<, >&, <&
<从文件中而不是键盘中读入命令输入。
>& 将一个句柄的输出写入到另一个句柄的输入中。
<& 从一个句柄读入输入并将其写入到另一个句柄输出中。

set 命令进阶 说明
set [[/a [expression]] [/p [variable=]] string]
参数说明
/a :  将string设置成可求值的数字表达式
/p :   将variable的值设置成输入行
variable : 指定需要设置或修改的变量
string :  指定要与变量关联的字符串
/? : 在命令提示符显示帮助

数字表达式求值(使用/a)
rem set /a expression, set的/a参数就是让set可以支持数学符号进行数学运算,数值默认是10进制,前缀0x表示十六进制,0表示八进制数字。
按优先级从高到低:
运算符             执行的操作
()                 分组
+-*/%              算法
<<  >>             逻辑移位
& | ^              位运算
+ += -= *= /= %= &= ^= |= <<= >>= 赋值
,                  表达式分隔符
如果使用逻辑(&|)或模(%)运算符,要用引号将表达式字符串引起来。表达式中的非数字字符串将被视为环境变量名
(运行对环境变量进行算术运算,而不需要使用%),其值将被转化成数字然后进行处理。如果指定的当前环境中
没有定义的环境变量名,将会分配零值。

提供交互界面(使用/p)
set /p var=请输入变量的值:
echo %var%

变量增强
用 if [not] defined variable 可以判断变量是否有内容

环境变量
如果没有任何参数,set命令将显示当前环境变量
当指定变量和字符串的值时,指定的变量值将被添加到该环境,而且该字符串与该变量关联。如果环境中已存在该变量,新的字符串值将替代旧的字符串值。
如果只为set命令指定一个变量和一个等号(没有字符串),则与该变量关联的字符串值将被消除(就像变量根本不存在一样)

延迟环境变量说明与启用
延迟环境变量扩展的功能,即变量延迟解析功能。此功能默认是停用的,可以谈过cmd.exe /V 或
setlocal EnableDelayedExpansion来开启。使用延迟变量时需要用”!”括起。

动态环境变量
变量        说明
%CD%                扩充为当前目录
%DATE%              扩充为当前日期
%TIME%              扩充为当前时间
%RANDOM%            扩充为0到32767的随机数
%ERRORLEVEL%        扩充为当前命令处理器命令扩展版本号
%CMDCMDLINE%        扩充为调用命令处理器的原始命令行,即控制台路径

变量增强(文件名路径处理)
变量          说明
%~I            扩充%I为删除外围"引号(有就删)
%~fI           扩充%I为一个完整的路径
%~dI           仅扩充%I为一个驱动器号
%~pI           仅扩充%I为一个路径
%~nI           仅扩充%I为一个文件名
%~xI           仅扩充%I为一个文件扩展名
%~sI           扩充%I为完整的短命路径
%~aI           扩充为文件的属性(arsh)
%~$PATH:I      变量可以是其他的,如:windDir、programfiles等在环境变量PATH指定的路径总搜索文件,扩充%I为找到的第一个文件的完整路径;若未找到文件,则扩充%I为空。
组合扩展参数效果:
%~dpI:     仅扩充%I为驱动器号和路径
%~nxI:     仅扩充%I为文件名加扩展名
%~fsI:     扩充%I为完整的短名路径(%~sI)

用批处理调用yuicompressor压缩js、css的脚本
@echo off
setlocal enabledelayedexpansion
set pwd=%CD%
set srcDir=%pwd%\testcompress
set dstDir=%pwd%\testcompressres
del /F /Q /S %dstDir%\*
for /R %srcDir% %%D in (*) do (
    set pth=%%~dpD
    set pth=!pth:%srcDir%=%dstDir%!
    set fname=%%~nD
    set ext=%%~xD
    if not exist !pth!  mkdir !pth!
    set dst=!pth!!fname!!ext!
    if /I "!ext!" == ".css" (
        java -jar yuicompressor-2.4.7\build\yuicompressor-2.4.7.jar --charset utf8 --type css -o !dst! %%D
    ) else if "!ext!" == ".js" (
        java -jar yuicompressor-2.4.7\build\yuicompressor-2.4.7.jar --charset utf8 --type js  -o !dst! %%D
    )
)


推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
author-avatar
mobiledu2502853587
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有