写批处理文件,除了了解基本语法外,你还需要熟悉常用的windows命令,那就先看看这篇文章:windows常用命令

#重要说明

文件及目录路径:要使用反斜杠'\',不要使用正斜杠'/' 如:del d:\test2\file\my.txt
文件及目录路径:若存在空格,应使用双引号将路径引起来 如:del "d:\program files\file\my.txt"
文件及目录名中不能包含下列任何字符:\ / : * ? " < > |

0. 参数

bat批处理文件理论上支持无限多个参数的传入,但最多支持个参数的获取

例:make_release.bat 258 mslugx 3 4 5 6 7 8 9 10 11 12 13 14 15

%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* // 命令行传递给批处理文件的参数
%0 // 批处理文件名(非全路径)  make_release.bat
%1 // 第1个参数  258
%9 // 第9个参数  9
%* // 从第1个参数开始的所有参数 258 mslugx 3 4 5 6 7 8 9 10 11 12 13 14 15

为了获取更多的参数,可以使用shift命令达到目的

shift /3 // 去掉第3个参数
echo %1 %2 %3 %4 %5 %6 %7 %8 %9 // 输出:258 mslugx 4 5 6 7 8 9 10 11
shift /4 // 在上面剩余参数的基础上,再去掉第4个参数
echo %1 %2 %3 %4 %5 %6 %7 %8 %9 // 输出:258 mslugx 4 6 7 8 9 10 11 12
shift /5 // 在上面剩余参数的基础上,再去掉第5个参数
echo %1 %2 %3 %4 %5 %6 %7 %8 %9 // 输出:258 mslugx 4 6 8 9 10 11 12 13
shift // 在上面剩余参数的基础上,再去掉第1个参数;shift、shift /0和shift /1的作用一致
echo %1 %2 %3 %4 %5 %6 %7 %8 %9 // 输出:mslugx 4 6 8 9 10 11 12 13 14

参数扩展增强(以%1为例说明):【注:以下增强用法也适用于for变量】
%~1   - 删除引号"  (1)若字符串首尾同时存在引号,则删除首尾的引号;(2)若字符串尾不存在引号,则删除字符串首的引号;(3)如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
%~f1  - 将文件名扩展到一个完全合格的路径名
%~d1 - 将文件名扩展到一个驱动器号
%~p1 - 将文件名扩展到一个路径
%~n1 - 将文件名扩展到一个文件名
%~x1 - 将文件名扩展到一个文件扩展名
%~s1 - 扩展的路径指含有短名
%~a1 - 将 %1 扩展到文件属性
%~t1 - 将 %1 扩展到文件的日期/时间
%~z1 - 将 %1 扩展到文件的大小
%~$PATH:1 - 查找列在 PATH 环境变量的目录,并将 %1扩展到找到的第一个完全合格的名称
                     如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串

组合修定符:
%~dp1 - 将 %1 扩展到驱动器号和路径
%~nx1 - 将 %1 扩展到文件名和扩展名
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,并扩展到找到的第一个文件的驱动器号和路径
%~ftza1 - 若 %1 为目录或文件,会转变成dir的输出行

注:%~dp0   返回当前bat文件所在目录的全路径

注:%~n0 返回当前bat文件名(不含扩展名)

注:%~nx0 返回当前bat文件名(含扩展名)

使用for和goto打印各个参数

@echo off
call process.bat %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% "%random%"
pause

process.bat

set "f=%*"
if not defined f (echo 没有参数! & goto :eof)
echo 过程名称: %0
echo 完整参数: %*
echo --------------------------------------
echo 用for循环:
set /a x=1
for %%i in (%*) do (call echo 第%%x%%个参数 %%~i & set /a x+=1)
echo --------------------------------------
echo 用goto循环:
set /a y=1
:loop
set "t=%~1"
if not defined t goto :eof
echo 第%y%个参数: %~1
set /a y+=1
shift
goto loop

无限循环执行net user命令(按ctrl+c可以结束命令执行)

work.bat

@echo off
net user
%0

1. 常用特殊符号

