0%

DOS编程7-高级技巧

随便延伸一下,学习一下高手们都是怎么用的。

交互界面设计

没啥说的,看看高手设计的菜单界面吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@echo off
cls
title 终极多功能修复
:menu
cls
color 0A
echo.
echo ==============================
echo 请选择要进行的操作,然后按回车
echo ==============================
echo.
echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站
echo.
echo 2.病毒专杀工具,端口关闭工具,关闭自动播放
echo.
echo 3.清除所有多余的自启动项目,修复系统错误
echo.
echo 4.清理系统垃圾,提高启动速度
echo.
echo Q.退出
echo.
echo.
:cho
set choice=
set /p choice= 请选择:
IF NOT "%choice%"=="" SET choice=%choice:~0,1%
if /i "%choice%"=="1" goto ip
if /i "%choice%"=="2" goto setsave
if /i "%choice%"=="3" goto kaiji
if /i "%choice%"=="4" goto clean
if /i "%choice%"=="Q" goto endd
echo 选择无效,请重新输入
echo.
goto cho

只要学完本教程前面的章节,上面的程序应该能看懂了。

if…else…条件语句

前面已经谈到,DOS条件语句主要有以下形式

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

增强用法:IF [/I] string1 compare-op string2 command
增强用法中加上/I不区分大小写了,增强用法中还有一些用来判断数字的符号:

符号 功能
EQU 等于
NEQ 不等于
LSS 小于
LEQ 小于或等于
GTR 大于
GEQ 大于或等于

上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。例如:

1
2
3
4
5
IF EXIST filename (
del filename
) ELSE (
echo filename missing
)

也可写成:

1
if exist filename (del filename) else (echo filename missing)

但这种写法不适合命令太多或嵌套命令的使用。

循环语句

指定次数循环

1
FOR /L %variable IN (start,step,end) DO command [command-parameters]

组合命令:

1
2
3
4
5
FOR /L %variable IN (start,step,end) DO (
Command1
Command2
……
)

对某集合执行循环语句。

1
FOR %%variable IN (set) DO command [command-parameters]

%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 对每个文件执行的命令,可用小括号使用多条命令组合。

1
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。
如果在 /R 后没有指定目录,则使用当前目录。
如果集仅为一个单点.字符,则枚举该目录树。
同前面一样,command可以用括号来组合:

1
2
3
4
5
6
FOR /R [[drive:]path] %variable IN (set) DO (
Command1
Command2
……
commandn
)

条件循环

上面的循环结构是用for命令来实现的,for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。

利用goto语句和条件判断,dos可以实现条件循环,很简单啦,看例子:

例:

1
2
3
4
5
6
7
8
9
10
@echo off
set var=0
rem ************循环开始了
:continue
set /a var+=1
echo%var%次循环
if %var% lss 100 goto continue
rem ************循环结束了
echo 循环执行完毕
pause

例:

1
2
3
4
5
6
7
8
9
10
@echo off
set var=100
rem ************循环开始了
:continue
echo%var%次循环
set /a var-=1
if %var% gtr 0 goto continue
rem ************循环结束了
echo 循环执行完毕
pause

子程序

在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐。

在windows中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。

子程序调用格式:

CALL :label arguments

子程序语法:

:label
command1
command2
......
commandn
goto :eof

在子程序段中,参数%0指标签:label,子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。
子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
传至子程序的参数在call语句中指定,在子程序中用%1%2%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。

子程序例1:

1
2
3
4
5
6
7
@echo off
call :sub return 你好
echo 子程序返回值:%return%
pause
:sub
set %1=%2
goto :eof

运行结果:

你好

子程序例2:设计一个求多个整数相加的子程序

1
2
3
4
5
6
7
8
9
10
11
@echo off
set sum=0
call :sub sum 10 20 35
echo 数据求和结果:%sum%
pause
:sub
rem 参数1为返回变量名称
set /a %1=%1+%2
shift /2
if not "%2"=="" goto sub
goto :eof

运行结果:

65

用ftp命令实现自动下载

