windows批处理基础

第一章 批处理基础
1.常用命令简介
(1)REM和::
REM为注释命令,用来加注释,REM 和 ::
REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。
其次, :: 也可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意:
第一, 任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。
有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
第 二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。
(2)echo和@七大用法
i.
@放命令前会关闭命令的回显,无论echo是否打开

ii.echo on 会打开回显功能,其实就是将其中的每一个命令都显示出来执行,有点类似在command window里执行sql
echo off 关闭回显,自身关闭 则使用@echo off
iii.直接显示echo当前的状态,echo
iv.echo 输出提示信息
v.直接在dos命令框下输入echo off, 会关闭当前位置的显示,直接留下光标,但命令还是会正确处理的,echo on 采才会复原
vi.echo.会返回一个回车,echo和.之前不能有空格,否则.会被当成文本输出
vii.新建文件或向文件中追加内容
echo 内容>文件名 //新建文件 eg:echo @echo off>autoBat.bat
echo 追加内容>>文件名 //追加内容 echo echo 这是自动批处理 >>autoBat.bat
(3)pause停止系统命令的执行,并显示之后的提示信息
(4)errorlever 查看返回码,默认为0,出错会设置其为1
eg:echo %errorlever% 查看
(5)title 标题 设置当前dos窗口的标题
(6)COLOR [背景色前景色] 设置当前颜色
eg : color 1e
数值颜色如下:每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色,1 = 蓝色 9 = 淡蓝色,2 = 绿色 A = 淡绿色,3 = 湖蓝色 B = 淡浅绿色,4 = 红色 C = 淡红色,5 = 紫色 D = 淡紫色,6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
(7)goto和:表示跳转到:xxx的位置

eg   :start 
 if 3 leg 10 goto start //跳转到start位置

(8)find 在文件中查找字符
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] “string” [[drive:][path]filename[ …]]
/V 显示所有未包含指定字符串的行。/C 仅显示包含字符串的行数。/N 显示行号。/I 搜索字符串时忽略大小写。
(9)start命令 批处理中调用外部命令并在新的dos窗口中执行,外部命令的执行与批处理脚本完全独立
eg:start explorer D:\打开d盘
(10)call命令可以在批处理执行过程中调用另外一个批处理,当另一个执行完后,在接着执行原来的
格式 call path filename.bat/.cmd; call:label 参数 以命令goto:eof结尾
eg:以下代码的作用从结果上看就是展示文件的一些扩展属性。如路径等

@echo off
Echo 产生一个临时文件 > tmp.txt
Rem 下行先保存当前目录,再将c:\windows设为当前目录
pushd c:\windows
Call :sub tmp.txt
Rem 下行恢复前次的当前目录
Popd
Call :sub tmp.txt
pause
Del tmp.txt
exit
:sub
Echo 删除引号: %~1
Echo 扩充到路径: %~f1
Echo 扩充到一个驱动器号: %~d1
Echo 扩充到一个路径: %~p1 
Echo 扩充到一个文件名: %~n1
Echo 扩充到一个文件扩展名: %~x1
Echo 扩充的路径指含有短名: %~s1 
Echo 扩充到文件属性: %~a1 
Echo 扩充到文件的日期/时间: %~t1 
Echo 扩充到文件的大小: %~z1 
Echo 扩展到驱动器号和路径:%~dp1
Echo 扩展到文件名和扩展名:%~nx1
Echo 扩展到类似 DIR 的输出行:%~ftza1
Echo.
Goto :eof

在这里插入图片描述
(11)pushd path 保存当前目录,并切换当前目录为path,popd 回复当前目录为刚才保存的目录

eg: pushd D:\svn  进入这个目录,然后popd 又恢复到上一个目录 

(12)shift 更改批处理中参数的位置
SHIFT [/n]
如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。

eg:SHIFT /2  //会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。

(13)if
i if[not] errorlevel number command
if errorlevel必须放命令后面,上一个命令执行的结果如果大于等于number,则执行该if的语句,number的范围是0-255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立
eg:暂时没有试出来失败的情况

@echo off
echo 即将开始。。。。
rem 退出代码为>=1则跳值标题1处,>=0调至标题0处
if  errorlevel 1 goto 1
if errorlevel 0 goto 0
rem 不可更换位置,否则失败了也显示成功

:1
echo 执行成功 !,跳转至成功退出
goto pause

:0
echo 执行失败!,跳转至失败退出
goto pause

:pause
pause

ii. if [NOT] {string1}{string2} command,if [NOT] [string1][string2] command
if [NOT] "string1"“string2” command 两个字符串相等则执行后面相应的命令,以上的写法是为了避免左右空格的影响,但是会将括号(引号)也当成字符串,例如:{pp}[pp]?这个就是false,例子见14
iii.if[not] exist filename command 判断文件存在时执行命令

