bat文件:命令、参数、符号、常见问题

bat文件:命令、参数、符号、常见问题

编写冲忙,容下周更新完善

命令

基础的命令有:

流程命令:for、if
for参考网址
https://blog.csdn.net/qiuzhi__ke/article/details/78422424
https://blog.csdn.net/u013514928/article/details/79629937
https://blog.csdn.net/Victor2code/article/details/103555832

eol/tokens/delims: https://blog.csdn.net/u011334457/article/details/86223757
token详解:          https://www.cnblogs.com/Jian-Zhang/p/6066429.html
eol\skip用法:       http://www.jquerycn.cn/a_8759
rem ********************************************
rem ***  	          for命令                ***
rem ********************************************
#基础for循环:提取元素
#for语句依次提取command1中的每一个元素,把它的值赋予形式变量I,带到do后的command2中参与命令的执行,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔
#for %%I in (command1) do command2    简单来说就是:for 形式变量 in (元素) do 命令
#示例:
rem 输出ABC
for  %%I in (ABC) do echo %%I
rem 输出A,B,C
for  %%I in (A,B,C) do echo %%I
for  %%I in (A B C) do echo %%I

rem ********************************************
rem ***              for /L命令               ***
rem ********************************************
#高级for循环:使用/L:数字序列,指定循环次数
FOR /L %variable IN (start,step,end) DO command [command-parameters]
#示例:
rem 新建5个文件夹,文件夹名称依次为1、3、5、7、9
for /l %%i in (1,2,10) do md %%i

rem ********************************************
rem ***             for /f命令                ***
rem ********************************************
#高级for循环:使用/F:处理字符串,对应字符串(一行字符串)、文件内容(多行字符串)、命令结果(多行字符串)
rem FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
rem FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
rem FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

简单来说就是:for /f ["options"] 形式变量 in (set) do 命令

rem options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合
rem eol=c 忽略以某字符开头的行
rem skip=n 忽略前N行
rem delims=, 以中文逗号作为分隔符
rem tokens=1 提取第一列,通俗讲,提取每一行的第m小节的内容
(一行对应一条字符串,一条字符串依据分隔符分为多个子字符串,token的值对应的就是第几个子字符串)

rem 要么(set)直接就是一个字符串;
rem 要么(set)就是几个文件,会将文件内容读取出来做为多行字符串来处理;
rem 要么(set)是一个命令,会将命令的结果做为多行字符串进行处理;

#示例:默认以空格作为分隔符
rem (set)是一个字符串
for /f %%a in ("life is wonderful") do echo %%a
for /f "tokens=1,2,3" %%a in ("a b c") do echo echo %%a+%%b+%%c

rem (set)就是几个文件
for /f %%a in (temp1.txt temp2.txt) do echo %%a
for /f %%a in (temp1.txt,temp2.txt) do echo %%a
for /f "tokens=1,2,3" %%a in (temp1.txt temp2.txt) do echo %%a

rem (set)是一个命令
for /f %%a in ('dir /b') do echo %%a

rem ********************************************
rem ***  	           if命令                ***
rem ********************************************

if "%1"=="/a" echo 第一个参数是/a
if /i "%1" equ "/a" echo 第一个参数是/a
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?

if exist c:test.bat echo 存在c:test.bat文件

if not exist c:windows (
echo 不存在c:windows文件夹
)

if exist c:test.bat (
echo 存在c:test.bat
) else (
echo 不存在c:test.bat
)
调用命令:start、call、goto
rem ********************************************
rem ***  	         start命令               ***
rem ********************************************

rem 运行某些程序,路径中带有空格需要用""括起来
rem 写绝对路径
start "" "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"

rem 写绝对路径
start "" "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" "http://www.baidu.com"

rem start+空格+/d+空格+目录路径+空格+程序名   start /d patch *.*
start /d "" "C:\Program Files (x86)\Microsoft\Edge\Application" msedge.exe

rem 加了/d 参数以后就是运行/d 后面的指定目录
start /d "" "C:\Program Files (x86)\Microsoft\Edge\Application" msedge.exe "http://www.baidu.com"

rem 弹出新黑窗口
start
start ""
start cmd

rem 打开应用
start calc
start msedge