& 顺序执行多条命令,而不管命令是否执行成功
例:cd /d d:\src&work.exe /o c:\result.txt // 先将当前工作目录切换到d:\src下,然后执行work.exe /o c:\result.txt命令

&& 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
例:find "ok" c:\test.txt && echo 成功 // 如果找到了"ok"字样,就显示"成功",找不到就不显示

|| 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
例:find "ok" c:\test.txt || echo 不成功 // 如果找不到"ok"字样,就显示"不成功",找到了就不显示

| 管道命令
例:dir *.* /s/a | find /c ".exe" // 先执行dir命令,然后对输出的结果执行find命令(输出当前文件夹及所有子文件夹里的.exe文件的个数)

> 将当前命令输出以覆盖的方式重定向
例:tasklist > p1.txt // 将tasklist的输出以覆盖的方式重定向到p1.txt文件中

>> 将当前命令输出以追加的方式重定向
例:tasklist >> p2.txt // 将tasklist的输出以追加的方式重定向到p2.txt文件中

< 从文件中获得输入信息,而不是从屏幕上,一般用于date time label等需要等待输入的命令
例:date <temp.txt // temp.txt中的内容为2005-05-01

@ 命令修饰符 在执行命令前,不打印出该命令的内容
例:@cd /d d:\me // 执行该命令时,不打印出命令的内容:cd /d d:/me

^ 转义字符及echo续行符号
(1) 用在特殊字符前面,用于取消该特殊字符的作用。支持的特殊字符有&、|、>、<、(、)、!、"等,不包括%
(2) echo输出时,可以将^后的下一行的字符串拼接在当前行后输出

$ 在prompt命令中,称为选项转义字符,可以将其后的字符转义为特定的作用效果。

>&  将一个句柄的输出写入到另一个句柄的输入中。

<&  与>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中

% 非延迟环境变量引用符号

! 延迟环境变量引用符号

: 批处理标签引导符

nul 用于屏蔽命令的输出结果,常见用于pause > nul;有时我们输错命令,cmd上会提示:xx‘不是内部或外部命令...为了完全屏蔽掉这些,可以使用xx >nul 2>nul

* ?  文件通配符,*代表n个字符,?代表1个字符

2. 变量

dos计算说明:

(1)只能进行整数运算,精确到整数,不能进行浮点运算
(2)只能精确到32位,有效值范围是-2147483648至2147483647
(3)十六进制前缀为:0x  八进制前缀为:0

自定义变量

在定义变量时要尤其注意空格,如下:

set var1 =test // 在等号前加了一个空格,那么定义的变量名为"var1 ",而不是"var1"
set var2= test // 在等号后加了一个空格,那么定义的变量var2为" test",而不是"test"

-------------------------------------------

set var=你好
echo %var% // 输出:你好
set var // 查看所有以var开头变量的值
set var=//清空var变量,var变成not defined状态

--------------------------------------

set /p var=请输入变量的值:     // 等待用户输入到var变量中

--------------------------------------

set /p= hello world! <nul // 输出hello world! 到屏幕上,字符串开头的空格将会被去除掉,结尾的空格会被保留

set /p .= hello world! <nul // 与上面命令含义一样,只是写法不同

<nul set /p= hello world! // 与上面命令含义一样,只是写法不同

--------------------------------------

set var=0812
set /a var=1%var%-10000   // var=812

--------------------------------------

set /a var=39 // 设置var为数值型变量,值为39
set /a var=39/10 // 支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
set /a var=var/10 // 用 /a 参数时,=后的变量可以不加%直接引用
set /a var="1&0" // &运算要加引号 值为0
set /a var=1"&"1 // 或者单独将&运算加引号,值为1
set /a var=1"^"1 // 异运算,值为0
set /a var=26"%"3 // 取模运算,值为2
set /a var=1^<^<5 // 左移位运算(使用^转义字符修饰<,等价于1"<<"5),2的5次幂,结果32
set /a var=3"<<"2 // 左移位运算,3的二进制为11,左移2位为1100,结果为12
set /a var=4">>"2 // 右移位运算,4的二进制为100,右移动2位为1,结果为1

符号的优先级如下:

