bat的使用技巧汇总

bat写一些简单的脚本还是挺强大的,也不需要软件,一个记事本就够了。我们把一些常用的总结起来,方便大家使用。

1.基础命令

//打印
@echo on //显示执行命令 默认
echo hello //输出  echo hello;hello
echo //输出 echo;ECHO 回显处于打开状态
@echo off //不显示执行命令
echo hello //输出  hello
echo // ECHO 回显处于关闭状态
 //清屏
 cls  回车
 //打开cmd
 start cmd
 //调用其他bat 不中断
 执行a.bat时,调用call b.bat
 //查看已开端口
 netstat -a
 //打开网页
 curl -X GET www.xxx.com  或 cur www.xxx.com
 cur -X POST www.xxx.com  -F 'name=andy'  -F 'age=50' -F 'img=@/image/logo.jpg'
 
 curl -X GET www.xxx.com>log.txt
 set /p log=<log.txt
 echo log
 
//bat文件中文乱码  查看cmd窗口字符集
chcp
//修改窗口字符集 显示中文需设置为 936 代表gb2312; 65001 代表 utf-8
chcp 936

2.查看操作
当前盘符:%~d0
当前盘符和路径:%~dp0
当前批处理全路径:%~f0
当前CMD默认目录:%cd%
切换CMD目录:cd cd…

//查看当前目录,文件夹和文件名字,日期,大小
dir
//查看当前目录,仅文件夹和文件名字
dir /b
//查看当前目录,仅文件夹
dir /b /a:d 
//查看当前目录,仅文件
dir /b /a:a
//查看当前目录,包含子目录
dir /b /s

3.文件操作
3.1 创建

md 1 2 3
md 11;22;33
md 111,222,333
if not exist 1 ( md 1) else (echo "exist")

3.2 写入

@echo off
//双符号 >> 会将打开内容累计
echo hello>>temp.txt
echo word>>temp.txt
// 单符合 > 会将打开内容清空
echo goodbye>temp.txt
pause

3.3 复制
xcopy 是copy的扩展

// E 复制目录和子目录,包括空目录。
// S 复制目录和子目录文件,除了空目录  /S /E
// T 仅创建目录结构,不包括空目录或子目录 /T /E
// C 即使有错误,也继续复制。
// Y 禁止提示以确认覆盖一个现存目标文件。
// H 也复制隐藏和系统文件。
// R 改写只读文件。
xcopy 1.txt  d:\  /s /e /c /y /h /r
//取消提示 “是文件名还是目录名”
echo f| xcopy code.js code.min.js /S /e /c /y /h /r

3.4 删除

/** /S 删除所有包含子目录 /Q 安静模式,不需要确认 /F 删除只读文件*/
//删除目录
rd  d:\a  /s /q    
//删除文件`在这里插入代码片`
del d:\a\1.txt  /f /s

3.5 压缩

//将1.txt打包成1.rar, ‘-ep1’表示不包含路径
rar a -ep1  "d:1.rar" "e:\1.txt" 

3.6文件关联
mklink /j “D:/reource” “E:/resource” 软连接,只是映射

4.字符操作
4.1 截取字符串: ~0,5 参数1表示索引,参数2表示截取长度

set name=andy  
//截取从0开始,长度为2 
set name=%name:~0,2% 
//截取最后2个字符 
set name=%name:~-2% 

4.2 替换字符串::a=b 将a替换为b

set name=andy   
set name=%name:n=m% 

5.循环操作
语法:FOR [参数] %%变量名 IN (相关文件或命令) DO 执行的命令
参数:for命令参数支持:/d /f /l /r 也可以不带参数
变量:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

5.1 /d 只显示当前目录下的目录名字,不包含子集目录
格式:FOR /D %variable IN (set) DO command [command-parameters]