ftp是常用的下载工具,ftp界面中有40多个常用命令。这里介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。
其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。

1
ftp  -n -s:[[drive:]path]filename

上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等

例:

open 90.52.8.3    #打开ip
user iware        #用户为iware
password8848      #密码
bin               #二进制传输模式
prompt
cd tmp1           #切换至iware用户下的tmp1目录
pwd
lcd d:\download   #本地目录
mget *            #下载tmp1目录下的所有文件
bye               #退出ftp

用7-ZIP实现命令行压缩和解压功能

语法格式:(详细情况见7-zip帮助文件)

1
7z <command> [<switch>...] <base_archive_name> [<arguments>...]

7z.exe的每个命令都有不同的参数<switch>,请看帮助文件

<base_archive_name>为压缩包名称
<arguments>为文件名称,支持通配符或文件列表

其中,7z是至命令行压缩解压程序7z.exe,<command>是7z.exe包含的命令,列举如下:

a: Adds files to archive. 添加至压缩包

a命令可用参数:
  -i (Include)
  -m (Method)
  -p (Set Password)
  -r (Recurse)
  -sfx (create SFX)
  -si (use StdIn)
  -so (use StdOut)
  -ssw (Compress shared files)
  -t (Type of archive)
  -u (Update)
  -v (Volumes)
  -w (Working Dir)
  -x (Exclude)
b: Benchmark
d: Deletes files from archive. 从压缩包中删除文件
d命令可用参数:
  -i (Include)
  -m (Method)
  -p (Set Password)
  -r (Recurse)
  -u (Update)
  -w (Working Dir)
  -x (Exclude)
e: Extract解压文件至当前目录或指定目录
e命令可用参数:
  -ai (Include archives)
  -an (Disable parsing of archive_name)
  -ao (Overwrite mode)
  -ax (Exclude archives)
  -i (Include)
  -o (Set Output Directory)
  -p (Set Password)
  -r (Recurse)
  -so (use StdOut)
  -x (Exclude)
  -y (Assume Yes on all queries)
l: Lists contents of archive.
t: Test 
u: Update
x: eXtract with full paths用文件的完整路径解压至当前目录或指定目录
x命令可用参数:
  -ai (Include archives)
  -an (Disable parsing of archive_name)
  -ao (Overwrite mode)
  -ax (Exclude archives)
  -i (Include)
  -o (Set Output Directory)
  -p (Set Password)
  -r (Recurse)
  -so (use StdOut)
  -x (Exclude)
  -y (Assume Yes on all queries)

调用VBScript程序

使用 Windows脚本宿主,可以在命令提示符下运行脚本。CScript.exe提供了用于设置脚本属性的命令行开关。

用法:

1
CScript 脚本名称 [脚本选项...] [脚本参数...]

选项:

//B         批模式:不显示脚本错误及提示信息
//D         启用 Active Debugging
//E:engine  使用执行脚本的引擎
//H:CScript 将默认的脚本宿主改为 CScript.exe
//H:WScript 将默认的脚本宿主改为 WScript.exe (默认)
//I         交互模式(默认,与 //B 相对)
//Job:xxxx  执行一个 WSF 工作
//Logo      显示徽标(默认)
//Nologo    不显示徽标:执行时不显示标志
//S         为该用户保存当前命令行选项
//T:nn      超时设定秒:允许脚本运行的最长时间
//X         在调试器中执行脚本
//U         用 Unicode 表示来自控制台的重定向 I/O

“脚本名称”是带有扩展名和必需的路径信息的脚本文件名称,如d:\admin\vbscripts\chart.vbs
“脚本选项和参数”将传递给脚本。脚本参数前面有一个斜杠/。每个参数都是可选的;但不能在未指定脚本名称的情况下指定脚本选项。如果未指定参数,则 CScript 将显示 CScript 语法和有效的宿主参数。

将批处理转化为可执行文件:

由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。

小知识
在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是 name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。

这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:

Bat2Com FileName

这样就会在同一目录下生成一个名为FileNme.com的可执行文件,执行的效果和原来的.bat文件一样。

时间延迟

