DOS 批处理
- 1. 基础 DOS 命令
- 1.1 基础命令
- 1.2 文件系统操作
- 1.3 文件夹管理
- 1.4 文件管理
- 1.5 网络相关
- 1.6 系统管理
- 1.7 IF、FOR和NET
- IF
- FOR
- NET
1. 基础 DOS 命令
command /? 查找帮助
- DOS命令不区分命令字母的大小写
C:\Users\Administrator>echo 1
1
C:\Users\Administrator>echO 1
1
C:\Users\Administrator>EchO 1
- 脚本正常执行结束,返回值为0,异常结束,返回值为1或其它数字
1.1 基础命令
REM 和 ::
ECHO 和 @
PAUSE
ERRORLEVEL
TITLE
COLOR
GOTO 和 :
FIND
START
assoc 和 ftype
pushd 和 popd
CALL
SHIFT
IF
setlocal 与 变量延迟
cls
FOR
REM
和::
指令有点类似我们C语言的注释,但是有点不同。
-
REM
注释的描述,会在执行bat脚本的时候将描述回显出来 -
::
注释的描述,在指令bat脚本时,不会将描述回显。
d:\test_bat>type rem.bat
rem rem line
:: ::line
pause
d:\test_bat>rem.bat
d:\test_bat>rem rem line
d:\test_bat>pause
请按任意键继续. . .
- ECHO除了可以打印我们想输出的文字或者变量值的功能之外,还有一些小功能。
echo [on/off]:打开/关闭回显功能
echo [context]:输出提示信息
echo off:关闭DOS提示符的显示,使屏幕只留下一个下划线形状的光标,再输入echo on即可打开DOS提示符的显示
echo.:输出一个空行,这里的.和echo之间不要有空格,其实除了echo.有这个效果,echo+、echo-、echo*、echo,都可以
echo [文件内容] > [文件名]:建立新文件
echo [文件内容] >> [文件名]:新增文件内容
echo前面加@与否。 作用:加@代表不显示当前行命令自身
示例:
G:\WorkSpaceG\yurq\dos>type echo.bat
rem "echo off"指令关闭回显
echo off
echo "关闭回显功能的效果"
echo 床前明月光,
echo 疑是地上霜,
echo on
echo "打开回显功能的效果"
echo 举头望明月,
echo 低头思故乡.
echo ---------------分割线-------------
echo 建立新文件
:: 在当前路径下新建文件
echo "hello" > ./new_file.txt
echo "继续增加文件内容,请按enter"&pause > nul
echo 新增文件内容
echo "world" >> ./new_file.txt
pause
G:\WorkSpaceG\yurq\dos>echo.bat
G:\WorkSpaceG\yurq\dos>rem "echo off"指令关闭回显
G:\WorkSpaceG\yurq\dos>echo off
"关闭回显功能的效果"
床前明月光,
疑是地上霜,
G:\WorkSpaceG\yurq\dos>echo "打开回显功能的效果"
"打开回显功能的效果"
G:\WorkSpaceG\yurq\dos>echo 举头望明月,
举头望明月,
G:\WorkSpaceG\yurq\dos>echo 低头思故乡.
低头思故乡.
G:\WorkSpaceG\yurq\dos>echo ---------------分割线-------------
---------------分割线-------------
G:\WorkSpaceG\yurq\dos>echo 建立新文件
建立新文件
G:\WorkSpaceG\yurq\dos>echo "hello" 1>./new_file.txt
G:\WorkSpaceG\yurq\dos>echo "继续增加文件内容,请按enter" & pause 1>nul
"继续增加文件内容,请按enter"
G:\WorkSpaceG\yurq\dos>echo 新增文件内容
新增文件内容
G:\WorkSpaceG\yurq\dos>echo "world" 1>>./new_file.txt
G:\WorkSpaceG\yurq\dos>pause
请按任意键继续. . .
G:\WorkSpaceG\yurq\dos>type new_file.txt
"hello"
"world"
- ERRORLEVEL
ERRORLEVEL指令含义是“程序状态返回码”,返回上一条指令执行状态码,一般0
代表正常
,1或者其它数字
代表错误
- TITLE
TITLE指令修改控制台窗口的标题 - color
设置默认的控制台前景和背景颜色。
COLOR [attr]
attr 指定控制台输出的颜色属性。
颜色属性由两个十六进制数字指定 – 第一个对应于背景,第二个对应于前景。每个数字可以为以下任何值:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
- GOTO 和
:
GOTO 和:
指令含义就是跳转的意思,那GOTO跳转到哪里去呢?这里的GOTO是跳转到标签处,这里的标签就是用:
来定义,标签格式:[name]
,给标签取名最好取一些有含义的名字
D:\test_bat>type goto.bat
@echo off
:start
set /a var +=1
echo var=%var%
if %var% leq 4 goto start
pause
D:\test_bat>goto.bat
var=1
var=2
var=3
var=4
var=5
请按任意键继续. . .
- FIND
FIND指令,在文件
中搜索字符串
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。
/C 仅显示包含字符串行的次数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
/OFF[LINE]:不要跳过具有脱机属性集的文件。
"string":指定要搜索的文本字符串。
[drive:][path]filename:指定要搜索的文件
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo "temp.txt文件内容"
type .\temp.txt
echo.
echo "显示所有未包含指定字符串的行"
find /v "床" .\temp.txt
echo ------------分割线--------------
echo "仅显示包含字符串的行数"
find /c "床" .\temp.txt
echo ------------分割线--------------
echo "显示行号"
find /n "低头" .\temp.txt
echo ------------分割线--------------
echo "搜索字符串时忽略大小写"
find /i "hello world" .\temp.txt
pause
G:\WorkSpaceG\yurq\dos>echo.bat
"temp.txt文件内容"
床前明月光,
疑是地上霜,
举头望明月,
低头思故乡.
HELLO WORLD
hello worLD
"显示所有未包含指定字符串的行"
---------- .\TEMP.TXT
疑是地上霜,
举头望明月,
低头思故乡.
HELLO WORLD
hello worLD
------------分割线--------------
"仅显示包含字符串的行数"
---------- .\TEMP.TXT: 1
------------分割线--------------
"显示行号"
---------- .\TEMP.TXT
[4]低头思故乡.
------------分割线--------------
"搜索字符串时忽略大小写"
---------- .\TEMP.TXT
HELLO WORLD
hello worLD
请按任意键继续. . .
- start
START指令,
- 不带参数,批处理中调用外部程序命令,该外部程序在新的窗口中运行,批处理程序继续往下执行,不理会外部程序执行的情况。
- 使用
wait
参数,则必须等待外部程序完成后,输入n
才可以继续执行剩余的指令,输入y
终止当前批处理后面的程序
echo off
echo "start"
:: start .\title.bat
echo "n"|start /wait .\title.bat
echo "end"
D:\test_bat>start.bat
D:\test_bat>echo off
"start"
^C"end"
- assoc 和 ftype
-
assoc
指令,显示或设置“文件扩展名
”关联到“文件类型
”;比如.txt文件扩展名,代表的是文本文件,执行“assoc .txt
”指令,即可看到输出内容是“.txt=txtfile
”,及说明.txt文件扩展名代表着文本文件,再比如“assoc .doc
”指令,输出内容是“.doc=Word.Document.8
”,及说明.doc文件扩展名代表着文档文件 -
ftype
指令,显示或设置“文件类型
”关联到“执行程序与参数
”;
D:\test_bat>@assoc .xlsx
.xlsx=Excel.Sheet.12
D:\test_bat>@assoc .txt
.txt=txtfile
D:\test_bat>assoc .doc
.doc=Word.Document.8
D:\test_bat>ftype txtfile
txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1
- pushd 和 popd
pushd 和 popd指令,切换保存的目录
d:\test_bat>pushd d:\test_bat
d:\test_bat>cd /d c:\
c:\>popd
d:\test_bat>
- CALL
CALL指令可以在批处理执行过程中调用另外一个批处理程序,当另外一个批处理程序执行完后,再继续执行原本的命令。
格式:CALL [drive:][path]filename [batch-parameters]
call与start不同的是call不会另外调用一个新的控制台窗口来执行调用的批处理脚本
@echo off
echo "调用修改控制台标题脚本"
call .\example_title.bat
echo "调用程序执行完毕"
pause
也可以调用自身脚本中的命令段,相当于调用子程序,但是被调用的命令段以标签开始,以“goto :eof
”结束
格式:CALL:label arguments
@echo off
echo "这里是第一句话"
call :sub_1
echo "这里是第三句话"
echo "这里是第四句话"
echo "这里是第五句话"
pause
:: --------子程序--------
:sub_1
echo "这里是第二句话"
goto :eof
G:\WorkSpaceG\yurq\dos>echo.bat
"这里是第一句话"
"这里是第二句话"
"这里是第三句话"
"这里是第四句话"
"这里是第五句话"
请按任意键继续. . .
"这里是第二句话"
还是会额外执行子程序的内容
- SHIFT
SHIFT指令更改批处理文件中可替换参数的位置,更改参数位置并不会影响%0和%1。格式:SHIFT [/n]
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
::在当前工作目录下创建一个临时文件
echo "这是一个临时文件" > temp.txt
call :sub 1 2 3 4 5 6 7 8
pause
:sub
echo 第二位参数的值:%~2
rem 向左移动一位
shift /1
echo 第二位参数的值:%~2
goto :eof
G:\WorkSpaceG\yurq\dos>echo.bat
第二位参数的值:2
第二位参数的值:3
请按任意键继续. . .
第二位参数的值:
第二位参数的值:
- setlocal 与 变量延迟
批处理读取命令是按行读取,在处理之前要完成必要的预处理工作,这其中就包括对命令中变量复赋值。我们看个例子来理解变量延迟
d:\test_bat>type start.bat
@echo off
set a=4
set a=5 & echo %a%
pause
d:\test_bat>start.bat
4
请按任意键继续. . .
这里我们可以看到输出的结果是4,这是为什么呢?前面不是说了吗,批处理读取命令是按行读取,在处理之前要完成必要的预处理工作,这其中就包括对命令中变量复赋值,a被我赋值了4,我们下一行不是给a赋值了5吗,为什么不是5呢,“set a=5 & echo %a%”的意思是:我们打印a的值时与给a赋值5的命令是
同时执行
的,正因为是同时执行的,所以批处理无法感知变量的动态变化。为了感知动态变化,批处理设计了变量延迟,简单来说,在读取一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说”延迟“了对变量的赋值。对示例1开启变量延迟
d:\test_bat>type start.bat
@echo off
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause
d:\test_bat>start.bat
5
请按任意键继续. . .
变量延迟的启动语句是”setlocal enabledelayedexpansion
“,并且变量要用一对”!!
“将变量括起来,否则就没有变量延迟的效果
为什么要用变量延迟?
d:\test_bat>type start.bat
@echo off
::setlocal enabledelayedexpansion
for /l %%i in (1, 1, 5) do (
set a=%%i
echo %a%
)
pause
d:\test_bat>start.bat
5
5
5
5
5
请按任意键继续. . .
d:\test_bat>type start.bat
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1, 1, 5) do (
set a=%%i
echo !a!
)
pause
d:\test_bat>start.bat
1
2
3
4
5
请按任意键继续. . .
1.2 文件系统操作
vol 显示磁盘卷标号
label 创建更改或删除磁盘的卷标
更改卷标
C:\Users\Administrator>cd /d d:/
d:\>label soft
1.3 文件夹管理
cd
md/mkdir
rd/rmdir
dir
tree
path 显示path的环境变量值
XCOPY source [destination] 复制文件和目录树
1.4 文件管理
type 显示文件内容
copy source [destination] 将一份或多份文件复制到另一个位置
del/erase
move
ren/rename
replace 替换文件
attrib 显示或更改文件属性
find 在文件中搜索字符串
fc 比较两个文件或两个文件集并显示它们之间的不同
# replace 如果目标目录没有此文件,不进行替换
d:\>replace d:\1\123 d:\2
正在替换 D:\2\123
# attrib
d:\>attrib /?
显示或更改文件属性。
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [+O | -O] [+I | -I] [+X | -X] [+P | -P] [+U | -U]
[drive:][path][filename] [/S [/D]] [/L]
+ 设置属性。
- 清除属性。
R 只读文件属性。
A 存档文件属性。
S 系统文件属性。
H 隐藏文件属性。
# find
d:\>find "123" 123
---------- 123
123
# fc
d:\>fc 123 d:\1\123
正在比较文件 123 和 D:\1\123
FC: 找不到差异
1.5 网络相关
ping
ftp 将文件传送到运行 FTP 服务器服务(经常称为后台程序)的计算机以及将文件从该计算机传出。可以交互使用 Ftp
net 网络相关
telnet 检测服务器的端口是否开放,telnet www.baidu.com 80
ipconfig
msg 将消息发送给用户
arp 显示和修改地址解析协议(ARP)使用的“IP 到物理”地址转换表,arp是地址解析协议,其基本功能为透过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代。
nslookup 查询域名对应的IP地址
tracert ip/域名 路由追踪命令
# ftp
FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-A] [-x:sendbuffer] [-r:recvbuffer] [-b:asyncbuffers] [-w:windowsize] [host]
-v 禁止显示远程服务器响应。
-n 禁止在初始连接时自动登录。
-i 关闭多文件传输过程中的
交互式提示。
-d 启用调试。
-g 禁用文件名通配(请参阅 GLOB 命令)。
-s:filename 指定包含 FTP 命令的文本文件;命令
在 FTP 启动后自动运行。
-a 在绑字数据连接时使用所有本地接口。
-A 匿名登录。
-x:send sockbuf 覆盖默认的 SO_SNDBUF 大小 8192。
-r:recv sockbuf 覆盖默认的 SO_RCVBUF 大小 8192。
-b:async count 覆盖默认的异步计数 3
-w:windowsize 覆盖默认的传输缓冲区大小 65535。
host 指定主机名称或要连接到的远程主机
的 IP 地址。
1.6 系统管理
schtasks
shutdown
tskill
taskkill
tasklist
sc
reg
powercfg
1.7 IF、FOR和NET
由于这几个命令比较常用且复杂,所以单独整理,这几个命令之间没有必然联系。
IF
执行批处理程序中的条件处理。
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
NOT 指定只有条件为 false 的情况下,Windows 才应该执行该命令。
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。
string1==string2 如果指定的文字字符串匹配,指定条件为 true。
EXIST filename 如果指定的文件名存在,指定条件为 true。
command 如果符合条件,指定要执行的命令。如果指定的
条件为 FALSE,命令后可跟 ELSE 命令,该命令将
在 ELSE 关键字之后执行该命令。
ELSE 子句必须出现在同一行上的 IF 之后。例如:
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
由于 del 命令需要用新的一行终止,因此以下子句不会有效:
IF EXIST filename. del filename. ELSE echo filename. missing
由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也不会有效:
IF EXIST filename. del filename.
ELSE echo filename. missing
如果都放在同一行上,以下子句有效:
IF EXIST filename. (del filename.) ELSE echo filename. missing
d:\test_bat>if 1 leq 1 echo 123
123
d:\test_bat>if errorlevel 0 echo 321
321
d:\test_bat>if exist start.bat echo exist
exist
如果命令扩展被启用,IF 会如下改变:
IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command
其中, compare-op 可以是:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
而/I
开关(如果指定)说明要进行的字符串比较不分大小写
。/I 开关可以用于 IF 的 string1==string2 的形式上。这些比较都是通用的;原因是,如果 string1 和 string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。
CMDEXTVERSION
条件的作用跟 ERRORLEVEL
的一样,除了它是在跟与命令扩展有关联的内部版本号比较。第一个版本是 1。每次对命令扩展有相当大的增强时,版本号会增加一个。命令扩展被停用时,CMDEXTVERSION 条件不是真的。
如果已定义环境变量,DEFINED
条件的作用跟 EXIST 的一样,除了它取得一个环境变量,返回的结果是 true。
如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,你会得到其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:
goto answer%ERRORLEVEL%
:answer0
echo Program had return code 0
:answer1
echo Program had return code 1
你也可以使用以上的数字比较:
IF %ERRORLEVEL% LEQ 1 goto okay
如果没有名为 CMDCMDLINE
的环境变量,%CMDCMDLINE%将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始命令行;否则,你会得到其数值。
如果没有名为 CMDEXTVERSION
的环境变量,%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的字串符表达式;否则,你会得到其数值。
其实笔者整理这篇文章就是因为
if 1 echo 1
报错,现在看来确实是语法错误
FOR
对一组文件中的每一个文件执行某个特定命令。
- 基本格式:
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
FOR命令有4个参数“/D、/L、/R、/F
”
- FOR参数
- <1> 参数
/D
详解
定义:FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配
解析:如果集合(set)包含通配符(“*”和“?”),将对与集合(set)相匹配的每一个目录(不是指目录中的文件组)执行指定的Commoand,这个参数主要用于目录搜索,不会搜索文件
D可以理解为Directory
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo C盘根目录下所有目录名:
for /d %%i in (c:\*) do (
echo %%i
)
pause
G:\WorkSpaceG\yurq\dos>echo.bat
C盘根目录下所有目录名:
c:\Intel
c:\PerfLogs
c:\Program Files
c:\Program Files (x86)
c:\Python27
c:\Temp
c:\Users
c:\Windows
请按任意键继续. . .
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo 当前目录下所有目录名:
for /d %%i in (%~dp0*) do (
echo %%i
)
pause
G:\WorkSpaceG\yurq\dos>echo.bat
当前目录下所有目录名:
G:\WorkSpaceG\yurq\dos\123
请按任意键继续. . .
- <2> 参数
/R
详解
定义:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树
解析:通过/D参数知道,/D参数能显示指定路径或者当前路径下的目录名,/R也是跟目录有关,/R参数可以把指定路径下或者当前目录下的文件名全部读取,注意是文件名,不是目录名
注意:
1、集合(set)中文件名如果包含通配符(“*”和“?”),则列举/R参数指定的目录及其下面的所有子目录中与集合(set)相符合的所有文件,不相符文件的目录则不列举
2、如果集合(set)中为具体文件名,不包含通配符,则枚举该目录树(即枚举该目录及其下面的所有子目录),而不管集合(set)中指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo 搜索D盘根目录和子目录子所有以.bat结尾的文件:
for /r c:\ %%i in (*.bat) do (
echo %%i
)
echo --------------------------------------------
echo 搜索当前目录及其子目录下所有以.txt结尾的文件:
for /r %%i in (*.txt) do (
echo %%i
)
pause
G:\WorkSpaceG\yurq\dos>echo.bat
搜索C盘根目录和子目录子所有以.bat结尾的文件:
c:\$WINDOWS.~BT\NewOS\Program Files\WindowsPowerShell\Modules\Pester\3.4.0\Build.bat
c:\$WINDOWS.~BT\NewOS\Program Files\WindowsPowerShell\Modules\Pester\3.4.0\bin\Pester.bat
c:\$WINDOWS.~BT\NewOS\Program Files (x86)\Microsoft\Edge\Application\92.0.902.67\show_third_party_software_licenses.bat
...
@echo off
echo 在C盘中搜索具体文件名为“temp.png”:
for /r c:\ %%i in (temp.png) do (
echo %%i
)
pause
备注:如果集合(set)中为具体文件名,不包含通配符,则枚举该目录树(即枚举该目录及其下面的所有子目录),而不管集合(set)中指定文件是否存在。什么意思呢,就是它会搜索C盘中一切可能有“temp.png”文件的路径,不管“temp.png”存在都会给出一个路径结果
扩展:你可以将上方脚本修改为下面这种,看是否真的存在
G:\WorkSpaceG\yurq\dos>echo.bat
在C盘中搜索具体文件名为“temp.png”:
请按任意键继续. . .
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo 在C盘中搜索具体文件名为“temp.png”:
for /r c:\ %%i in (temp.png) do (
if exist %%i echo %%i
)
pause
- <3> 参数
/L
详解
定义: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)
解析:使用迭代变量设置起始值(start),然后逐步执行一组范围值,直到该值超过所设置的终止值(end)。/L
参数将通过对起始值与终止值进行比较来执行迭代变量,如果起始值小于终止值,就会执行指定给出的命令,如果迭代变量超过终止值,则命令解释程序退出循环。可以使用负的步进值(step)以递减数值的方式来逐步执行此范围内的值
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
echo 正的步进值(step)循环结果:
for /l %%i in (1, 1, 5) do (
echo %%i
)
echo --------------------------------------------
echo 负的步进值(step)循环结果:
for /l %%i in (5, -1, 1) do (
echo %%i
)
pause
G:\WorkSpaceG\yurq\dos>echo.bat
正的步进值(step)循环结果:
1
2
3
4
5
--------------------------------------------
负的步进值(step)循环结果:
5
4
3
2
1
请按任意键继续. . .
这个参数的for,用起来和其他编程语言的for含义相似
- <4> 参数 /F详解
定义:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
或者,如果有 usebackq
选项:
FOR /F ["usebackq options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["usebackq options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["usebackq options"] %variable IN (`command`) DO command [command-parameters]
file-set 为一个或多个文件名。继续到 file-set 中的下一个文件之前,每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。你可通过指定可选 “options
” 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和制表符的默认分隔符集。
tokens=x,y 或 m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。
m-n格式为一个范围。通过 nth 符号指定 mth。
如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 file-set中使用双引号扩起文件名称。
注意:tokens= 一行指定最多 26 个符号,只要不试图声明一个高于字母 “z” 或"Z" 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;而且,不能同时使用超过 52 个
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
rem 创建测试文件
echo ;注释行,临时文件用完删除 > .\test.txt
echo 11段 12段 13段 14段 15段 16段 >> .\test.txt
echo 21段,22段,23段,24段,25段,26段 >> .\test.txt
echo 31段-32段-33段-34段-35段-36段 >> .\test.txt
echo 第一句话 > .\temp.txt
echo 第二句话 >> .\temp.txt
echo 第三句话 >> .\temp.txt
echo hello;world >> .\temp.txt
echo -------------------------------------------------------------
echo /F参数解析文件内容:
for /f "eol=; tokens=1,3* delims=,- " %%i in (.\test.txt) do (
echo %%i %%j %%k
)
echo -------------------------------------------------------------
echo /F参数解析字符串:
for /f "tokens=1,2,3 delims=,-;" %%i in ("hello,world-window;bat") do (
echo 第一列字符串:%%i;第二列字符串:%%j;第三列字符串:%%k
)
echo -------------------------------------------------------------
echo temp.txt文件内容:
type .\temp.txt
echo -------------------------------------------------------------
echo /F参数解析命令:
rem 结果输出只显示最左侧的“hello”,因为tokens没有设置,所以只显示第一列
for /f "skip=3 delims=; " %%i in ('type .\temp.txt') do (
echo %%i
)
pause
del .\test.txt & del .\temp.txt
G:\WorkSpaceG\yurq\dos>echo.bat
-------------------------------------------------------------
/F参数解析文件内容:
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
-------------------------------------------------------------
/F参数解析字符串:
第一列字符串:hello;第二列字符串:world;第三列字符串:window
-------------------------------------------------------------
temp.txt文件内容:
第一句话
第二句话
第三句话
hello;world
-------------------------------------------------------------
/F参数解析命令:
hello
请按任意键继续. . .
解析:
“eol=c”指定单个字符作为注释行的开头;
“skip=n”指定忽略前n行;
“delims=xxx”指定分隔符,将内容按照指定分隔符进行分割;
“tokens=x,y,m-n”指定分割后的内容将按照“x,y,m-n”列显示内容(比如“tokens=1,2,3”显示分割后的第一列、第二列、第三列内容;而“tokens=1,3*”显示分割后的第一列、第三列、第三列后的内容当作一列内容)
“usebackq options”
对于带有空格的文件名,你需要用双引号将文件名括起来。为了用这种方式来使用双引号,还需要使用 usebackq 选项,否则,双引号会被理解成是用作定义某个要分析的字符串。
即被双引号括起来的字符串,此选项都认为是文件名
单引号括起来为“字符串”
G:\WorkSpaceG\yurq\dos>type echo.bat
@echo off
rem 创建测试文件
echo ;注释行,临时文件用完删除 > .\test.txt
echo 11段 12段 13段 14段 15段 16段 >> .\test.txt
echo 21段,22段,23段,24段,25段,26段 >> .\test.txt
echo 31段-32段-33段-34段-35段-36段 >> .\test.txt
echo 第一句话 > .\temp.txt
echo 第二句话 >> .\temp.txt
echo 第三句话 >> .\temp.txt
echo hello;world >> .\temp.txt
echo -------------------------------------------------------------
echo /F参数解析文件内容:
for /f "usebackq eol=; tokens=1,3* delims=,- " %%i in (.\test.txt) do (
echo %%i %%j %%k
)
echo -------------------------------------------------------------
echo /F参数解析字符串:
for /f "usebackq tokens=1,2,3 delims=,-;" %%i in ('hello,world-window;bat') do (
echo 第一列字符串:%%i;第二列字符串:%%j;第三列字符串:%%k
)
echo -------------------------------------------------------------
echo temp.txt文件内容:
type .\temp.txt
echo -------------------------------------------------------------
echo /F参数解析命令:
for /f "usebackq skip=3 delims=; " %%i in (`type .\temp.txt`) do (
echo %%i
)
pause
del .\test.txt & del .\temp.txt
G:\WorkSpaceG\yurq\dos>echo.bat
-------------------------------------------------------------
/F参数解析文件内容:
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
-------------------------------------------------------------
/F参数解析字符串:
第一列字符串:hello world;第二列字符串:window bat;第三列字符串:
-------------------------------------------------------------
temp.txt文件内容:
第一句话
第二句话
第三句话
hello;world
-------------------------------------------------------------
/F参数解析命令:
hello
请按任意键继续. . .
- FOR命令中的变量
变量( | 说明 |
| 删除任何引号("),扩展 %I,删除引号规则为:无头不删,有头连尾删 |
| 将 %I 扩展到一个完全合格的路径名 |
| 仅将 %I 扩展到一个驱动器号 |
| 仅将 %I 扩展到一个路径 |
| 仅将 %I 扩展到一个文件名 |
| 仅将 %I 扩展到一个文件扩展名 |
| 扩展的路径只含有短名 |
| 将 %I 扩展到文件的文件属性 |
| 将 %I 扩展到文件的日期/时间 |
| 将 %I 扩展到文件的大小 |
| 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串 |
另外,还可以组合修饰符来得到多重结果:
变量( | 说明 |
%~dpI | 仅将 %I 扩展到一个驱动器号和路径 |
%~nxI | 仅将 %I 扩展到一个文件名和扩展名 |
%~fsI | 仅将 %I 扩展到一个带有短名的完整路径名 |
%~dp$PATH:I | 搜索列在路径环境变量的目录,并将 %I 扩展到找到的第一个驱动器号和路径。 |
%~ftzaI | 将 %I 扩展到类似输出线路的 DIR |
NET
显示所有用户账号(net user)
添加用户账户(net user username /add)
删除指定用户账户(net user username /delete)
激活或禁用指定账户(net user username /active:yes/no)
查询账户相关的安全信息(net accounts)
查询共享资源(net view、net file、net share)
- 局域网内共享的计算机——net view
- 查询远端计算机正在占用的共享文件——net file
- 查询、管理共享文件夹——net share,例如
- 我要设置e盘为共享文件夹,可以执行命令【
net share e=e:\
】,其中第一个e代表了共享文件夹的名称,而e:\代表的是共享文件夹的目录路径。 - 删除共享文件夹的设定,【
net share D:\D-desktop\test5 /delete
】
服务管理(net start、net stop、Net Pause、Net Continue)
- 查询已经开启了哪些服务——net start,执行没有参数的命令【
net start
】,可以查看当前已经开启的服务。这些服务也可在服务管理器查看,在运行窗口或cmd窗口中执行命令【services.msc
】,可以看到所有服务。 - 暂停某项服务——net stop xxx,假如说我们想暂停上面的第一项服务,可以执行命令【
net stop "ABBYY FineReader 15 Licensing Service"
】成功暂停。 - 启动某项服务——net start xxx,当我们想要启动那个被我们终止的ABBYY服务时,可以用命令【
net start "ABBYY FineReader 15 Licensing Service"
】。
账号信息(net user、net localgroup)
net user
命令用于添加或更改用于账号或显示用户账号信息。此命令也可以写为“net users”,格式【net user[username [password | *] [options] ] [/domain]
】,username 用于添加、删除、更改或查看用户的账号名
C:\Users\Administrator>net user gtt gtt123 /add
命令成功完成。
C:\Users\Administrator>net user gtt /delete
命令成功完成。
-
net localgroup
此命令和net user命令配合使用,用于添加用户,提升用户为管理员。 在渗透测试中,提权是要掌握的基本知识。【net localgroup groupname {/add [/comment:"text"] | /delete} [/domain]
】
计算机连接情况(net use)
“Net USE”命令用于查看连接的计算机,断开计算机与共享资源的连接,或者显示计算机的连接信息,【net use [devicename | *] [ computernamesharename[volume]] [password | *]] [/user :[domainname] username] [[/delete] | [/persistent:{yes | no}]]
】
“devicename”"用于指定要连接的资源名称或要断开的设备名称。
“computernamesharename” 表示服务器及共享资源的名称。
'password” 表示访问共享资源的密码。
“/user”用于指定进行连接的另外一个用户。
*domainname” 用于指定另一个域。
username ”用于指定登录的用户名。
“/home”用于将用户连接到其宿主目录。
“/delete"用于取消指定的网络连接。
“/persistent"用于控制永久网络连接的使用。
net use * /delete /Y
net use gtt gtt123 /user:\\192.168.2.151\abc
同步时间net time
此命令用于查看系统时间,使计算机的时钟与另一台计算机或域的时钟同步,命令格式如下。
net time [computername | /domain [:name]] [/set]
“computername” 表示要检查或同步的服务器名。
“/domain[:name]”用于指定要与其时间同步的域。
“/set"用于使本计算机时钟与指定计算机或域的时钟同步。
会话管理net session
命令用于列出或断开本地计算机与之连接的客户端的会话,也可写为 net sessions
或 net sess
命令格式 net session [computername] [/delete]