1. set设置变量,变量名前后不要留空格
set FILE_PATH=%~dp0
set BASE_PATH=%FILE_PATH%\..\..\targetDir
echo %0 ::带双引号完整路径名
echo %~0 ::不带双引号完整路径名
echo %~d0 ::驱动器名称如E:
echo %~f0 ::不带双引号完整路径名
echo %~p0 ::不带驱动号目录
echo %~dp0 ::bat脚本文件所在目录
echo %~dp0 - 仅将 %0 扩充到一个驱动器号和路径
echo %~nx0 - 仅将 %0 扩充到一个文件名和扩展名
echo %~fs0 - 仅将 %0 扩充到一个带有短名的完整路径名
2. 当前目录路径
%cd%
可以用在批处理文件中,也可以用在命令行中,内容为执行命令所在的目录(包含驱动器盘符)。%~dp0
只可以用在批处理文件中,由所在的批处理文件的目录位置决定的,内容为批处理文件所在的目录(包含驱动器盘符)。
3. 标准输入:可以使用输入重定向来从文件而不是键盘获取输入数据,在脚本中使用预定义的数据或从文件中读取大量数据非常有用。使用小于符号 < 进行操作。例如:
set /p input=<data.txt
echo Input: %input%
4. 可以使用输入重定向来执行命令,而不是从键盘手动输入。例如:
findstr "keyword" <data.txt
5. 字符串变量与常量比较,请带双引号,如:“%name%”==“marcus”
6. 判断两个字符串变量是否相等,可以使用 ==,equ;不等则可以使用 not ==,neq
字符串变量与常量比较,请带双引号,如:“%name%”==“marcus”
带 /i,表示忽略大小写,类似java的equalsIgnoreCase
数字比较
EQU,等于
NEQ,不等于
LSS,小于
LEQ,小于等于
GTR,大于
GEQ,大于或等于
SET myVar=10
IF %myVar%==10 (
ECHO Variable is equal to 10
) ELSE (
ECHO Variable is not equal to 10
)
IF EXIST "file.txt" (
ECHO File exists
) ELSE (
ECHO File does not exist
)
7. &、&&、||
&,顺序执行多条命令,而不管命令是否执行成功,如:@echo off & setlocal
&&,顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
||,顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令(即:只有前面命令执行错误时才执行后面命令),findstr命令时经常会使用&&和||符号,分别表示:找到执行…,没找到执行…
8.遍历目录内容:
FOR %%G IN (C:\Folder\*) DO (
REM 执行操作,%%G 代表当前文件或文件夹名
ECHO %%G
)
9. start标识符可用于调用其他程序如可执行文件exe
start /MIN test2.bat arg1 arg2 (调用同目录下的 test2.bat,且输入2个参数给他,且本窗口最小化)
start %BASE_PATH%\test.exe
[终止进程]
taskkill /f /im notepad.exe
10. bat的函数声明需要用到 特殊字符 :(英文的冒号)
call标识符也可以用于调用函数也可以调用别的bat脚本
goto :eof 用于停止往下继续执行命令行
call与start区别
start upload.bat
不会等upload.bat执行完再执行下一条, 如此可实现同时执行多条命令.
call upload.bat
call 命令 是要等调用的程序结束以后才运行下面的命令.
:fun_main echo 这是个测试函数 call :fun_test pause goto :eof :fun_test echo 测试函数+1 goto :eof
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。
变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用 %1 到 %9 顺序表示。
call test2.bat "hello" "haha" (执行同目录下的“test2.bat”文件,并输入两个参数)
11.%errorlevel% 是脚本内置变量等于0时代表前面命令执行没有报错
if %errorlevel%==0 ( call :fun_aa )
12. for标识符用于循环
dir /b 指定目录 这个语法可以用于获得指定目录下的所有文件和文件夹
for /f 遍历指定目录下所有的文件和文件夹
for /d 遍历指定目录下所有的文件夹
for /r 遍历指定目录下所有的文件和子文件夹中的文件
%%i 则是声明的变量可以是任意的变量名但变量名前面必须加上两个百分号%%
(1)delims分隔符读取的字符串会以这些分隔符进行拆分成多个子字符串
:fun_main= for /f "delims=,/" %%i in (test.txt) do ( echo %%i ) pause goto :eof
来源:超详细 批处理文件脚本(bat) 教程(持续更新) (681314.com)
(2)token标识列读取的字符串列会以标识列索引赋值给变量
:fun_main= for /f "delims=,/ tokens=1,2" %%a in (test.txt) do ( echo 索引1%%a echo 索引2%%b ) pause goto :eof
13. >nul 命令意思是将结果抛弃
14. 字符串中是否包含某个字符串
echo 字符串 | findstr 子字符串 >nul && (
包含时的情况
)
:fun_main set strname=hello set teststr=213123 hello world echo %teststr% | findstr %strname% >nul && ( echo %teststr% 中包含 %strname% goto :eof ) echo %teststr% 中不包含 %strname% goto :eof
15. 字符串删除所有空格:替换操作
:fun_main set teststr=213123 hello world set teststr=%teststr: =% echo %teststr%
16. 字符串截取
:fun_main set teststr=*213123 hello world## echo %teststr% set teststr=%teststr:~1,-1% echo %teststr%
17. copy标识符可以复制文件或者文件夹
18. del标识符可以删除文件
del /f 强制删除只读文件
del /s 从所有的目录下删除指定文件
del /q 安静模式
:fun_main del /f /s /q test.txt >nul
19. @ 命令
表示不显示@后面的命令,(在入侵过程中自然不能让对方看到你使用的命令啦)
@ 与 echo off 相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
Sample: @echo off (此语句常用于开头,表示不显示所有的命令行信息,包括此句)
20. if
(1)语法: if [not] "参数" == "字符串" 待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
(2)语法: if [not] exist [路径\]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
(3)if errorlevel number
语法: if [not] errorlevel <数字> 待执行的命令
如果程序返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。(返回值必须按照从大到小的顺序排列)
XCOPY F:\test.bat D:\
IF ERRORLEVEL 1 (ECHO 文件拷贝失败
) Else IF ERRORLEVEL 0 (ECHO 成功拷贝文件)
21. FOR:Windows 批处理(bat)语法大全 - jack_Meng - 博客园 (cnblogs.com)
DOS命令for /f_dos for命令-CSDN博客:skip/tokens/delims
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
1) for {%variable | %%variable} in (set) do command [command-parameters]
%variable 指定一个单一字母可替换的参数。变量名称是区分大小写的,所以 %i 不同于 %I
在批处理文件中使用 FOR 命令时,指定变量建议用 %%variable而不要用 %variable。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
2) 如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持:
a.FOR /D %variable IN (set) DO command [command-parameters]
如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配。
b.FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。
如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
c.FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
如:(1,1,5) 将产生序列 1 2 3 4 5; 而(5,-1,1) 将产生序列 (5 4 3 2 1)。
d.有或者没有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command
FOR /F ["options"] %variable IN ("string") DO command
FOR /F ["options"] %variable IN (command) DO command
参数"options"为:
eol=c - 指一个行注释字符的结尾(就一个,如“;”)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。
m-n格式为一个范围。通过 nth 符号指定 mth。
如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。
3) Sample:
1. 如下命令行会显示当前目录下所有以bat或者txt为扩展名的文件名。
for %%c in (*.bat *.txt) do (echo %%c)
a. 如下命令行会显示当前目录下所有包含有 e 或者 i 的目录名。
for /D %%a in (*e* *i*) do echo %%a
b. 如下命令行会显示 E盘test目录 下所有以bat或者txt为扩展名的文件名。
for /R E:\test %%b in (*.txt *.bat) do echo %%b
for /r %%c in (*) do (echo %%c) :: 遍历当前目录下所有文件
c. 如下命令行将产生序列 1 2 3 4 5
for /L %%c in (1,1,5) do echo %%c
d. 以下两句,显示当前的年月日和时间
For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo %%j年%%k月%%l日
For /f "tokens=1,2 delims=: " %%j In ('TIME /T') do echo %%j时%%k分
e. 把记事本中的内容每一行前面去掉8个字符
setlocal enabledelayedexpansion
for /f %%i in (zhidian.txt) do (
set atmp=%%i
set atmp=!atmp:~8!
if {!atmp!}=={} ( echo.) else echo !atmp!
)
:: 读取记事本里的内容(使用 delims 是为了把一行显示全,否则会以空格为分隔符)
for /f "delims=" %%a in (zhidian.txt) do echo.%%a
4) continue 和 break
利用 goto 实现程序中常用的 continue 和 break 命令, 其实非常简单
continue: 在 for 循环的最后一行写上一个标签,跳转到这位置即可
break: 在 for 循环的外面的下一句写上一个标签,跳转到这位置即可
Sample: (伪代码)
for /F ["options"] %variable IN (command) DO (
... do command ...
if ... goto continue
if ... goto break
... do command ...
:continue
)
:break
22. 字符串处理
1) 分割字符串,以查看时间为例
%源字符串:~起始值,截取长度% (起始值从0开始;截取长度是可选的,如果省略逗号和截取长度,将会从起始值截取到结尾;
截取长度如果是负数,表示截取到倒数第几个。)
"%time%" 显示如:"11:04:23.03" (完整的时间"hh:mm:ss.tt")
"%time:~0,5%" 显示"hh:mm"(即"11:04"),其中0表示从右向左移位操作的个数,5表示从左向右移位操作的个数
"%time:~0,8%" 显示标准时间格式"hh:mm:ss"(即"11:04:23",前8个字符串)
"%time:~3,-3%"显示"mm:ss"(即从第4个开始,截去最后3个的字符串)
"%time:~3%" 显示"04:23.03"(即去掉前4个字符串)
"%time:~-3%" 显示".tt"(即最后3个字符串)
上面的字串分割格式,也可以用于其它地方,如目录路径:"%cd:~0,10%"
2) 替换字符串
set a="abcd1234"
echo %a% 显示:"abcd1234"
set a=%a:1=kk% 替换“1”为“kk”
echo %a% 显示:"abcdkk234"
3) 字符串合并
由于没有直接的字符串合并函数,只能用笨方法了。
set str1=%str1%%str2% (合并 str1 和 str2)
4) 计算字符串长度
没有现成的函数。如下程序利用 goto形成循环,不断将字符串截短1,并记录截短的次数,到字符串变成空时的次数即长度。
set testStr=This is a test string
:: 将 testStr 复制到str,str 是个临时字符串
set str=%testStr%
:: 标签,用于goto跳转
:next1
:: 判断str是不是空,如果不是则执行下边的语句
if not "%str%"=="" (
:: 算术运算,使num的值自增1,相当于num++或者++num语句
set /a num+=1
:: 截取字符串,每次截短1
set "str=%str:~1%"
:: 跳转到next1标签: 这里利用goto和标签,构成循环结构
goto next1
)
:: 当以上循环结构执行完毕时,会执行下边的语句
echo testStr=%testStr%
echo testStr的长度为:%num%
5) 截取字符串时,需要传递参数
直接 echo %args:~%num%,-5% 没办法想要的字符串,需要如下两步
setlocal enabledelayedexpansion
echo !args:~%num%,-5!