()         小括号
! ~ -     一元运算符
* / %   算数运算符
+ -      算数运算符
<< >> 二进制逻辑移位
&         二进制按位“与”
^         二进制按位“异”
|          二进制按位“或”
= *= /= %= += -=     算数赋值
&= ^= |= <<= >>=    二进制运算赋值
,                                逗号表达式分隔符

--------------------------------------

字符串拼接

set var1=很好,
set var2=非常好!
set var3=%var1%%var2%
echo %var3% // 输出:很好,非常好!

字符串替换

%p:str1=str2%  // 将字符串变量%p%中的str1替换为str2

set p=www. qq. com
set var=%p: =% // 去掉p中的空格并赋值给var,值为www.qq.com
echo %var:.=#% // 将var变量中.替换成#,输出www#qq#com
echo %var:*qq=a% // 第一个qq及其之前的所有字符被替换为a,输出a.com

set time_str=%time%
echo %time_str::=-%  // 14-21-31.67

字符串截取

%a:~[m[,n]]% // 符号~可以简单理解为“偏移”,m为偏移量(缺省为0),n为截取长度(缺省为全部)

set p=www.qq.com
set var=%p:~5% // 从位置5(索引从0开始)开始截取后续字符串并赋值给var,值为qq.com
echo %p:~5,2% // 从位置5(索引从0开始)开始截取后续2个字符,输出qq
echo %p:~-3% // 从倒数第3的位置开始截取后续字符串,输出com
echo %p:~0,-4% // 从头开始截取后续字符串(最后4个字符不截取),输出www.qq

set date_str=%date%
echo %date_str:~0,10%  // 2019/07/31

延迟变量    形如:!var!

当我们准备执行一条命令的时候,命令解释器会将变量的值先读取出来,然后再运行这条命令。
但有时候,变量的值在该条命令执行过程中被改变,如果不使用延迟变量就会使用的变量改变前的值,这就不是我们想要的结果了。

set a=1
set /a a+=1 > nul & echo %a% // 输出1,不为2

开启延迟变量的方法:

(1)cmd下开启/关闭延迟环境变量:
       cmd /v:on //开启延迟环境变量
       cmd /v:off //关闭延迟环境变量

(2)批处理bat文件中开启/关闭延迟环境变量
      setlocal EnableDelayedExpansion //开启延迟环境变量
      setlocal DisableDelayedExpansion //关闭延迟环境变量

如上示例在bat文件中修改成如下,就可以输出2了

setlocal EnableDelayedExpansion
set a=1
set /a a+=1 > nul & echo !a! // 输出2

系统变量

%random%:获取[0,32767]之间的随机整数
例:set /a n=%random% * 100 / 32768 + 1 // 获取[1,100]之间的随机整数
例:set /a n=%random% %%100 +1 // 获取[1,100]之间的随机整数

%allusersprofile% // 返回“所有用户”配置文件的位置
%appdata% // 返回默认情况下应用程序存储数据的位置
%cd% // 返回当前目录字符串
%cmdcmdline% // 返回用来启动当前的 cmd.exe 的准确命令行
%cmdextversion% // 返回当前的“命令处理程序扩展”的版本号
%computername% // 返回计算机的名称
%comspec% // 返回命令行解释器可执行程序的准确路径
%date% // 返回当前日期。使用与 date /t 命令相同的格式
%errorlevel% // 返回上一条命令的错误代码。通常用非零值表示错误
%homedrive% // 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的
%homepath% // 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的
%homeshare% // 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的
%logonserver% // 返回验证当前登录会话的域控制器的名称
%number_of_processors% // 指定安装在计算机上的处理器的数目
%os% // 返回操作系统名称。windows 2000显示其操作系统为 windows_nt
%path% // 指定可执行文件的搜索路径
%pathext% // 返回操作系统认为可执行的文件扩展名的列表
%processor_architecture% // 返回处理器的芯片体系结构。值:x86 或 ia64 基于itanium
%processor_identfier% // 返回处理器说明
%processor_level% // 返回计算机上安装的处理器的型号
%processor_revision% // 返回处理器的版本号
%prompt% // 返回当前解释程序的命令提示符设置。由 cmd.exe 生成
%systemdrive% // 返回包含系统根目录的驱动器
%systemroot% // 返回系统根目录的位置
%temp% %tmp% // 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 temp,而其他应用程序则需要 tmp
%time% // 返回当前时间。使用与 time /t 命令相同的格式
%userdomain% // 返回包含用户帐户的域的名称
%username% // 返回当前登录的用户的名称
%userprofile% // 返回当前用户的配置文件的位置
%windir% // 返回操作系统目录的位置