rem 不可以加引号,并且不允许存在空格
start http://www.baidu.com
start http://http://localhost:8080/shidu/power/login?code=张三01


rem ********************************************
rem ***  	         call命令                ***
rem ********************************************

rem 基本应用:调用另一个批处理程序,并且不终止父批处理程序
call a.bat

rem 调用标签
call :label
echo 1
echo 2

:label
echo 3
echo 4

rem 执行结果
3
4
1
2
3
4

rem call7
echo %1 %2
echo %3

rem call8
call call7.bat hello world 123
pause

rem 执行结果
hello world
123
请按任意键继续...


rem ********************************************
rem ***  	         goto命令                ***
rem ********************************************

rem goto
goto label
echo 1
echo 2
 
:label
echo 3
echo 4

rem 执行结果
3
4

rem 编写test.bat脚本
@echo off
if "%1"=="t" goto _A
if not "%1"=="t" goto _B
:_A mkdir c:\Users\Administrator\Desktop\A
pause & exit
:_B mkdir c:\Users\Administrator\Desktop\B
pause

rem 建立一个文件名为: A 的文件夹
test.bat t  

rem 建立一个文件名为: B 的文件夹
test.bat g 
设置命令:set、chcp、cd、setlocal、endlocal
rem ********************************************
rem ***  	         set命令                 ***
rem ********************************************

rem 显示目前所有可用的变量,包括系统变量和自定义的变量
set

rem 设置变量,并赋值
set p=aaabbbccccddd

rem 显示变量p代表的字符串
echo %p%

rem 显示变量p中第6个字符以后的所有字符,即cccddd
echo %p:~6%

rem 显示第6个字符以后的3个字符,即ccc
echo %p:~6,3%

rem 显示前3个字符,即aaa
echo %p:~0,3% 

rem 显示最后面的2个字符,即dd
echo %p:~-2%

rem 显示除了最后2个字符以外的其它字符,即aaabbbcccd
echo %p:~0,-2% #

rem 用c替换变量p中所有的aaa,即显示cbbbcccddd
echo %p:aaa=c%

rem 将变量p中的所有aaa字符串置换为空,即显示bbbcccddd
echo %p:aa=%

rem 第一个bbb及其之前的所有字符被替换为d,即显示dcccddd
echo %p:*bbb=d%

rem 设置变量p,赋值为 %p:*bb=c% ,即cbcccddd
set p=%p:*bb=c%

rem 设置p为数值型变量,值为39
set /a p=39

rem 支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
set /a p=39/10 

rem 用 /a 参数时,在 = 后面的变量可以不加%直接引用
set /a p=p/10 

rem ”与”运算,要加引号。其它支持的运算符参见set/?
set /a p="1&0"

rem 取消p变量
set p=

rem 屏幕上显示”请输入”,并会将输入的字符串赋值给变量p注意这条可以用来取代 choice 命令
set /p p=请输入

rem 注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
@echo off
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo %p%
)

rem 结果将显示
aaa
aaa
rem 因为在读取 if 语句时已经将所有 %p% 替换为aaa
rem 这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
rem 可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!


@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo !p!
)
ENDLOCAL

rem 结果将显示
aaa
bbb

rem 还有几个动态变量,运行 set 看不到
rem 代表当前目录的字符串
%CD%

rem 当前日期
%DATE%

rem #当前时间
%TIME% 

rem 随机整数,介于0~32767
%RANDOM% 

rem 当前 errorlevel 值
%ERRORLEVEL% 

rem 当前命令处理器扩展名版本号
%CMDEXTVERSION% 

rem 调用命令处理器的原始命令行
%CMDCMDLINE% 

rem 可以用echo命令查看每个变量值,如 echo %time%
rem 注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到


rem ********************************************
rem ***  			 chcp命令                ***
rem ********************************************
查询网址:https://blog.csdn.net/hnlgzb/article/details/81911824
65001   UTF-8代码页

950    繁体中文

936    简体中文默认的GBK

chcp 65001

chcp 936


rem ********************************************
rem ***  			 cd命令                  ***
rem ********************************************

rem 目录切换:切换到同一分区下不同的目录
cd [盘符][路径]

rem 目录切换:返回到当前目录
cd .

rem 目录切换:返回到上一层目录
cd ..

rem 目录切换:返回根目录
cd \