//显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径)
for %%i in (t*.*) do echo %%i 
//显示d:\mydocuments\目录下与*.doc相匹配的文件
for %%i in (d:\mydocuments\*.doc) do @echo %%i 
//显示c盘根目录下的所有目录
for /d %%i in (c:\*) do echo %%i 
//显示当前目录下名字只有1-3个字母的目录
for /d %%i in (???) do echo %%i 

5.2 /r 搜索指定路径及所有子目录中与set相符合的所有文件
格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

//列举C盘文件名是boot.ini多有文件
for /r c:\ %%i in (boot.ini) do echo %%i 
//列举C盘文件名包含boot的所有文件
for /r c:\ %%i in (boot.*) do echo %%i 

5.3 /f 使用文件解析来处理文件、字符串及命令输出内容
格式:FOR /F [“options”] %%i IN (file) DO command
格式:FOR /F [“options”] %%i IN (“string”) DO command
格式:FOR /F [“options”] %%i IN (command) DO command
这个是最复杂也是功能最强的参数,更多详细内容可查看这里。

/**假如文件a.txt中有如下内容:
第1行第1列 第1行第2列 第1行第3列 第1行第4列
第2行第1列 第2行第2列 第2行第3列 第2行第4列
第3行第1列 第3行第2列 第3行第3列 第3行第4列
*/
//每次读取1行
for /f %%i in (a.txt) do echo %%i 
//delims= 每一行按空格分开,默认取第一列内容
for /f "delims= " %%i in (a.txt) do echo %%i
//tokens=2取第二列
for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i
//tokens=2,3取第二和三列,%%i %%j 必须按英文字母顺序
for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
//tokens=1-3取第一到三列
for /f "tokens=1-3 delims= " %%i in (a.txt) do echo %%i %%j %%k
//tokens=2,3取第二列,第二列之后所有
for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j
//tokens=*通配符取所有列
for /f "tokens=* delims= " %%i in (a.txt) do echo %%i %%j
//skip=2 忽略文件前2行
for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i
//eol=. 忽略以.开头的行
for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i

扩展 %%~i

// 删除头引号,有头引号则删除尾引号,保留中间引号 
/**a.txt文件内容如下:
"11
"22"
33"
"44"44
*/
for /f "delims= " %%i in (a.txt) do echo %%~i
/**运行结果如下:
11
2222
3333"
4444"44
*/

解析字符串

@echo off
set str="aa bb#cc-dd_ee#ff"
//通过-分割,得到数组[aa bb#cc,dd_ee#f]
for /f "tokens=2 delims=-" %%a in (%str%) do echo %%a %%b %%c
//通过-#两次分割,得到数组[aa bb,cc,dd_ee,f]
for /f "tokens=2,3,4 delims=-#" %%a in (%str%) do echo %%a %%b %%c
pause

解析命令

//通过dir得到当前列表,循环当前目录文件夹
for /f "delims=" %%i in ('dir /ad/b ') do (
	echo %%i
)

// %%~di 只显示盘符
for /f "delims=" %%i in ('dir /b') do @echo %%~di
// %%~pi 显示全路径
for /f "delims=" %%i in ('dir /b') do @echo %%~pi
// %%~ni 显示文件夹或文件名字
for /f "delims=" %%i in ('dir /b') do @echo %%~ni
// %%~xi 显示文件扩展名
for /f "delims=" %%i in ('dir /b') do @echo %%~xi
// %%~si 显示全路径文件夹或文件名字(包含短名字 比如:download->downlo~1)
for /f "delims=" %%i in ('dir /b') do @echo %%~si
// %%~fi 显示全路径文件夹或文件名字
for /f "delims=" %%i in ('dir /b') do @echo %%~fi
// %%~ti 显示文件夹或文件的修改日期
for /f "delims=" %%i in ('dir /b') do @echo %%~ti
// %%~zi 显示文件夹或文件的大小
for /f "delims=" %%i in ('dir /b') do @echo %%~zi
//通过系统PATH变量搜索notepad.exe,搜索到后显示全路径文件名
for /f "delims=" %%i in ("notepad.exe") do echo %%~$path:i 

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