errorlevel说明

①设置errorlevel的方法

方法a:使用call命令

@echo off
echo exit /B ^>%temp%\test.bat
call %temp%\test.bat
echo %errorlevel%//%errorlevel%=2

方法b:使用vbscript脚本

@echo off
echo WScript.Quit ^>%temp%\test.vbs
cscript /nologo %temp%\test.vbs
echo %errorlevel%//%errorlevel%=5

方法c: 使用windows版的gawk工具

@echo off
gawk.exe "BEGIN{exit 12}"
echo %errorlevel%//%errorlevel%=12

②开启延迟变量时,建议使用!errorlevel!来引用变量(虽然在win7下%errorlevel%引用也没问题)

③echo、set命令不会设置errorlevel的值

④当前整个局部块中的errorlevel不变,为上个局部块最后一个命令的返回码(类似于:进程main函数的返回值)

⑤判断errorlevel最好是在全局域中(不要在if、for等语句块中)

@echo off
set var="ok"
echo exit /B ^>%temp%\test.bat
call %temp%\test.bat
echo %errorlevel%//为2
if %var%=="ok" (
echo exit /B ^>%temp%\test2.bat
call %temp%\test2.bat
echo %errorlevel%//为2
) for %%e in ( ) do (
echo exit /B ^%%e>%temp%\test3.bat
call %temp%\test3.bat
echo %errorlevel%//始终为3 if %%e EQU (
echo exit /B ^>%temp%\test4.bat
call %temp%\test3.bat
echo %errorlevel%//始终为3
) else (
echo exit /B ^>%temp%\test5.bat
call %temp%\test3.bat
echo %errorlevel%//始终为3
)
) echo %errorlevel%//为99

setlocal/endlocal间的系统变量视为临时变量

@echo off
setlocal
path=d:\
echo 局部环境变量path值
echo %path%  // 输出:d:\
endlocal
echo 系统环境变量path的值
echo %path% // 输出系统环境变量%path%的值

3. if命令

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

------------------------------------

net user
if %errorlevel%==0 echo net user 执行成功了!
------------------------------------

xcopy from.txt to.txt
if errorlevel 0 echo 文件复制没有错误! // if errorlevel 0表示errorlevel>=0;因此当from.txt文件不存在时,errorlevel=4,仍然会打印:文件复制没有错误!
------------------------------------

xcopy from.txt to.txt
if %errorlevel%==0 (echo 文件复制没有错误!) else echo 文件复制出错!
------------------------------------

xcopy test.bat to.txt
if %errorlevel% == 0 (
echo 文件复制没有错误!
) else (
echo 文件复制出错!
)
------------------------------------

set /p v1=请输入第一个比较字符:
set /p v2=请输入第二个比较字符:
if %v1% == %v2% (echo v1等于v2.) else echo v1不等于v2. // 会将v1与v2的前后空格去掉后,进行比较(大小写敏感)
------------------------------------

set /p v1=请输入第一个比较字符:
set /p v2=请输入第二个比较字符:
if "%v1%" == "%v2%" (echo v1等于v2.) else echo v1不等于v2. // 不进行空格处理,直接对v1与v2进行比较(大小写敏感)
------------------------------------

set /p v1=请输入第一个比较字符:
set /p v2=请输入第二个比较字符:
if /i "%v1%" == "%v2%" (echo v1等于v2.) else echo v1不等于v2. // 不进行空格处理,直接对v1与v2进行比较(大小写不敏感)
------------------------------------

set /p var=请输入一个数字:
if %var% LEQ 5 (echo var小于等于5.) else echo var大于5.