rem 目录切换:不同分区的切换,/d 更改当前驱动器或当前目录
cd /d [盘符][路径]

rem 目录切换:不同分区的切换:盘符:
D:

rem 显示当前的完整路径  %cd%
echo 当前路径是%cd%

rem 创建一个文件
cd> 123.txt


rem ********************************************
rem ***  	   setlocal 和 endlocal          ***
rem ********************************************


rem setlocal 和 endlocal
rem 设置”命令扩展名”和”延缓环境变量扩充”

rem 启用"命令扩展名"
SETLOCAL ENABLEEXTENSIONS

rem 停用"命令扩展名"
SETLOCAL DISABLEEXTENSIONS

rem 启用"延缓环境变量扩充"
SETLOCAL ENABLEDELAYEDEXPANSION

rem 停用"延缓环境变量扩充"
SETLOCAL DISABLEDELAYEDEXPANSION 

rem 恢复到使用SETLOCAL语句以前的状态
ENDLOCAL

“命令扩展名”默认为启用,“延缓环境变量扩充”默认为停用
批处理结束系统会自动恢复默认值
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。
所以用到"命令扩展名"的程序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,
以确保程序能在其它系统上正确运行
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程


文件命令:type、copy、ren、【md、rd、dir、path、tree、del】
rem ********************************************
rem ***  			type命令                 ***
rem ********************************************

rem 在屏幕上打印出文本文件的内容
type 123.txt 

rem 显示一页的内容
type 123.txt | more

rem 获取含有关键字信息的部分内容
type 123.txt | findstr 关键字

rem 使用/i表示忽略关键字字母的大小写
type 123.txt | findstr /i 关键字

rem 一次性打印多个文件内容
type *.txt 

rem 创建一个文件
type > 123.txt

rem 将所有的txt文件合并成一个文件
type *.txt > 123.txt

rem 将不同类型的文件合并成一个文件
type *.txt *.bat> 123.doc


rem ********************************************
rem ***  			copy命令                 ***
rem ********************************************

rem 在拷贝文件时重命名
copy 123.txt 321.txt

rem 复制一个文本文件到指定目录
copy 123.txt D:\test

rem 复制多个文本文件到指定目录
copy *.txt D:\test

rem 利用copy合并多个文本文件
copy 1.txt+2.txt+3.txt all.txt

rem 创建文件,并通过键盘输入文本内容
copy con 123.bat
Enter键:换行
F6键+Enter键:退出

rem 由于使用了参数/b,所以文件sw.bin的长度是前面两者的和(此命令没有测试过,不知道真假)
copy suback /b+w98setup /b sw.bin


rem ********************************************
rem ***  	         ren命令                 ***
rem ********************************************

rem ren是“rename(重命名)”的简写
rem 修改文件后缀名:ren [path] <old filename> <new filename>
ren *.png *.jpg
::允许使用通配符更改一组文件名或扩展名

rem ren的高级用法:ren 完整文件名 *字符
rem 此处的*表示原文件名开头通配至指定字符前的全部字符
ren abc.txt *.doc 得 abc.doc
ren 10.pdf *p.c 得 10.p.c
ren 10.pdf *d.c 得 10.pd.c
ren 10.pdf *1p.c 得 1p.c
ren 10.pdf *mm.c 得 10.pdfmm.c

ren 2000.pdf ?f.pdr 得 2f.pdr
ren 2000.pdf ???f.pdr 得 200f.pdr
ren 2000.pdf ????????f.pdr 得 2000f.pdr
发现这样的现象,总结
当用?来作为通配符时,会对原文件名依?号的个数来截取,原因一个?只能代替一个字符,但当?的个数大于原文件名字符数时,将全部截取原文件名但不截取文件后缀名
rem ren支持*和?这两个通配符:*表示任意多个字符,?表示一个字符
rem 对于文件夹,ren同样适用。
其他命令:echo、rem、pause、cmd
rem ********************************************
rem ***  	         echo命令                 ***
rem ********************************************

rem 显示回显状态:关闭|打开
echo

rem 输出一个空行
echo.

rem 打印出变量的值:echo 变量
echo %cd%

rem 打印出要输出的信息,如果信息中有空格,请一定要加上双引号
echo "江山 美如画"