14.如果写在后面的程序段没有被调用的话,还是会自己执行的,比如下面的:w虽然没有goto跳转到那里,但是还是在:0执行完后会执行:w程序段的

@echo off
echo 即将开始。。。。
rem 退出代码为>=1则跳值标题1处,>=0调至标题0处
if   [qqq]==[qqq] goto 1
rem 不可更换位置,否则失败了也显示成
:1
echo 执行成功 !,跳转至成功退出
goto p
:p
if [www]==[www] goto 0

:0
echo 执行失败!,跳转至失败退出
:w 
echo 地方大幅度
pause

15.ATTRIB 显示或更改文件属性
ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]

  • 设置属性。- 清除属性。R 只读文件属性。A 存档文件属性。S 系统文件属性。
    H 隐藏文件属性。[drive:][path][filename]指定要处理的文件属性。
    /S 处理当前文件夹及其子文件夹中的匹配文件。
    /D 也处理文件夹。
    eg: 将f盘的文件设置为只读
attrib -r F:\tree.txt /S /d

第二节 常用特殊符号
1 @命令行回显屏蔽符
2.%批处理变量引导符
引用变量 %var%
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*为命令行传递给批处理的参数
0%表示批处理文件本身

eg: copy %0 c:\windows 复制批处理文件

3 >重定向符,将命令输出重定向到文件中,会覆盖原有文件内容
4.>>将命令输出追加到文件结尾
5.命令管道符| 用法与linux中一样
6. dir 绝对路径 列出当前目录所有文件和文件夹
7 ^转义字符,将特殊符号变为普通字符;另外还可以用作续行符,即将多行字符连做一行
eg:

echo   测试 ^>1.txt,结果会原封不动的打印出echo后的内容; 
echo hero^
is^
 man  结果为 heroisman

8.&,&&,|| 组合命令,批处理认行不认命令数
跟java中的和或概念一样

eg:dir x:\&dir c:\ 即便前面执行失败也会执行后面
dir x:\&& dir c:\前面执行失败后面不再执行
dir x:\||dir c:\ 或的关系,如果第一个执行成功,后面将不再执行,否则执行后面

9 使用组合命令注意命令优先级:管道命令优先级高于重定向高于组合命令

eg: 将c和d盘的文件列出来输出到a.txt中
反例: dir c:\ &dir d:\ >a.txt 这样会先执行后面,即a.txt中就只有d盘的记录,而c盘会显示在屏幕上;
正例: dir c:\ >a.txt & dir d:\ >>a.txt d的内容追加
  1. 双引号表示字符定界符 eg :cd "d ump"
    11 ,逗号相等于空格 eg:dir,c:
    12.;分号:同一个命令,作用目标不同时,则可用分号将目标隔离开;如果有一个目标不存在也可能会继续执行,具体规则如下:
    (1)目标文件夹存在只是文件不存在,则报错文件不存在,但继续执行
    (2)目标文件夹不存在,则整个命令不执行
    14 ()括号 括号中包含多个命令,这些命令被视为一个zhengti
    eg:(echo 1 //此处必须分行,否则第一个echo会打印后面的命令
    echo 2
    echo 3) 等价于 echo 1&echo 2&echo 3
    15 ! 感叹号
    在变量延迟问题中,用来表示变量,即%var%应该表示为!var!,不理解
    第二章 DOS循环 for命令
  2. */d参数的循环表示如果set中包含通配符(和?),则与指定目录名匹配,不匹配文件,对匹配到的每一个目录名执行do命令
eg:for /d %%i in(c:\*) do echo %%i 把c盘中所有目录输出,必须放在bat文件中执行,直接dos命令下执行不了,不知道为什么
for /d %%i in(c:\Window?)do echo %%i   匹配window开头的目录并输出

2 /r参数的for循环可以递归搜索
(1)格式:FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
(2)set中如果有通配符(?或)则列举r指定目录下及其子目录所有的与set相匹配的文件,r不加路径。则默认当前路径*

eg:for /r c:\ %%i in(hosts*) echo %%i >>result.txt //在c盘搜索hosts并将结果放入文件

(3)set中如果没有通配符,则列举r后路径下所有目录及子目录

eg:for /r c:\ %%i in (hosts) echo %%i>>result.txt //列举所有c盘目录

3.参数/L 以增量的形式从开始到结束一个数字序列
格式 FOR /L %%variable IN (start,step,end) DO command [command-parameters]

eg:for  /l %%i in (5,-1,1) do echo %%i 从5降到1;
for /l %%i in(1,1,5) do echo %%i 从1加到5

4./f 用来解析文件中的每一行
FOR /F [“options”] %%variable IN (file-set) DO command [command-parameters]
FOR /F [“options”] %%variable IN (“string”) DO command [command-parameters]
FOR /F [“options”] %%variable IN (‘command’) DO command [command-parameters]