还有一些用来判断数字的符号:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
------------------------------------

set var=
if not defined var (echo 变量var未定义.) else echo 变量var存在.

------------------------------------

set var=
if [%var%] == [] (echo 变量var为空.) else echo 变量var不为空.

------------------------------------

if not exist "c:\test" (
echo 不存在test文件夹!
md "c:\test"
) else (
echo 存在test文件夹!
rd "c:\test"
)
------------------------------------

4. goto命令

@echo off
if "%1" == "" goto x86
if not "%2" == "" goto usage

if /i %1 == x86 goto x86
if /i %1 == x64 goto x64

goto usage

:x86
if not exist "%~dp0bin\vcvars32.bat" goto missing
call "%~dp0bin\vcvars32.bat"
goto :eof

:x64
if not exist "%~dp0bin\amd64\vcvarsamd64.bat" goto missing
call "%~dp0bin\amd64\vcvarsamd64.bat"
goto :eof

:usage
echo Error in script usage. The correct usage is:
echo %0 [option]
echo where [option] is: x86 ^| x64
echo:
echo For example:
echo %0 x86
goto :eof

:missing
echo The specified configuration type is missing. The tools for the
echo configuration might not be installed.
goto :eof

5 子程序调用

@echo off
call :fun return 你好  // 调用fun子程序,并传入2个参数
echo 子程序返回值:%return%  // return此时为一个变量,其值为:你好
pause
goto :eof

:fun
echo ++%1++ ++%2%++   // 输出:++return++ ++你好++
set %1=%2
goto :eof

5. for命令

for %%i in (c:\*) do echo %%i   // 打印出c盘根目录下的所有文件(不递归子目录)

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

for /d %%i in (c:\*) do echo %%i  // 打印出c盘根目录下的所有文件夹(不递归子目录)

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

for /r "c:\" %%i in (*.exe) do echo %%i  // 将C盘根目录(递归子目录)下所有exe文件的路径都列出来

------------------------------------
for /r %%i in (*.doc *.xls) do echo %%i   // 将当前目录(递归子目录)下所有doc文件和xls文件的路径都列出来

------------------------------------
for /r "c:\" %%i in (notepad.exe) do if exist %%i echo %%i  // 将C盘根目录(递归子目录)下包含notepad.exe文件的路径都列出来

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

for /l %%i in (1,2,5) do @echo %%i    // (1,2,5):(start,step,end);打印出:1 3 5

------------------------------------

for /l %%i in (1,1,5) do (
md Dir_%%i
echo 创建Dir_%%i...
)   // 在当前目录下,新建名为Dir_1、Dir_2、Dir_3、Dir_4、Dir_5五个新目录

------------------------------------

set s=AA BBB CCCC D
for %%a in (%s%) do echo %%a  // 遍历s字符串,共循环4次,打印出AA、BBB、CCCC、D

------------------------------------

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]

echo 01段 02段 03段 04段 05段 06段 >"C:\Program Files\test.txt"
echo ;注释行,这是临时文件,仅仅用于测试 >>"C:\Program Files\test.txt"
echo ;kekec 20140901 >>"C:\Program Files\test.txt"
echo 11段 12段 13段 14段 15段 16段 >>"C:\Program Files\test.txt"
echo 21段,22段,23段,24段,25段,26段 >>"C:\Program Files\test.txt"
echo 31段-32段-33段-34段-35段-36段 >>"C:\Program Files\test.txt"
for /f "skip=1 eol=; tokens=1,3* delims=,-  usebackq" %%i in ("C:\Program Files\test.txt") do echo %%i %%j %%k

输出结果:
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
------------------------------------

