标签:
在新窗口开始程序, 或者打开一个文件; 使用unclear algorithm (模糊算法)检查是否第一个参数是窗口标题, 或者是要执行的程序.
hypothesis(猜测): 使用第一个参数外围的引号作为提示, 表明是个窗口标题.
ex.
- start notepad.exe & echo "Done."
打开notepad.exe, 继续处理下一个命令, 无需等待start的命令结束. Keywords: asynchronous(异步)
- start "notepad.exe"
启动一个新的控制台窗口, “”notepad.exe”变成窗口标题, 明显不是想要的结果.
- start "" "C:\Program Files\Internet Explorer\iexplore.exe"
start Internet Explorer. 空字符 “” 作为第一个参数成了console的窗口标题, 但实际上这个console没有打开, 或者至少没有显示出来.
- start "C:\Program Files\Internet Explorer\iexplore.exe"
打开一个新的console窗口, “C:\Program Files\Internet Explorer\iexplore.exe”作为标题, 不是想要的结果.
- start /wait notepad.exe & echo "Done."
start notepad.exe, 在继续执行前要等待它结束.
- start /low notepad.exe & echo "Done."
同上, 但以较低优先级启动程序.
- start "" MyFile.xls
用相应程序打开文本.
- start
在相同的当前文件夹下start一个新的console.
- start .
用 Windows Explorer(资源管理器)打开当前文件夹.
- start ..
用 Windows Explorer打开父文件夹.
- start "" "mailto:"
打开相应程序来写邮件.
- start /b TODO:example-application-where-this-is-useful
start程序而不用打开新的console窗口, 重定向被start的命令的输出, 到console窗口.
显示系统时间.
设置显示在 console窗口上的标题.
打印文件内容到output.
ex.
- type filename.txt
- type a.txt b.txt
- type *.txt
- type NUL > tmp.txt
创建一个空文件(blank file)
显示command processor(命令处理器)或操作系统版本.
C:\>VER
Microsoft Windows XP [Version 5.1.2600]
C:\>
版本string:
- Microsoft Windows XP [Version 5.1.2600]
- Microsoft Windows [Version 6.0.6000]
- …
“version”文字以本地化形式出现.
设置或清除选项: 验证是否 COPY文件 etc. 被正确写入了.
显示卷标(volume label)
Windows命令解释器可以使用外部命令作为单独的可执行程序, 由Microsoft操作系统提供, 或者作为第三方命令解释器bundled(捆绑).
通过替换程序文件, 可以有不同的命令功能.
许多外部命令支持 “/?”约定, 可以将on-line的食欲信息写到标准输出, 退出时的status code为0.
显示或改变 address resolution protocol cache中的 item, 将 IP地址map到物理地址.
安排在某个时间运行一个程序, 参见SCHTASKS.
显示或设置 attribute. 如果没参数, 就显示当前目录下所有文件的attribute. 如果没有attribute修改指令, 它就显示符合搜索通配符规格的文件和目录.
和 unix的 chmod类似.
修改指令:
- 要添加attribute, 在字母前附加 ‘+’
- 要移除attribute, 在字母前附加 ‘-’
- Attributes:
- A - Archived
- H - Hidden
- S - System
- R - Read-only
- …其他
ex.
- attrib
显示当前文件夹下所有文件的 attributes.
- attrib File.txt
显示文件的 attribute.
- attrib +r File.txt
添加 “Read-only”(只读)属性
- attrib -a File.txt
移除 “Archived” (存档)属性.
- attrib -a +r File.txt
移除 “Archived”属性, 添加 “Read-only” 属性.
- attrib +r *.txt
对文件集合进行操作
- attrib /S +r *.txt
在子目录中递归执行.
参见 “attrib /?”.
(XP没有). 修改 Boot Configuration Data (BCD)开机配置数据库文件.
显示或修改 discretionary access control lists (DACLs); 参见 ICACLS
显示或修改 active code page number.
检查磁盘问题, 列出问题然后需要的话就修复.
显示或设置电脑启动时是否启动系统检查. 系统检查使用 Autochk.exe执行. “NTFS”部分会有误导, 这个命令不只可以对 NTFS文件系统使用, 也可以对 FAT和 FAT32文件系统使用.
让用户按一个key来对多种选项进行选择, 然后通过选项设置 error level. Windows2000和 WindowsXP中没有, 它在 Vista中重新引入, Win7, Win8都有.
ex.
- choice /m "Do you agree"
给用户展示一个yes/no question, 选yes时error level为1, 选no为2. 如果按下Ctrl + C, error level为0.
- choice /c rgb /m "Which color do you prefer"
给用户展示一个问题, 以及字母. 根据用户按 r, g, b, error level 设为 1, 2, 3.
也可以用 set /p
显示 encryption state(加密状态), 在 NTFS卷上对文件夹进行 encrypt(加密)或decrypt (解密).
(XP没有) 将管道输入放入剪贴板(clipboard).
ex.
- set | clip
将环境变量列表放入剪贴板.
- clip < File1.txt
将 File1.txt内容放入剪贴板.
调用Microsoft CMD的另一个实例.
比较文件, 参见 FC.
显示或改变文件/文件夹的压缩(compression), 针对 NTFS partitions(分区).
将一个卷(volume)从 FAT16或FAT32文件系统转化为 NTFS文件系统.
使用汇编语言, hexadecimal(十六进制)或 ASCII, 交互式地检测文件以及内存内容.
可以在 32-bit Windows中使用, 包括Win7. 对于64-bit Windows则不确定.
在现代 Windows中, 可以hack地快速查看文件的
Keywords:
hex dump, hexdump, hexadecimal dump, view hex, view hexadecimal, disassembler.
debug提供自己的command line. 使用”?”查看更多.
要查看文件的hex, 调用 debug.exe, 文件名为参数, 反复按”d”.
Limitations:
作为一个DOS程序, debug会在长文件名上卡住. 使用 dir /x来找出 8.3文件名, 在debug中用这个名字.
debug无法查看大文件.
Debug at technet.microsoft.com
Debug for MS-DOS at technet.microsoft.com
W:Debug (command)
比较两个软盘(floppy)的内容.
将 floppy内容拷贝到另一个中.
查看和配置disk partition的属性.
首先, 创建类UNIX的宏(marco). 随后, 提供和 command history相关的function, 强化 command-line编辑.
macro作为短batch脚本的替代.
Macro-related
ex.
- doskey da=dir /s /b
创建一个 marco: “da”
- doskey np=notepad $1
创建 marco: 将第一个参数放入剪贴板
- doskey /macrofile=doskeymacros.txt
从文件中加载 marco定义.
- doskey /macros
列出所有定义的marco, 及其定义.
- doskey /macros | find "da"
列出包含”da”作为子串的所有marco定义. 参见 FIND.
Command history-related
ex.
- doskey /history
列出完整的command history.
- doskey /history | find "dir"
列出每行中包含”dir”作为子串的command history.
- doskey /listsize=100
将command history 的大小设为100.
显示所有已安装的 device driver以及它们的属性.
从压缩的 .cab cabinet文件中提取文件. 参见 MAKECAB.
比较文件, 用一种古怪的方式显示其内容区别.
ex.
- fc File1.txt File2.txt >NUL && Echo Same || echo Different or error
使用 fc的 error level检测区别. error level为0表示文件相同. 非0表示文件有区别, 也有可能文件不存在.
在文件或输入中查找string, 输出匹配的行. 不像 FINDSTR, 它不能递归搜索文件夹, 不能使用正则表达式, 在 sought string(搜索字符串)的外面要用引号包围, space会以字面量形式处理, 而不是当做logical or(逻辑或).
ex.
- find "(object" *.txt
- dir /S /B | find "receipt"
- dir /S /B | find /I /V "receipt"
将所有不匹配的行打印到dir命令的输出中, 忽略大小写的情况.
- find /C "inlined" *.h
输出count(个数)而不是输出匹配的行. 如果搜索多个文件, 为每个文件输出 1个count数字, 跟在一系列dash符号以及文件名后面.
不会输出所有文件中匹配行的总数.
- find /C /V "" < file.txt
输出”file.txt”的 line的个数–line count. 就像 UNIX的 wc -l
. 把”“当做在line上没有找到的string.
重定向确保文件名不会在行数前面输出.
- type file.txt | find /C /V ""
同上, 不同语法.
- type *.txt 2>NUL | find /C /V ""
输出当前文件夹下以”.txt”结尾的文件的line count. 2>NUL
重定向标准错误, 移除了输出中空行后面的文件名.
- find "Sch?nheit" *.txt
如果运行的是个保存为 unicode UTF-8 encoding的 batch文件, 在 *.txt 文件中搜索 search term(搜索词) “Sch?nheit是以 UTF-8 encoded格式化的.
要让它工作, batch文件必须不包含Notepad保存UTF-8时加入的order marker(顺序标记). [Windows的坑]
Notepad++可以让你写UTF-8 encoded plain text, 不带 order marker.
这样用 find命令可以工作, 但 FINDSTR不行.
- find "Copyright" C:\Windows\system32\a*.exe
binary文件也可用.
在文件中用正则表达式或文字string查找. 类似Unix的grep, 不过在正则表达式上支持有限.
正则表达式中的space当做 disjunction(分隔符), 即logical OR, 除非用 /c选项来防止.
ex.
- findstr /s "[0-9][0-9].*[0-9][0-9]" *.h *.cpp
递归搜索所有文件中名字以 .h或 .cpp结尾的, 只打印包含两个连续的十进制数字后面跟两个连续的十进制数字的行.
- findstr "a.*b a.*c" File.txt
输出File.txt所有行中匹配两个以space分隔的正值表达式的行. 效果正则上的逻辑或.
- echo world | findstr "hello wo.ld"
不匹配. 因为在space前的第一项看起来不像regex, findstr把整个search team当做 plain search team来处理.
- echo world | findstr /r "hello wo.ld"
匹配. /r
强制处理regex.
- findstr /r /c:"ID: *[0-9]*" File.txt
输出File.txt中所有匹配单个包含space的正则表达式的行. /c
防止pace被当做一个logic or(逻辑或). /r
打开正则表达式处理, 默认是关闭的.
测试下列语句:
- echo ID: 12|findstr /r /c:"ID: *[0-9]*$"
匹配.
- echo ID: 12|findstr /c:"ID: *[0-9]*$"
不匹配, 查询string没有被解释为正则表达式.
- echo ID: abc|findstr "ID: *[0-9]*$"
匹配, 不理会 echo的输出在匹配整个regex时是失败的: search被解释为对每行进行匹配”ID:”或 “[0-9]$”.
- findstr /ric:"id: *[0-9]*" File.txt
- 同上, 但是大小写敏感.
- findstr可以在单个”/”后面添加开关字符, 但其他命令不行. e.g. dir /bs
不工作, 必须dir /b /s
- 测试语句:
- echo ID: 12|findstr /ric:"id: *[0-9]*$"
- echo ID: ab|findstr /ric:"id: *[0-9]*$"
- findstr /msric:"id: *[0-9]*" *.txt
如上, 但是递归搜索所有文件, 通过 /s
, 只显示匹配的文件, 而不是像 /m
那样显示匹配的行.
- echo hel lo | findstr /c:"hel lo" /c:world
/c选项用来多次创建逻辑或.
- echo \hello\ | findstr "\hello\"
不匹配. 引号和多个字符前面的反斜杠的作用是个转义, 这样 \”和 “匹配.
- echo \hello\ | findstr "\\hello\\"
匹配; 双反斜杠传递给 findstr会变成单个反斜杠.
- echo \hello\ | findstr \hello\
匹配. None of the single backslashes passed to findstr is followed by a character on which the backslash acts as an escape. [不会被当做转义?]
- echo ^"hey | findstr \^"hey | more
要搜索引号 (quotation mark), 需要转义两次: 一次为shell: 使用caret (^), 一次为findstr: 使用backslash ().
- echo ^"hey | findstr ^"\^"hey there^" | more
要搜索引号以及包含在引号中的search term, 为 shell 使用 caret (^)转义引号.
- echo //comment line | findstr \//
如果前置的slash (/) 是 search term的第一个字符, 那需要用 backslash ()进行转义. 即使 search term在引号中也需要用 backslash ()进行转义.
- findstr /f:FileList.txt def.*():
一行行地在 FileList.txt中搜索. 文件名可以包含space, 无需用引号包围.
- findstr /g:SearchTermsFile.txt *.txt
搜索在SearchTermsFile.txt中的search term, 每行一个 search term. space不是用来分隔两个 search term的, 每一行是一个完整的 search term. 如果有一个search term匹配这一行就是匹配的.
如果第一个 search term看起来是个 regex, 搜索会是个 regex的, 如果看起来是个plain search term, 整个搜索会是个 plain的, 即使第二个或后面的 search term看起来是 regex的.
- findstr /xlg:File1.txt File2.txt
输出集合插入: 在两个文件中的行.
- findstr /xlvg:File2.txt File1.txt
输出集合区别: File1.txt - File2.txt.
- findstr /m Microsoft C:\Windows\system32\*.com
binary文件也可用.
正则表达式在”findstr”上的限制, 和”grep”比较:
- 不支持组(groups) – “(“, “)”.
- 不支持贪婪迭代(greedy iterators) – “*?”.
- 不支持 “zero or one of the previous” – “?”.
- 其他.
其他限制: Windows的 FINDSTR有各种限制以及奇怪的行为, 可以通过 /? 查看文档.
What are the undocumented features and limitations of the Windows FINDSTR command? at StackOverflow
通过修改日期和文件pattern来搜索文件, 对每个找到的文件执行命令.
它十分有限, 特别是和Unix的 find命令相比. 从Windows Vista开始可用.
ex.
- forfiles /s /d 06/10/2015 /c "cmd /c echo @fdate @path"
在当前文件夹及其子文件夹下, 对每个在 10 June 2015 或之后修改的文件, 将文件修改日期和全路径输出. 日期格式在 /d后面, 是 locale特定的.
这就允许寻找最近修改的文件. Keywords: 最近修改的文件.
- forfiles /m *.txt /s /d 06/10/2015 /c "cmd /c echo @fdate @path"
同上, 但只找 .txt.结尾的文件.
使用 Windows支持的文件系统如 FAT, FAT32, NTFS来格式化磁盘, 会覆盖磁盘上之前的内容. 要十分小心caution地使用.
和 FAT和 NTFS文件系统相关的强大工具, 理想上是仅仅给 poweruser使用的, 需要对操作系统有广博的知识.
显示 group policy settings, 以及对 user或 computer的更多信息.
在graphics mode(图形模式)下, 启用一个扩展字符集(extended character set).
显示命令帮助:
ex.
- help
显示 Windows支持的命令列表.
- help copy
显示 COPY命令的帮助. 和 copy /?
一样.
(XP没有) 显示或改变文件或文件夹的 discretionary access control lists 参见CACLS.
显示 Windows IP Configuration.
显示connect以及connect名字. (e.g. Ethernet adapter Local Area Connection)
下面显示和 connection有关的特定信息:比如 DNS suffix 和 ip address 以及 subnet mask.
设置或移除一个 disk label(卷标).
将文件压入压缩的 .cab cabinet文件; 参见 EXPAND.
多用途命令, 显示设备状态, 配置端口和设备, 以及其他.
显示文件内容, 每次一屏幕. 当重定向到文件时, 会有一些变化, 依赖于使用的 switch.
ex.
- more Test.txt
- more *.txt
- grep -i sought.*string Source.txt | more /p >Out.txt
- 获取non-Windows grep命令的输出, 它将产生不带CR字符的单独LF字符构成的 line break, 将 LF line break转换为 CR-LF line break.
CR-LF newline被认为是 DOS line break, Windows line break, DOS newline, Windows new line, 以及 CR/LF line ending, 相对应的是 Unix操作系统所使用的 LF line break.
- 在一些设置下, 如果同时输入输入包含 LF line break和 tab的字符, 可能会有一些奇怪的输出.
- 在一些设置下, 有些转换可能不需要 /p. 即使没有 /p, more也会转化 line break.
- more /t4 Source.txt >Target.txt
- 将 tab字符转换为 4个space.
- 在某些设置下, tab转换会自动发送, 即使没有 /t开关. 这种情况下, 默认是8个space.
- Switch /e:
- more的在线文档没有提到 switch. (XP和 Vista)
- /e 在 “more /?” 中提及(XP, Vista).
- 根据 “more /?”, 在help的最后, 列出了 switch支持的 extended feature(扩展特性) 比如: 按下 “=”以显示当前行. 不过 XP和 Vista中, 看起来不带 /e的情况下这是默认可用的.
- 猜测, XP和 Vista中, /e 什么都不做; 只是为了兼容性而保留.
提供多种网络服务, 依赖于所用的命令.
各种可用的命令:
- net accounts
- net computer
- net config
- net continue
- net file
- net group
- net help
- net helpmsg
- net localgroup
- net name
- net pause
- net print
- net send
- net session
- net share
- net start
- net statistics
- net stop
- net time
- net use
- net user
- net view
在打开的文件上进行操作, 特别似乎那些被其他用户通过网络打开的文件.
行为包括: query, display, disconnect.
语法:
- PING /?
- PING address
- PING hostname
通过网络发送 ICMP/IP “echo” 包到指派的地址(或者通过 name lookup, 由指定的hostname map到的第一个 IP地址), 打印所有接收到的 response.
在defective(有问题的)磁盘中, 从毁坏的文件中恢复尽可能多的信息.
将目标文件夹下的同名文件替换为源文件夹下的文件.
(XP没有) 拷贝文件和文件夹. 参见 XCOPY和 COPY.
运行 DLL中的方法. 可用的 DLL和方法在不同的Windows版本中有变化.
ex.
- rundll32 sysdm.cpl,EditEnvironmentVariables
一些Windows版本中, 打开编辑环境变量的对话框.
rundll at robvanderwoude.com
dx21.com - lists rundll32 examples
计划一个在某个时间运行的程序, 比 AT强大很多.
和 SET类似, 但是会影响整个电脑而不仅是当前的 console或 process. XP中没有, Vista及其后版本中可用.
关闭电脑, 或者 log off(注销)当前用户.
字母序(alphabetically)排列, A到Z或 Z到A.
无法以数字排序: 如果在输入的每行中包含一个整数, “12”会出现在”9”前面.
ex.
- sort File.txt
输出排序过的 File.txt的内容.
- sort /r File.txt
逆序排列, Z到A.
- dir /b | sort
将一个 drive letter(盘符, 驱动器名)分配给一个本地文件夹, 显示当前的分配, 或者移除分配.
ex.
- subst p: .
将 p:分配给当前文件夹
- subst
显示之前 subst所有的分配.
- subst /d p:
移除 p:的分配.
显示电脑和操作系统的配置.
结束任务.
ex.
- taskkill /im AcroRd32.exe
结束所有名为 “AcroRd32.exe”的进程; 这会结束所有打开的 Acrobat Reader实例. 进程名可以从 tasklist
中找到;
- taskkill /f /im AcroRd32.exe
同上, 但是强制执行. As above, but forced. 成功结束那些不带 /f就不会结束的任务.
- tasklist | find "notepad"
taskkill /PID 5792
结束那些进程–即带 PID的任务. 假定已经使用 tasklist
找到了 PID.
列出任务, 包括任务名和进程id(PID);
ex.
- tasklist | sort
- tasklist | find "AcroRd"
- tasklist | find /C "chrome.exe"
显示名为 “chrome.exe”的任务个数, 类属于 Google Chrome浏览器.
等待指定的秒数, 显示时间流逝后所剩下的秒数, 运行用户通过输入按键来中断等待. 即 delay
或 sleep
. Vista及其后版本试用.
ex.
- timeout /t 5
等5秒, 允许用户输入按键取消等待.
- timeout /t 5 /nobreak
等5秒, 忽略用户输入除非是 Ctrl+C.
- timeout /t 5 /nobreak >nul
同上, 但没有输出.
XP的Workaround:
- ping -n 6 127.0.0.1 >nul
等待5秒, -n后面的数字是秒数+1. 基于perl的方案需要安装perl.
- perl -e "sleep 5"
等待5秒.
How to wait in a batch script? at stackoverflow.com
Sleeping in a batch file at stackoverflow.com
显示当前目录下所有子文件夹的树形结构, 无论递归有多少层或者多少深度. 如果使用 /F switch, 不仅显示子目录, 还显示文件.
e.g.
- tree
- tree /f
在列表中除了目录还包含文件
- tree /f /a
同上, 但使用 7-bit ASCII字符, 包括 “+”, “-“, “\”以绘制树形.
e.g. 使用 8-bit ASCII字符:
├───winevt
│ ├───Logs
│ └───TraceFormat
├───winrm
e.g. 使用 7-bit ASCII字符:
+---winevt
| +---Logs
| \---TraceFormat
+---winrm
输出文件或文件名pattern的位置, 当文件在 PATHEXT中列出, 文件或pattern无需规定其扩展, 如 .exe. 默认在当前目录以及 PATH中搜索.
和 UNIX的 which目录类似, 不过更灵活.
在 Windows2003, Vista, Win7及其后版本中可用; XP不可用. XP的方案如下.
不会寻找内部命令, 因为没有 .exe文件可以对应.
ex.
- where find
- 输出 find命令的位置, 可能是 C:\Windows\System32\find.exe
. 无需指定 .exe扩展名, 只要它被放在了 PATHEXT
里面, 而这是默认的.
- 如果路径中有 find命令, 也输出它的路径. 一些情况下, 会输出:
C:\Windows\System32\find.exe
C:\Program Files\GnuWin32\bin\find.exe
for %i in (find.exe) do @echo %~$PATH:i
where /r . Tasks*
dir /b /s Tasks*
. /r开关禁止在 PATH的文件夹中搜索.where *.bat
where ls*.bat
where ls*
where *.exe *.com | more
C:\Windows\System32
下的.where $path:*.bat
where $windir:*.exe
where $path:*.bat $windir:*.exe
where /q *.bat && echo Found
启动 Windows Management Instrumentation Command-line (WMIC), 或者带参数, 将参数当做命令传递给 WMIC. XP home版中没有.
ex.
- wmic logicaldisk get caption,description
列出在drive letter(盘符)下可用的驱动(disk磁盘), 可以是 local hard drive, CD-ROM drive, 可移除的 flash drive, network dirve或者使用 SUBST创建的 drive.
比 COPY更高级的方式拷贝文件和目录, 在Vista和之后版本中废弃. 有无数的选项.
ex.
- xcopy C:\Windows\system
拷贝所有文件当当前目录, 但不包含source文件夹下的嵌套目录.
- xcopy /s /i C:\Windows\system C:\Windows-2\system
从源文件夹拷贝所有文件和文件夹到任何嵌套目录(/s), 如果”Windows-2\system”不存在就创建它(/i).
- xcopy /s /i /d:09-01-2014 C:\Windows\system C:\Windows-2\system
同上, 但只拷贝在1 September 2014或其后变化过的文件. Notice 即使是在 non-US locale的 Windows中也是使用 month-first约定的.
- xcopy /L /s /i /d:09-01-2014 C:\Windows\system C:\Windows-2\system
同上, 但通过 /L(list-only, output-only, display-only)进入测试模式.
这不会做真正的拷贝, 纯粹是列出要拷贝的东西.
Windows XP - Command-line reference A-Z at microsoft.com
Windows CMD Commands at ss64.com – licensed under Creative Commons Attribution-Non-Commercial-Share Alike 2.0 UK: England & Wales[1], and thus incompatible with CC-BY-SA used by Wikibooks
The FreeDOS HTML Help at fdos.org – a hypertext help system for FreeDOS commands, written in 2003/2004, available under the GNU Free Documentation License
A Windows Batch File Programming Primer
http://www.vectorsite.net/tsbatch.html
—END—
—YCR—
标签:
原文地址:http://blog.csdn.net/roymuste/article/details/51427319