eg: 输出test.txt文件中的每一行,或者用分隔符分开输出
test.txt文件中的内容是
;注释行,这是临时文件,用完删除
11段 12段 13段 14段 15段 16段 
21段,22段,23段,24段,25段,26段
31段-32段-33段-34段-35段-36段
for /f "eol=; delims=-, tokens=1,3*" %%i in (test.txt) do echo %%i %%j %%k//因为tokens将每行按照分隔符-或者,分为了三部分,部分1,部分3,和3之后的所有,而eol表示;开头的行只是注释,不做处理,因此会有如下展示
11段  13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
eg:展示每一行
FOR /F "eol=; delims=^" %%i in (test.txt) do echo %%i  //这里因为没有用tokens分段,因此每行只有一段,自动赋值为变量%%i

第三章 for命令中的一些变量

  1. ~i 变量前面加波浪线,扩展变量为删除引号,删除规则:每行头尾成对则都删,头部没有则不删,尾部没有头部和其他位置有,则只删除头部
eg:
echo ^"1111>>test.txt
echo "23323">>test.txt
echo "332332"33232>>test.txt
echo ^"dsf"dfd">>test.txt
echo  23233323"dfd">>test.txt
FOR /F "eol=; delims=" %%i in (test.txt) do echo %%~i
  1. ~fi 即变量前面加~f扩展成完整路径名,即不管输出什么 都是扩展成为当前文件的全路径名
eg:
echo ^"dsf"dfd">>test.txt
echo  23233323"dfd">>test.txt
FOR /F "eol=; delims=" %%i in (test.txt) do echo %%~fi
结果:C:\Users\HTZ\Desktop\dsf"dfd
C:\Users\HTZ\Desktop\ 23233323"dfd"

3.del 文件名 删除文件,del 文件夹 清空文件夹
4. %~$PATH:I - 查找列在路径环境变量的目录

eg:@echo off
FOR /F "delims=" %%i IN (“notepad.exe”) DO echo %%~$PATH:i
pause

即在PATH变量指定的路径中搜索notepad.exe文件,如果有则打印全路径,否则错误提示
第四章 批处理的变量—系统变量和自定义变量
1.系统变量
1.%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
%CD% 本地 返回当前目录字符串。
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关
date 命令的详细信息,请参阅 Date。
%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用
户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是
在“本地用户和组”中指定的。
%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于
Itanium
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器的版本号。
%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)
的驱动器。
%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。
%TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。
有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关
time 命令的详细信息,请参阅 Time。
%USERDOMAIN% 本地 返回包含用户帐户的域的名称。
%USERNAME% 本地 返回当前登录的用户的名称。
%USERPROFILE% 本地 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。
2. %1~%9 表示.bat文件后面跟的第1-9个参数,即批处理文件能够带参数运行

eg: echo  %1 %2  %3
cmd运行时:test.bat 第一个参数 第二个参数 第三个参数
打印结果:第一个参数 第二个参数 第三个参数

3.%0 两层意思: echo %0 这样打印当前批处理文件的绝对路径,其实就是第0个参数,即文件本身
另一个则是循环执行某条命令:

eg:echo 这是练习脚本,搜索host文件
%0

4.自定义变量
(1)set var=value 直接在bat文件中设置值 使用 %var%
(2)set /p var=请输入值 用户输入值

eg:set /p name=请输入用户姓名:
echo 用户姓名为:%name%

变量使用的举例

@echo off
title 修复工具
color 04
echo.
echo 1.开始====
echo.
echo 2.暂停=====
echo.
echo 3.结束======
echo.
:repeate
set /p input=请选择:
if [%input%]==[1] goto start
if [%input%]==[2] goto pause
if [%input%]==[3] goto end
:start
type autoBat.bat >>a.txt
goto repeate
:pause
pause
goto repeate
:end
echo 退出=========
exit

if else条件语句
(1)

eg:
@echo off
title 修复工具
if 1 equ 2 (echo 相等
)else if 1 lss 2 (
echo 小于
) else (echo 不小于)

(2)
对于数字比较大小的命令:

EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于

(3)字符比较 /i 忽略大小写
循环语句,for和goto两种语句
进行算术运算时,我们需要给set命令加上 /a 参数,后面再跟表达式

eg:set var=0
echo ******测试循环开始了**********
:continue
set /a var+=1
echo 第%var%次循环
if %var% lss 100 ( goto continue) else (echo 循环结束======)
pause

四 子程序
子程序调用格式:
CALL :label arguments
rem %1和%2相当于给变量赋值了,另外子程序和主程序中的变量都是全局变量
eg:求四个数的加和

set /p num1=请依此输入四个数字并按回车键:
echo.
set /p num2=:
echo.
set /p num3=:
echo.
set /p num4=:
echo.         
call :son  num1 num2 num3 num4
echo 子程序返回值:%sum%
goto:eof
:son

set /a sum=%1+%2+%3+%4

goto:eof
发布了88 篇原创文章 · 获赞 5 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42410730/article/details/103250073