//输出1 2 3 4 5
for /l %%i in (1,1,5) do @echo %%i 
//输出1,3,5,7,9 
for /l %%i in (1,2,10) do @echo %%i 
//输出10,8,6,4,2 
for /l %%i in (10,2,1) do @echo %%i 

6.基础问题
6.1 乱码问题:打印的中文是乱码
解决方法:bat的中文支持编码是ANSI,用记事本打开另存为 ANSI格式即可。
6.2 路径错误:Program Files 不是内部命令。
解决方法:Program Files替换为Progra~1, Program Files (x86)替换为Progra~2
6.3 一闪而过:运行bat文件,失败时看不到错误,bat自动关闭了。
解决方法:在bat文件末尾加上 pause,bat执行后就不会立刻关闭,然后就可以看到具体的错误的问题了。
6.4打印问题:ECHO 处于关闭状态 或 ECHO 处于打开状态
解决方法:set name =andy;echo %name% 设置变量名不能与等号有空格;echo %var%,%var%可能是空。
6.5bat和cmd有什么区别
BAT(批处理)和CMD(命令提示符)是常见的脚本文件类型,用于在Windows系统中执行一系列命令或操作。它们有以下的区别:


1.文件格式:BAT文件使用的是纯文本格式,后缀名为.bat;CMD文件则使用的是二进制格式,通常使用.cmd或.exe作为后缀名。

2.解释器:BAT文件由旧版的Windows批处理解释器执行,而CMD文件则由更先进的Windows命令解释器执行。CMD文件提供了更多功能和命令选项。

3.语法支持:CMD文件支持扩展的命令语法和更多的命令参数选项,例如IF、FOR循环、GOTO标签等。CMD文件可以使用更多的命令和语法来控制和处理脚本的执行。

4.兼容性:BAT文件在较旧的Windows系统上具有更好的兼容性,而CMD文件在较新的Windows版本中更常见,并且支持更多的功能。

总体来说,CMD文件是BAT文件的升级版本,提供了更多的功能和命令选项。如果你在较新的Windows系统上工作,建议使用CMD文件来编写和执行脚本。然而,在特定的情况下,BAT文件可能仍然是一个有效的选择,尤其是需要较广泛的兼容性时。

7.具体问题
7.1批量替换文件字符串

@echo off
setlocal EnableDelayedExpansion
(for /f "delims=" %%i in (a.text) do (
	set str=%%i
	//替换字符
	set str=!str:Hello=HelloWord!
	//去掉当前行的空格
	:entercept
	if "!str:~0,1!"==" "  set "str=!str: =!" call :entercept
	if not "!str!"==""  (echo !str! ) 
))>b.text
endlocal

7.2删除多于运行文件,打包压缩

@echo off
//当前路径
set dir=%~dp0
echo %dir%
for /f "delims=" %%i in ('dir /ad/b "%dir%"') do (
	echo %%i
	rd %dir%\%%i\release  /s /q
	rd %dir%\%%i\bin\js /s /q
	del  %dir%\%%i\bin\code.js /f
	C:\Progra~1\WinRAR\WinRAR.exe a -ep1 %%i.rar %dir%\%%i
)
pause

7.3批量按顺序修改文件名字

@echo off
::设置文件前缀
set name=test
::设置文件类型
set type=png
setlocal enabledelayedexpansion
for  %%i in (*) do (
	echo %%i
	if not "%%i"=="name.bat" (
        set /a sum+=1
        rename "%%i" %name%"_!sum!."%type%
     
	)
)
pause

7.4获取日期

@echo off
//输出 2022/04/29 周五  10:01:01.00
echo %date% %time%
//输出 20220429
echo %date:~0,4%%date:~5,2%%date:~8,2%
//输出 100101
echo %time:~0,2%%time:~3,2%%time:~6,2%

你可能感兴趣的:(工具,batch,开发语言)