数字计数
1
2
| SET /a Num=0
SET /a Num+=1
|
If 语句
1
2
3
4
5
6
7
| if [NOT] Condition (
command1
) ELSE (
command2
)
if [NOT] EXIST filename command
|
compare-op can be one of
1
2
3
4
5
6
7
8
| EQU : Equal
NEQ : Not equal
LSS : Less than <
LEQ : Less than or Equal <=
GTR : Greater than >
GEQ : Greater than or equal >=
|
这里需要注意的是在if
和else
语句里,不要set
一个变量之后立即使用它.
1
2
3
4
5
6
| set var1=true
set var2=test
if "%var1%"=="true" (
set var2=myvalue
echo %var2%
)
|
实际输出结果
cmd 在读取语句的时候会先把所有的变量展开, 比如:
1
2
| set var2=myvalue
echo %var2%
|
在读echo
命令时会直接把%var2%
替换成 myvalue
,cmd实际执行的命令是
if
语句特殊的一点是: 只有在读取完括号内的所有语句之后cmd才会真正执行这段代码块. 而在读取的过程中变量就已经替换完,而这时候set
语句还没有开始执行。
可以采用延迟展开的方式:
1
2
3
4
5
6
7
| setlocal EnableDelayedExpansion
set var1=true
set var2=test
if "%var1%"=="true" (
set var2=myvalue
echo !var2!
)
|
或者
1
2
3
4
5
6
| set var1=true
set var2=test
if "%var1%"=="true" (
set var2=myvalue
)
echo %var2%
|
函数
1
2
3
4
5
| call::FuntionName
:FuntionName
command
goto:eof
|
注册表
删注册表
1
| reg delete [RegeditKey] [/v KeyValue] /f
|
File and Directory
copy folder and file
1
| XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
|
[/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
[/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
[/EXCLUDE:file1[+file2][+file3]…]
/A |
|
只复制有存档属性集的文件,但不改变属性。 |
/M |
|
只复制有存档属性集的文件, 并关闭存档属性。 |
/D:m-d-y |
|
复制在指定日期或指定日期以后更改的文件。如果没有提供日期,只复制那些源时间比目标时间新的文件。 |
/EXCLUDE:file1[+file2][+file3]… |
|
指定含有字符串的文件列表。每一个字符串必须在文件的单独行中。如果有任何字符串与要被复制的文件的绝对路径相符,那个文件将不会得到复制。例如,指定如 \obj\ 或 .obj 的字符串会排除目录 obj 下面的所有文件或带有.obj 扩展名的文件。 |
/P |
|
创建每个目标文件前提示。 |
/S |
|
复制目录和子目录,除了空的。 |
/E |
|
复制目录和子目录,包括空的。与 /S /E 相同。可以用来修改 /T。 |
/V |
|
验证每个新文件。 |
/W |
|
提示您在复制前按键。 |
/C |
|
即使有错误,也继续复制。 |
/I |
|
如果目标不存在,又在复制一个以上的文件,则假定目标一定是一个目录。 |
/Q |
|
复制时不显示文件名。 |
/F |
|
复制时显示完整的源和目标文件名。 |
/L |
|
显示要复制的文件。 |
/G |
|
允许将没有经过加密的文件复制到不支持加密的目标。 |
/H |
|
也复制隐藏和系统文件。 |
/R |
|
覆盖只读文件。 |
/T |
|
创建目录结构,但不复制文件。不包括空目录或子目录。/T /E 包括空目录和子目录。 |
/U |
|
只复制已经存在于目标中的文件。 |
/K |
|
复制属性。一般的 Xcopy 会重置只读属性。 |
/N |
|
用生成的短名复制。 |
/O |
|
复制文件所有权和 ACL 信息。 |
/X |
|
复制文件审核设置(隐含 /O)。 |
/Y |
|
复制文件审核设置(隐含 /O)。现存目标文件。就是直接覆盖 |
/-Y |
|
导致提示以确认改写一个现存目标文件。 |
/Z |
|
用重新启动模式复制网络文件。 |
Excemple:
遍历子目录:
1
| xcopy /q /s /c /y /i source destination
|
不遍历子目录:
1
| xcopy /q /c /y /i source destination
|
只拷贝所有文件(包括子目录),但不创建子文件夹
1
| for /r C:\Folder %%f in (*.txt) do @copy "%%f" C:\TXT
|
拷贝单个文件的同时重命名:
1
| copy /y c:\a.txt d:\b.log
|
枚举目录下的文件
只显示文件名:
枚举目录及子目录下的dll,exe和ocx文件:
1
| dir /b /a-d /s *.dll,*.exe,*.ocx
|
Create folder
Delete folder
1
| RD [/S] [/Q] [drive:]path
|
/S 除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。
/Q 安静模式,带 /S 删除目录树时不要求确认。
Delete file
1
| del FileName [ ...] [/p] [/f] [/s] [/q] [/a[:attributes]]
|
指定要删除的文件或文件集的位置和名称。需要Filename。可以使用多个文件名。用空格、逗号或分号分开文件名
/p 提示您确认是否删除指定的文件
/f 强制删除只读文件
/s 从当前目录及其所有子目录中删除指定文件。显示正在被删除的文件名。
/q 指定静音状态。不提示您确认删除。
/a 根据指定的属性删除文件。 (补充:有一种情况是例外,当文件具有只读属性的时候,还得添加del /a /f 参数,所以,如果要对不知道属性的文件进行强制删除,使用del /a /f 语句是最保险的做法。)(/a:rh 只删除只读隐藏属性的文件 )
attributes 指定下列文件属性中的任意一种:
属性 |
|
说明 |
r |
|
只读 |
a |
|
存档 |
s |
|
系统 |
h |
|
隐藏 |
- |
|
前缀表明“非” |
文件是否存在
1
2
3
4
5
| if exist <insert file name here> (
rem file exists
) else (
rem file doesn't exist
)
|
重命名文件
1
| ren C:\Users\&username%\Desktop\aaa.txt bbb.txt
|
截取字符串
1
2
| Set var=1234567890
set a=%var:~5,2% ⇒ 67
|
无终了:
负终了:
1
| set c=%var:~5,-2% ⇒ 678
|
负开始无终了:
1
| set d=%var:~-6% ⇒ 567890
|
没有开始:
Error Level
Now, it does happen to be the case that if command extensions are enabled and you say %ERRORLEVEL%, then the command processor first looks for an environment variable called ERRORLEVEL, and if it can’t find one, then it replaces %ERRORLEVEL% with the current value of the internal error level value. It’s a fallback step, in the same way that your neighbor is a fallback delivery location if you aren’t home. If you file a change-of-address form for yourself, that doesn’t affect packages sent to your neighbor.
读取文件并赋值给变量
1
2
| set /p Build=<version.txt
echo %Build%
|
删除变量中所有的空格
for 循环
1
2
3
4
| for /l %%i in (1,1,5) do (
@echo %%i --输出1 2 3 4 5
echo something
)
|
大小写转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| @echo off & SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET Branch=ForceDelete
call :toupper Branch
goto end
:: toupper & tolower; makes use of the fact that Branching
:: replacement (via SET) is not case sensitive
:toupper
for %%L IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO SET %1=!%1:%%L=%%L!
goto :EOF
:tolower
for %%L IN (a b c d e f g h i j k l m n o p q r s t u v w x y z) DO SET %1=!%1:%%L=%%L!
goto :EOF
:end
echo Current branch is: %Branch%
|