rem 打印很多行,可以使用&符连接
echo 这是第一行 & echo 这是第二行 & echo 这是第三行 

rem 将信息直接输出到文件中
rem 文件如果不存在,就会创建一个新的文件,然后将内容写入其中
rem 将新的信息覆盖掉文件中原有的内容
echo 信息 > 文件

rem 将新的信息追加到文档后
echo 信息 >> 文件

rem 创建一个文件
echo > 文件
echo >> 文件

rem 从下一行开始关闭回显
echo off

rem 从下一行开始打开回显
echo on


rem 从本行开始关闭回显
@echo off

rem 答复命令中的提问
echo Y|rd /s c:\abc

rem ********************************************
rem ***  	        注释命令                 ***
rem ********************************************

rem 和 ::
rem 注释行不执行操作

rem ********************************************
rem ***  	         pause命令               ***
rem ********************************************

rem 暂停命令
pause 就是暂停命令,执行时会在命令行窗口显示“请按任意键继续. . .”并等待你按键。
pause > nul的作用是同样的,区别是不显示“请按任意键继续. . .”这些字,nul相当于空文件,把这些文字隐去了。同样是等待你按键。后面的命令往往用于批处理,自己用echo命令显示提示信息,不显示“请按任意键继续. . .”这些默认的字符。例如:

echo 文件已经成功执行,请按任意键退出!
pause >nul

rem ********************************************
rem ***  	         cmd命令               ***
rem ********************************************

rem 参数: [Drive:][Path] FileName  指定要调用的批处理程序的位置和名称。Filename 参数必须是.bat 或 .cmd 扩展名的类型文件。

cmd /c dir 是执行完dir命令后关闭命令窗口。

cmd /k dir 是执行完dir命令后不关闭命令窗口。

cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。 

cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。 

外部命令:more、find
rem ********************************************
rem ***  	         more命令                ***
rem ********************************************

rem more (外部命令)
rem 逐屏显示 c:test.txt 的文件内容
more c:test.txt


rem ********************************************
rem ***  	         find命令                ***
rem ********************************************

rem find (外部命令)查找命令
rem 在 c:test.txt 文件里查找含 abc 字符串的行,如果找不到,将设 errorlevel 返回码为1
find "abc" c:test.txt

rem 查找含 abc 的行,忽略大小写
find /i "abc" c:test.txt

rem 显示含 abc 的行的行数
find /c "abc" c:test.txt

系统命令:taskkill、tasklist、sc、reg、shutdown
at 安排在特定日期和时间运行命令和程序

shutdown立即或定时关机或重启

tskill 结束进程

taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)

tasklist显示进程列表(Windows XP Home Edition中没有)

sc 系统服务设置与控制

reg 注册表控制台工具

powercfg控制系统上的电源设置
网络命令:ping、ifconfig、telnet、net、ftp、msg、arp
ping 进行网络连接测试、名称解析

ftp 文件传输

net 网络命令集及用户管理

telnet 远程登陆

ipconfig显示、修改TCP/IP设置

msg 给用户发送消息

arp 显示、修改局域网的IP地址-物理地址映射列表

参数

基础的参数有:

时间参数:date、time
@echo off
set NOW_TIME=%date:~0,4%-%date:~5,2%-%date:~8,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
chcp 65001 
echo 创建了名字为:%NOW_TIME%的文件夹
MD %NOW_TIME%
pause

%date:~5,2%
%date:~8,2%
%date:~0,4%

%time:~0,2%
%time:~3,2%
%time:~6,2%

符号

基础的符号命令有:

回显屏蔽:@
重定向:> >> <
管道:|

转义:^

逻辑:& && ||

变量:% %% !!

其他符号:* ? + , :: : ()

常见问题

rem ********************************************
rem ***  			常见问题                 ***
rem ********************************************

#### 运行时出现中文乱码
原因:记事本新建的文件,编码是 utf-8
解决方法:用【记事本】打开>【另存为】>【修改编码为:ANSI】
chcp 936

#### 黑窗口输出中文乱码
原因:记事本新建的文件,编码不是 utf-8
解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
chcp 65001

#### 双击打开,出现闪退
原因:执行速度很快,执行完之后,自行关闭
解决办法:在最后面一行加上 pause

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值