CMD

CMD常用命令

Posted by Kerwen Blog on March 24, 2016

数字计数

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 >=

这里需要注意的是在ifelse语句里,不要set一个变量之后立即使用它.

1
2
3
4
5
6
set var1=true
set var2=test
if "%var1%"=="true" (
    set var2=myvalue
    echo %var2%
)

实际输出结果

1
test

cmd 在读取语句的时候会先把所有的变量展开, 比如:

1
2
set var2=myvalue
echo %var2%

在读echo命令时会直接把%var2%替换成 myvalue,cmd实际执行的命令是

1
echo myvalue

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

枚举目录下的文件

只显示文件名:

1
dir /b /a-d

枚举目录及子目录下的dll,exe和ocx文件:

1
dir /b /a-d /s *.dll,*.exe,*.ocx

Create folder

1
md 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 b=%var:~5% ⇒ 67890

负终了:

1
set c=%var:~5,-2% ⇒ 678

负开始无终了:

1
set d=%var:~-6% ⇒ 567890

没有开始:

1
set e=%var:~,4% ⇒ 1234

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%

删除变量中所有的空格

1
set var=%var: =%

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%