本条参考引用[英雄]教程

什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
延迟的应用见下节:“模拟进度条”。

利用ping命令延时

例:

1
2
3
4
5
@echo off
echo 延时前:%time%
ping /n 3 127.0.0.1 >nul
echo 延时后:%time%
pause

解说:用到了ping命令的/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip(127.0.0.1)127.0.0.1可简写为127.1>nul就是屏蔽掉ping命令所显示的内容。

利用for命令延时

例:

1
2
3
4
5
@echo off
echo 延时前:%time%
for /l %%i in (1,1,5000) do echo %%i>nul
echo 延时后:%time%
pause

解说:原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。

利用vbs延迟函数,精确度毫秒,误差1000毫秒内

例:

1
2
3
4
5
6
7
8
9
10
11
@echo off
echo %time%
call :delay 5000
echo %time%
pause
exit
:delay
echo WScript.Sleep %1>delay.vbs
CScript //B delay.vbs
del delay.vbs
goto :eof

运行显示:

10:44:06.45
10:44:11.95
请按任意键继续. . .

上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。误差在一秒之内。

仅用批处理命令实现任意时间延迟

仅用批处理命令就可以实现延迟操作,精确度10毫秒,误差50毫秒内。
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
set /p delay=请输入需延迟的毫秒数:
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
echo 程序开始时间:%NowTime%
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
::读取起始时间的分钟数
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将起始时间的秒数转为毫秒
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
:: 读取现在时间的分钟数
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将现在时间的秒数转为毫秒
set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %delay% goto delay_continue
echo 程序结束时间:%time%
echo 设定延迟时间:%delay%毫秒
echo 实际延迟时间:%TotalTime%毫秒
pause

运行显示:

请输入需延迟的毫秒数:6000
程序开始时间:15:32:16.37
程序结束时间:15:32:22.37
设定延迟时间:6000毫秒
实际延迟时间:6000毫秒
请按任意键继续. . .

👉 实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。

👉 误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。

为了方便引用,可将上面的例子改为子程序调用形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
echo 程序开始时间:%Time%
call :delay 10
echo 实际延迟时间:%totaltime%毫秒
echo 程序结束时间:%time%
pause
exit
::-----------以下为延时子程序--------------------
:delay
@echo off
if "%1"=="" goto :eof
set DelayTime=%1
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %DelayTime% goto delay_continue
goto :eof

模拟进度条

下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
mode con cols=113 lines=15 &color 9f
cls
echo.
echo 程序正在初始化. . .
echo.
echo ┌──────────────────────────────────────┐
set/p= ■ <nul
for /L %%i in (1 1 38) do set /p a=■<nul&ping /n 1 127.0.0.1>nul
echo 100%%
echo └──────────────────────────────────────┘
pause

👉 解说:
set /p a=■<nul的意思是:只显示提示信息不换行,也不需手工输入任何信息,这样可以使每个在同一行逐个输出。ping /n 0 127.1>nul是输出每个的时间间隔,即每隔多少时间输出一个

特殊字符的输入及应用

开始 -> 运行 -> 输入cmd -> edit -> ctrl+p(意思是允许输入特殊字符)-> 按ctrl+a将会显示笑脸图案。(如果要继续输入特殊字符请再次按ctrl+p,然后ctrl+某个字母)。以上是特殊字符的输入方法,还挺管用。 也就是用编辑程序edit输入特殊字符,然后保存为一文本文件,再在windows下打开此文件,复制其中的特殊符号即可。

一些简单的特殊符号可以在dos命令窗口直接输入,并用重定向保存为文本文件。

例:

1
C:>ECHO ^G>temp.txt

^G是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。

✊
特殊字符的应用也很有意思,这里仅举一例:退格键,表示删除左边的字符,此键不能在文档中正常输入,但可以通过edit编辑程序录入并复制出来。即“”。利用退格键,可以设计闪烁文字效果