skip:1 表示忽略开头的一行内容
eol指明;开头的为注释行,处理时会被忽略
tokens=,*表示%%i %%j %%k分别代表一行中的第1个字段、第3个字段及第3个字段后的所有内容(从%%i开始命名是因为%%i in ("C:\Program Files\test.txt")),若有第4个字段第5个字段,则为%%l、%%m,以此类推!
delims指明逗号、减号、空格为分割符,默认是空格和tab为分割符
usebackq 使用后引号(键盘上数字1左面的那个键`)。
              未使用参数usebackq时:file-set表示文件,但不能含有空格;双引号表示字符串,即"string";单引号表示执行命令,即'command'
              使用参数usebackq时:file-set和"file-set"都表示文件(当文件路径或名称中有空格时,就可以用双引号括起来);单引号表示字符串,即'string';后引号表示命令执行,即`command`

for /f "tokens=1,2*" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') do set MyDocument=%%k//%MyDocument%为当前用户的我的文档路径(如:C:\Users\James\Documents)

for变量扩展增强  注:delims==及delims=表示不要分割符

for /f "delims==" %%i in ('dir /b') do @echo %%~i  // 删除引号" (1)若字符串首尾同时存在引号,则删除首尾的引号;(2)若字符串尾不存在引号,则删除字符串首的引号;(3)如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
for /f "delims==" %%i in ('dir /b') do @echo %%~fi  // 将文件或目录名扩展到一个完全合格的路径名
for /f "delims==" %%i in ('dir /b') do @echo %%~di // 将文件或目录名扩展到一个驱动器号
for /f "delims==" %%i in ('dir /b') do @echo %%~pi // 将文件或目录名扩展到一个路径
for /f "delims==" %%i in ('dir /b') do @echo %%~ni // 将文件或目录名扩展到一个文件名
for /f "delims==" %%i in ('dir /b') do @echo %%~xi // 将文件或目录名扩展到一个文件扩展名,目录不存在扩展名,会输出错误提示:ECHO 处于关闭状态。
for /f "delims==" %%i in ('dir /b') do @echo %%~si // 将文件或目录名扩展到一个短路径名
for /f "delims==" %%i in ('dir /b') do @echo %%~ai // 扩展到文件属性 形如:--a------
for /f "delims==" %%i in ('dir /b') do @echo %%~ti // 扩展到文件或目录的修改日期时间
for /f "delims=" %%i in ('dir /b') do @echo %%~zi // 扩展到文件或目录的大小(单位:byte),目录返回的大小貌似不对
for /f "delims=" %%i in ("notepad.exe") do echo %%~$PATH:i // 在PATH变量里指定的路径里搜索notepad.exe文件,如果有notepad.exe则把绝对路径打印出来,没有会输出错误提示:ECHO 处于关闭状态。

6 综合应用

(1) win7下修改dsw文件的关联图标

在xp下,我们可以通过文件夹选项 --文件类型 -- 选中要修改的文件类型,然后点“高级”  -- 更改图标来达到目的,然而win7下已经不提供这种修改方法了。

@echo off
rem 获取dsw的文件类型
set dswcmd=reg query HKCR\.dsw /ve
for /f "tokens=1,2,3 usebackq" %%i in (`"%dswcmd%"`) do @set dswconf=%%k
rem 设置dsw的文件类型的缺省图标为msdev.exe的图标
set dswicon=HKCR\%dswconf%\DefaultIcon
for /f "delims=" %%i in ("msdev.exe") do @set msdevpath=%%~$PATH:i
reg add %dswicon% /t REG_SZ /d "\"%msdevpath%\",-20214" /f
rem 关联Progid到dsw的文件类型
reg add HKCU\software\microsoft\windows\currentversion\explorer\fileexts\.dsw\userchoice /v Progid /t REG_SZ /d "%dswconf%" /f

具体关联exe中的那个图标资源,可以使用Resource Hacker工具来查询,如下:

(2) 将脚本sleep两秒后再执行(时间精度:0.001秒)

@echo off
set tmpvbs=%temp%\tmp$$$.vbs
echo WScript.Sleep > %tmpvbs%
echo %time%
cscript /nologo "%tmpvbs%"
echo %time%
if exist "%tmpvbs%" del /f /q "%tmpvbs%"

(3) 使用ping命令来模拟暂停5秒后再执行(时间精度:1秒)

ping /n  /w  1.1.1.2  // 注:1.1.1.2为一个永远无法达的IP地址  /n 1:表示尝试次数为1;/w 5000:表示超时时间为5000毫秒

(4) 模拟进度条

@echo off
mode con cols= lines= &color 9f
cls
echo.
echo 程序正在初始化. . .
echo.
echo ┌──────────────────────────────────────┐
set /p=" -■"<nul
for /L %%i in ( ) do set /p a=■<nul&ping /n 2 127.0.0.1>nul
echo %%
echo └──────────────────────────────────────┘

注:ping /n 2 127.0.0.1的执行时间为1秒;ping /n 2 127.0.0.1>nul表示不将执行结果打印到屏幕上

(5) 强制结束指定路径下的进程及其子进程

@echo off
setlocal enabledelayedexpansion
set processname=client.exe
set processpath=D:\NZTest\体验服\TCLS
set "str=wmic process where caption="%processname%" get ExecutablePath^,ProcessId"
for /f "skip=1 tokens=*" %%i in ('!str!') do (
for /f "tokens=1-2" %%a in ("%%i") do (
if /i "%%a"=="%processpath%\%processname%" (taskkill /F /PID %%b /t)
)
)

注1:进程路径和进程名称中不能有空格

注2:只结束"D:\NZTest\体验服\TCLS"目录下的所有名为client.exe进程

(6) 强制结束指定参数及指定路径下的进程及其子进程

@echo off

setlocal enabledelayedexpansion

set /a matchName=0
set /a match=0
set pid=""
set LastFullPath=""
set getFullPath=""
set processnames=UE4Editor.exe UE4Editor-Win64-DebugGame.exe UE4Editor-Win64-Debug.exe
set processpath=D:\svn\UnrealEngine\Engine\Binaries\Win64
set arg=" -hello" for %%m in (%processnames%) do ( set "str=wmic process where caption="%%m" get CommandLine^,ExecutablePath^,ProcessId"
echo !str! for /f "skip=1 tokens=*" %%i in ('!str!') do (
set /a matchName=0
set /a match=0
for %%a in (%%i) do (
set pid=%%a
set LastFullPath=!getFullPath!
set getFullPath=%%a
) if /i "!LastFullPath!"=="%processpath%\%%m" (set /a matchName=1) if !matchName!==1 (
echo %%i | findstr /c:!arg! 1>nul
if not errorlevel 1 (set /a match=1)
) if !match!==1 (taskkill /F /PID !pid! /t)
)
)

注1:进程路径和进程名称中不能有空格

注2:只结束"D:\svn\UnrealEngine\Engine\Binaries\Win64"目录下的所有名为UE4Editor.exe或UE4Editor-Win64-DebugGame.exe或UE4Editor-Win64-Debug.exe且参数中含有" -hello"字符串的进程(参数字符串区分大小)

(7) 重建win7图标缓存

@echo off
rem 关闭Windows外壳程序explorer
taskkill /f /im explorer.exe
rem 清理系统图标缓存数据库
attrib -h -s -r "%userprofile%\AppData\Local\IconCache.db"
del /f "%userprofile%\AppData\Local\IconCache.db"
attrib /s /d -h -s -r "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\*"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_32.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_96.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_102.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_1024.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_idx.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_sr.db"
rem 清理系统托盘记忆的图标
reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v IconStreams /f
reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v PastIconsStream /f
rem 重启Windows外壳程序explorer
start explorer

(8) 修复win7桌面图标黑块

@echo off
reg delete "hkcu\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /f
reg delete "hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /f
taskkill /f /im explorer.exe & start explorer.exe

(9) 删除没有svn受控的目录及文件

@echo off
setlocal EnableDelayedExpansion for /f "tokens=1,*" %%i in ('svn.exe status "D:\Client\Assets"') do (
if %%i==? (
if exist "%%j\*" (
echo 删除目录 - %%j
rd /s /q "%%j"
) else (
del /f /s /q "%%j"
)
)
)

windows批处理语法的更多相关文章

  1. windows bat批处理语法简析

    第一节先介绍windows批处理.这个起源于跟旁边同事学习在windows用命令行办公,渐渐地有些批处理功能就需要了,于是专门抽出了几天学习了一下.我认为文档最重要的功能是为了备忘,择取了很多文档的例 ...

  2. WINDOWS批处理命令使用大全

    来源:http://www.942dn.com就是爱电脑网 WINDOWS批处理命令使用大全 批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母.它的构成没有固定格式, ...

  3. [转帖]Windows批处理(cmd/bat)常用命令小结

    Windows批处理(cmd/bat)常用命令小结 非常值得学习的文档 先放这里 有时间做实验, 转载自:“趣IT”微信公共号 前言 批处理文件(batch file)包含一系列 DOS命令,通常用于 ...

  4. Windows 批处理大全(附各种实例)

    Windows 批处理大全(附各种实例) 2009年07月19日 21:31:00 阅读数:2552 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命 ...

  5. windows 批处理语言学习

    程序员应该根植于心的一个理念是:重复的工作交给代码.windows上的批处理脚本就是这种理念的体现. 批处理bat能做的事很多,自动配置vs工程中的代码依赖环境,调用其它程序处理数据.自动编译代码等等 ...

  6. Windows 批处理(cmd/bat)常用命令教程

    Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题: 1.如果你自己编写的.bat文件,双击打开,出现闪退 2.批处理.bat 文件中输出中文乱码 解决方法在文章末尾! ...

  7. RunDll32.exe 详解及[Windows批处理]清除IE缓存

    Rundll32命令详解 文件作用:执行32位DLL文件中的内部函数 位置:X:(当前系统分区)\windows\system32 命令语法: Rundll32.exe DLLname,Functio ...

  8. Windows批处理(cmd/bat)常用命令

    Windows批处理(cmd/bat)常用命令 一.总结 一句话总结: 1.批量处理图片的方式? PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本: 2.大量的重复的操作 ...

  9. Windows 批处理入门

    Windows 批处理入门   目录 本教程概述 用到的工具 标签 简介 1.命令简介 2.符号简介 3.语句结构 4.实例讲解 本教程概述 本课我们学习windows批处理 用到的工具 cmd.ex ...

随机推荐

  1. Delphi dll 断点调试

    1.dll 要有一个依托的exe(怎么做 相信用dll了一定知道) 2.选项中的compling中的debugging中的选项,linking中的所有选项 3.最后一个也就是最重要的 run中的par ...

  2. php 如何解决“您访问的域名有误或网页不存在”

    对一个域名访问,在家访问正常,到办公室就总是看到下面的页面. 清楚浏览器浏览数据是一个解决途径.这里通过Chrome浏览做示例.通过标记路径,进入清除界面. 也可以在浏览器地址中输入 chrome:/ ...

  3. ionic 微信分享值各种坑

    去前段时间公司的app需要做微信分享,然后网上找的教程,在做的时候发现网上的教程各种坑,现在将做得过程分享出来 在做功能之前你需要做几步预备工作, 1.安装jdk,jre,并加入全局变量[这个网上还是 ...

  4. 网站访问量大 怎样优化mysql数据库

    MySQL优化的一些建议,单机MySQL的优化我分为三个部分,一是服务器物理硬件的优化,二是 MySQL安装时的编译优化,三是自身配置文件my.cnf的优化:如果单机的优化也解决不了你的数据库的压力的 ...

  5. C++箴言:理解typename的两个含义

    C++箴言:理解typename的两个含义 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class ...

  6. webpackJsonp is not defined?

    用了CommonsChunkPlugin生成了公共文件,但是页面还没有引用这个公共文件 比如下面这个配置 var webpack = require('webpack'); var path = re ...

  7. QT C1041错误

    使用QT Createor + MSVC2013写程序时.我复制了一份之前OK的代码到新的工程中,工程名字和之前的工程一样,出现了奇怪的错误.开始程序总是崩溃,后来我删掉shadow build目录, ...

  8. getCanonicalName和getSimpleName getName的区别与应用

    接口: package com.test; public interface Fruit { } 一个实现类: package com.test; public class Apple impleme ...

  9. jaxb

    一.简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实 ...

  10. uboot学习第一天

    Windows操作系统BIOS(设置) Windows系统 文件系统 驱动程序 应用程序 linux操作系统bootloader(引导系统) kernel(内核) 文件系统 驱动程序 应用程序 交叉编 ...