基础
再使用前,请多花些时间将基础学好,高级的使用都是有强大的基础作为支撑的。
- rem 是注释
- set 命令用于设置变量(注意不要与已存在的环境变量同名)
- 命令不分大小写
- ss64.com 英文网站,资料详细
传递命令行参数到批外理文件
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
REM echo %%1 = %1
REM 上面这句表示:%%1 转义为 %1, 而 %1 表示第一个命令行参数
参考网址:传递命令行参数到批外理文件
setlocal
开启局部范围,范围结束,恢复原本变量的值。延时展开(delaed expansion), 需要使用 !var!
来展开变量,原本是这样的 %var% 。
默认情况下,变量扩展只在每个循环开始时发生一次。
@echo off
set var1=jkl1
set var2=abc2
set "var1=%var2%" & set "var2=%var1%"
echo var1=%var1% \t var2=%var2%
setlocal EnableDelayedExpansion
REM setlocal EnableDelayedExpansion
Set "_var=first"
Set "_var=second" & Echo %_var% !_var!
REM first
endlocal
Set "_var=first"
Set "_var=second" & Echo %_var%
顺序执行命令
REM 顺序执行两行命令
echo first & echo second
REM && 是条件运算符,与 & 不同
echo first && echo second
for
rem 在cmd窗口中,for之后的形式变量I必须使用单百分号引用,即%i;而在批处理文件中,引用形式变量i必须使用双百分号,即%%i。
rem 对目录使用 for
for /d %%d in (.) do dir %%d
rem 对一类文件使用
@REM for %%f in (*.bat) do type %%f
rem 对一个文件使用
@REM ----------------------------------------------------------------------------------------------
for /f "eol=; tokens=2,3* delims=," %%i in (myfile.txt) do @echo %%i %%j %%k
for /f "tokens=1-5 delims=:," %%a in (易经.txt) do echo %%a %%b %%c %%d %%e
@REM 通俗讲,共同提取每一行的第m小节的内容。
@REM 因此,可以用该命令来指定提取文本信息。
@REM tokens=有时表示提取全部。
@REM tokens=m表示提取第m列。
@REM tokens=m,n表示提取第m列和第n列。
@REM tokens=m-n表示提取第m列至第n列。
@REM Tokens=*表示删除每行前面的空格。忽略行首的所有空格。
@REM tokens=m*提取第m列以后的所有字符,星号表示剩余的字符。
@REM tokens=m,*提取第m列以后的所有字符,星号表示剩余的字符。
@REM 输出变量的个数由定义了的tokens决定。
@REM 在 FOR 语句中显式声明 %%i。使用tokens= 隐式声明%%j 和%%k。只要不会引起试图声明高于字母“z”或“Z”的某个变量,则使用tokens= 可以指定最多 26 个输出变量。
@REM 在使用 usebackq 的情况下
@REM `dir` 作为命令
@REM “dir" 作为文件
@REM 在没有使用 usebackq 的情况下
@REM `dir` 系统不能找到 dir
@REM “dir" 作为字符串
@REM usebackq 用于处理带空格的字符串
@REM ----------------------------------------------------------------------------------------------
rem 对步长使用
for /l %%i in (1, 1, 10) do @echo %%i
@REM for /f "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
参考网址:https://www.cnblogs.com/Jian-Zhang/p/6066429.html
参考网址:https://www.hxstrive.com/subject/windows_bat.htm?id=74
参考网址:https://www.cnblogs.com/it-tsz/p/11306672.html
实现函数功能
call :helloworld Hello World
rem call 命令用于调用另一个脚本,或一个标签,后面跟的是参数
rem :helloworld 是一个标签,可以在定义前使用
set return_value = 0
goto :endhelloworld
rem goto 调转到指定的标签
:helloworld
if 9 GTR 7 (
set return_value = 1
echo %1
) else (
set return_value = 0
)
echo 函数内
goto :EOF
rem & 连续执行命令
:endhelloworld
echo 函数外
得到命令执行的结果
@echo off
set attr = ""
setlocal EnableDelayedExpansion
REM for /f "usebackq" %%i in (`dir`) do set attr=!attr!;%%i
REM for /f "usebackq eol=} delims={" %%i in (`dir`) do @echo %%i
REM for /f "usebackq eol=} delims={" %%i in (`dir`) do set attr !attr!;%%i
dir > testdir.txt
for /f %%i in (testdir.txt) do echo %%i
echo %attr%
endlocal
读取文件内容
rem 方法一
for /f %%i in (.\tmp.txt) do echo %%i
rem 方法二
set /P qq=<tmp.txt
字符串
@echo off
set str=abcdefghijkl
rem 前面4个字符
echo %str:~0,4%
rem 后面4个字符
echo %str:~-4%
rem 第一个到倒数第5个字符
echo %str:~0,-4%
rem 3 到 4
echo %str:~2,3%
rem 倒数第二个开始,提取5个字符
echo %str:~1,5%
rem 拼接
set str1=abc
set str2=abc
set %str3=%aa%%bb%"
rem 替换
echo %str:a=jkl%
参考网址:子串(substring)
参考网址:编辑/替换变量中的文本
日期时间
REM 时间
echo 当前时间:%time% %time:~0,2%点%time:~3,2%分%time:~6,2%秒
if
获取用户输入,判断输入是否为指定的字符:
@echo off
set /p isOk=Are you ok?(y/n):
if /i "%isOk%"=="y" call :yes_func
if /i "%isOk%"=="n" call :no_func
rem /i 大小写不敏感的匹配
goto :eof
rem call 调用一个子程,可以传递参数
rem goto :eof 去到当前批处理文件的最后,或是子程(subroutine)的最后
rem EXIT /b 有选项可以设置指定的 errorlevel, 0 表示成功;1 或更大的值,表示错误
rem EXIT /b 没有退出码,它的作用与 goto :eof 相同
:yes_func
echo yes
goto :eof
:no_func
echo no
goto :eof
参考网址:ss64 | if
参考网址:获取输入
参考网址:goto | ss64
参考网址:set /p 获取整个输入| ss64
choice | ss64
接受用户输入,并交给批处理文件。可以从键盘捕获一个键的按压。
@echo off
CHOICE /C:rg /m "choose [R]ed or [G]reen"
rem at this point the errorlevel will contain either 1 or 2
rem 在这里,errorlevel 要么是 1 ,要么是 2
goto sub_%ERRORLEVEL%
:sub_1
Echo You typed R for red.
goto:eof
:sub_2
Echo You typed G for green.
goto:eof