例:文字闪烁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@echo off
:start
set/p=床前明月光<nul
::显示文字,光标停于行尾
ping -n 0 127.0.0.1>nul
::设置延迟时间
set /p a=<nul
:: 输出一些退格符将光标置于该行的最左端(退格符的数量可以自己调整)。
set /p a= <nul
::输出空格将之前输出的文字覆盖掉。
set /p a=<nul
::再次输出退格符将光标置于该行的最左端,这里的退格符数量一定不能比前面的空格数少。
::否则光标不能退到最左端。
goto start
例:输出唐诗一首,每行闪动多次
@echo off
setlocal enabledelayedexpansion
set str=床前明月光 疑是地上霜 举头望明月 低头思故乡
::定义字符串str
for %%i in (%str%) do (
rem 由于str中含有空格,则以空格为分隔符将str中的每一个部分依次赋给变量%%i。
set char=%%i
echo.
echo.
for /l %%j in (0,1,5) do (
set/p=!char:~%%j,1!<nul
rem 依次取出变量char中的每一个字符,并显示。
ping -n 0 127.0.0.1>nul
rem 设置输出每个字符的时间延迟。
)
call :hero %%i
)
pause>nul
exit
:hero
for /l %%k in (1,1,10) do (
ping /n 0 127.0.0.1>nul
set /p a=<nul
set /p a= <nul
set /p a=<nul
ping /n 0 127.0.0.1>nul
set /p a=%1<nul
)
::文字闪动
goto :eof

随机数(%random%)的应用技巧

%RANDOM% 系统变量 返回 032767 之间的任意十进制数字。由 Cmd.exe 生成。2的15次方等于32768,上面的0~32767实际就是15位二进制数的范围。
那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按100进行求余运算即可,见例子。

例:生成5个100以内的随机数

1
2
3
4
5
6
7
@echo off
setlocal enabledelayedexpansion
for /L %%i in (1 1 5) do (
set /a randomNum=!random!%%100
echo 随机数:!randomNum!
)
pause

运行结果:(每次运行不一样)

1
2
3
4
5
6
随机数:91
随机数:67
随机数:58
随机数:26
随机数:20
请按任意键继续. . .

求余数运算set /a randomNum=!random!%%100中100可以是1~32768之间的任意整数。

总结:
利用系统变量%random%,求余数运算%%,字符串处理等,可以实现很多随机处理。

思考题目: 生成给定位数的随机密码

解答思路: 将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。

参考答案1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
call :randomPassword 5 pass1 pass2
echo %pass1% %pass2%
pause
exit
:randomPassword
::---------生成随机密码
::---------%1为密码长度,%2及以后为返回变量名称
::---------for命令最多只能区分31个字段
@echo off
set password_len=%1
if not defined password_len goto :eof
if %password_len% lss 1 goto :eof
set wordset=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
set return=
set num=0
:randomPassword1
set /a num+=1
set /a numof=%random%%%26+1
for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i
if %num% lss %password_len% goto randomPassword1
if not "%2"=="" set %2=%return%
shift /2
if not "%2"=="" goto randomPassword
goto :eof
参考答案2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@echo off
call :randomPassword 6 pass1 pass2 pass3
echo %pass1% %pass2% %pass3%
pause
exit
:randomPassword
::---------生成随机密码
::---------%1为密码长度,%2及以后为返回变量名称
::---------goto循环、变量嵌套、命令嵌套
@echo off
if "%1"=="" goto :eof
if %1 lss 1 goto :eof
set password_len=%1
set return=
set wordset=abcdefghijklmnopqrstuvwxyz023456789_
::---------------------------循环
:randomPassword1
set /a numof=%random%%%36
call set return=%return%%%wordset:~%numof%,1%%
set /a password_len-=1
if %password_len% gtr 0 goto randomPassword1
::---------------------------循环
if not "%2"=="" set %2=%return%
shift /2
if not "%2"=="" goto randomPassword
goto :eof

说明:本例涉及到变量嵌套和命令嵌套的应用,见后。

变量嵌套与命令嵌套

和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。
先复习一下前面的“字符串截取”的关键内容:

截取功能统一语法格式为:%a:~[m[,n]]%

方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。百分号如果需要当成单一字符,必须写成%%

