写批处理文件,除了了解基本语法外,你还须要熟悉经常使用的windows命令,那就先看看这篇文章:
windows经常使用命令javascript
#重要说明html
文件及目录路径:要使用反斜杠'**\**',不要使用正斜杠'/' 如:del d:\test2\file\my.txt 文件及目录路径:若存在空格,应使用双引号将路径引发来 如:del "d:\program files\file\my.txt" 文件及目录名中不能包含下列任何字符:\ / : * ? " < > |
0. 参数java
bat批处理文件理论上支持无限多个参数的传入,但最多支持**9**个参数的获取 例: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
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能够结束命令执行)windows
work.bat缓存
@echo off net user %0
1. 经常使用特殊符号网络
& 顺序执行多条命令,而无论命令是否执行成功app
例: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. 变量dom
dos计算说明:ide
(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 ^2>%temp%\test.bat call %temp%\test.bat echo %errorlevel%//%errorlevel%=2
方法b:使用vbscript脚本
@echo off echo WScript.Quit ^5>%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 ^2>%temp%\test.bat call %temp%\test.bat echo %errorlevel%//为2 if %var%=="ok" ( echo exit /B ^3>%temp%\test2.bat call %temp%\test2.bat echo %errorlevel%//为2 ) for %%e in (0 1 2 3 4 5 6 7 8 9) do ( echo exit /B ^%%e>%temp%\test3.bat call %temp%\test3.bat echo %errorlevel%//始终为3 if %%e EQU 9 ( echo exit /B ^99>%temp%\test4.bat call %temp%\test3.bat echo %errorlevel%//始终为3 ) else ( echo exit /B ^100>%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_一、Dir_二、Dir_三、Dir_四、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=1,3*表示%%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 2000 > %tmpvbs% echo %time% cscript /nologo "%tmpvbs%" echo %time% if exist "%tmpvbs%" del /f /q "%tmpvbs%"
(3) 使用ping命令来模拟暂停5秒后再执行(时间精度:1秒)
ping /n 1 /w 5000 1.1.1.2 // 注:1.1.1.2为一个永远没法达的IP地址 /n 1:表示尝试次数为1;/w 5000:表示超时时间为5000毫秒
(4) 模拟进度条
@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 2 127.0.0.1>nul echo 100%% 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" ) ) )