基础知识
-
@echo off
@是不显示当前命令的回显;echo off是关闭除此之外的所有命令的回显;合在一起就是不显示所有命令的回显,包括当前命令的回显。 -
@rem 或者 ::
批处理中的注释语法。 -
echo: 或则和 echo.
在脚本输出中添加一个空行。 -
chcp 65001
切换当前cmd窗口的语言为UTF8,支持中文的显示。 -
cd /d %~dp0
切换当前目录为批处理文件所在目录。一定要加/d。 -
setlocal enabledelayedexpansion
延时扩展。for循环里面使用最多。因为for循环是按照一行命令去执行的,批处理的机制会先预处理一下,所以要使用最新的变量值,就需要使用延迟扩展语法。 -
> nul
放弃当前命令的输出。一般跟在一条命令的后面,表示不显示当前命令的输出内容。 -
findstr 字符串1 文件1 >nul && (文件1包含字符串1) || (文件1不包含字符串1)
文件中查找指定字符串,并且根据查找的结果,做后续相应的操作。 -
findstr 字符串1 文件1 if !errorlevel! equ 0 ( echo 查找到字符串 ) else ( echo 没有查找到字符串 )
文件中查找指定字符串,注意后面的文件名字一定要正确,如果写成了一个字符串而非文件,那么会报错FINDSTR: Cannot open错误。需要使用到延迟扩展才行。除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: ‘FINDSTR “hello there” x.y’ 在文件 x.y 中寻找 “hello” 或
“there”。‘FINDSTR /C:“hello there” x.y’ 文件 x.y 寻找
“hello there”。@echo off @setlocal enabledelayedexpansion chcp 65001 cd /d %~dp0 @REM 遍历文件test.txt中的每一行,分别记录找到几行,没找到几行,查找的字符串有引号,要加转移符号 set all=0 set found=0 set notfound=0 for /f "delims=" %%i in (test.txt) do ( set /a all=!all!+1 echo %%i | findstr /c:"SUCCESS: The process \"test.exe\" with PID" && ( set /a found=!found!+1 ) || ( set /a notfound=!notfound!+1 ) echo. ) echo 找到%found%个,没找到%notfound%个 pause
-
echo 字符串1 | findstr 字符串2 >nul && (字符串2包含字符串1) || (字符串2不包含字符串1)
字符串中查找指定字符串,并且根据查找结果,做后续相应的操作。
需要注意的是,findstr命令后面紧跟的&& || 代表了两种查找结果的表示方式;
if !errorlevel! equ 0 () else ()也是一种方式,0表示查找到,其他表示没查找到。 -
for循环
for %%f in (%folderPath%) do ( echo %%f )
打印路径下的每个文件的名字。
下面列举几项 for的参数:
for /d(D) 遍历文件夹::括号里的 * 代表bat文件所在的目录 for /d %%i in (*) do ( echo %%i )
for /l(L) 数字序列
@REM 表示以step为增量从开始到结束的一个数字序列,此处是:1开始,每次+3,20结束 for /l %%i in (1,3,20) do (echo %%i)
for /f(F) 打印文件内容
@REM 语法格式 @REM for /f ["options"] %%i IN (file) DO command @REM for /f ["options"] %%i IN ("string") DO command @REM for /f ["options"] %%i IN ('command') DO command ::表示循环输出ls命令(列出当前目录下的文件和文件夹)的每一个项 ::不加参数,默认以空格分割此行文本(等同于"delims= "注意有一个空格),即只显示第一个空格前或此行结尾前文本 ::注意,此处打印文件的名字,文件名如果有空格,会截取到空格前,想要避免,加"delims=" for /f "delims=" %%i in ('ls') do ( set aa= %%i echo !aa! ) @REM /f "tokens=2 delims= " @REM tokens的作用就是当你经过delims将每一行分为更小的元素时,由它来控制要取哪个或哪几个。 :: 取 dilims 分成的第2个元素 for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i :: 取 dilims 分成的第2到4个元素 for /f "tokens=2,3,4 delims= " %%i in (a.txt) do echo %%i %%j %%k for /f "tokens=2-4 delims= " %%i in (a.txt) do echo %%i %%j %%k :: i j k 分别代表取的三个元素 :: 取 dilims 分成的第2之后的元素 for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j %%k @REM /f “skip=1” @REM 用 skip 来告诉for跳过前两行。
-
timeout /T 5 /NOBREAK
timeout /T 延迟秒数,单位秒 不受键盘阻塞。 -
del /S /Q "%APPDATA%\testbat" >nul
删除文件 /s表示递归删除,/q表示安静模式,不提示确认。需要注意:del命令本身并不直接用于删除目录(文件夹),而是用于删除文件。 -
rd /s /q 目录名
递归删除指定目录及其下的所有文件和子目录。 -
xcopy "./src" "./dest" /S /E /Y /H
文件和目录递归深拷贝,把src目录拷贝到dest目录。
-/s:复制目录和子目录,不包括空目录。
-/e:复制所有子目录,即使是空的。与/s一同使用时,/e将覆盖/s的行为,确保所有子目录都被复制。
-/y:覆盖现有文件而不提示。
-/h:复制隐藏和系统文件也复制。默认情况下,xcopy不会复制隐藏或系统文件。使用/h参数可以确保这些特殊属性的文件也被复制。 -
字符拼接和截取
截取语法:%str:~a,b%
拼接直接拼就行@echo off @setlocal enabledelayedexpansion chcp 65001 cd /d %~dp0 @REM 字符串截取 [a,b) 0代表从左第一个字符,-1代表最后一个字符,b为负数则从右往左 set str=hello world ok set newStr=%str:~0,-1% echo str=%str% echo newStr=%newStr% set s1=你好 set s2=, set s3=你好 set s6=%s1%%s2%%s3% echo %s6% pause
-
if not exist 文件夹 mkdir 文件夹 move 源文件 目标目录
如果不存在文件,则创建文件夹,移动源文件到目标目录位置。 -
dir > test.txt
将dir命令的输出重定向写到文件test.txt中,如果文件已经存在则每次覆盖写。 -
dir >> test.txt
将dir命令的输出重定向写到文件test.txt中,如果文件已经存在则每次在文件末位追加写。