以上是dos变量处理的通用格式,如果其中的mn为变量,那么这种情况就是变量嵌套了。比如设变量word“abcdefghij”,变量num“eee4eeeee”%word:~4,1%e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式:%word:~%num:~3,1%,1%,经测试这种写法不能正确执行。

那么,怎么实现这种变量嵌套呢?首先,我们将其中的%num:~3,1%作为正常的字符处理命令,其它部分当成一般字符串,这样首尾的%就必须写成%%了,即%%word:~%num:~3,1%,1%%。但是上面的写法同样不能直接当成命令执行,必须运用命令嵌套才能执行。

那么什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。

例:用call语句实现命令嵌套

1
2
3
4
5
6
7
8
@echo off
set str1=aaa echo ok bbb
echo 初始字符串:%str1%
echo 生成命令字符串如下:
echo %str1:~4,7%
echo 运行命令字符串生成最终结果为:
call %str1:~4,7%
pause

运行显示:

初始字符串:aaa echo ok bbb
生成命令字符串如下:
echo ok
运行命令字符串生成最终结果为:
ok
请按任意键继续. . .

变量嵌套与命令嵌套结合运用,见下例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
set num=Redtek 2006 bbs.cn-dos.net
set a=123245
set b=87754321
echo.
echo a=%a% b=%b% num=%num%
set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 直接运行命令,只解析第一层变量,其余的当作字符串:%result%
call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 一层命令嵌套,可解析两层变量,其余的当作字符串:%result%
call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 两层命令嵌套,可解析三层变量,其余的当作字符串:%result%
call call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 三层命令嵌套,运行变量解析完后的字符串:%result%
pause

文件内容筛选(type和findstr命令结合使用)

Find常和type命令结合使用

Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行
Type [drive:][path]filename | find /v "string"   #剔除文件中包含string的行
Type [drive:][path]filename | find /c   #显示文件行数 

以上用法将去除find命令自带的提示语(文件名提示):

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V                      显示所有未包含指定字符串的行。
  /C                      仅显示包含字符串的行数。
  /N                      显示行号。
  /I                      搜索字符串时忽略大小写。
  /OFF[LINE]              不要跳过具有脱机属性集的文件。
  "string"                指定要搜索的文字串,
  [drive:][path]filename  指定要搜索的文件。

如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。

find命令不能处理文件中超过1024个字符的数据行,此时可用findstr命令。(见前面介绍)

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B                      在一行的开始配对模式。
  /E                      在一行的结尾配对模式。
  /L                      按字使用搜索字符串。
  /R                      将搜索字符串作为一般表达式使用。
  /S                      在当前目录和所有子目录中搜索匹配文件。
  /I                      指定搜索不分大小写。
  /X                      打印完全匹配的行。
  /V                      只打印不包含匹配的行。
  /N                      在匹配的每行前打印行数。
  /M                      如果文件含有匹配项,只打印其文件名。
  /O                      在每个匹配行前打印字符偏移量。
  /P                      忽略有不可打印字符的文件。
  /OFF[LINE]              不跳过带有脱机属性集的文件。
  /A:attr                 指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file                 从指定文件读文件列表 (/ 代表控制台)。
  /C:string               使用指定字符串作为文字搜索字符串。
  /G:file                 从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir                  查找以分号为分隔符的目录列表
  strings                 要查找的文字。
  [drive:][path]filename  指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。

例如:

FINDSTR "hello there" x.y 在文件 x.y 中寻找 “hello” 或
“there” 。
FINDSTR /C:"hello there" x.y 文件 x.y 寻找 “hello there”。

一般表达式的快速参考:

.        通配符: 任何字符
*        重复: 以前字符或类别出现零或零以上次数
^        行位置: 行的开始
$        行位置: 行的终点
[class]  字符类别: 任何在字符集中的字符
[^class] 补字符类别: 任何不在字符集中的字符
[x-y]    范围: 在指定范围内的任何字符
\x       Escape: 元字符 x 的文字用法
\<xyz    字位置: 字的开始
xyz\>    字位置: 字的结束