admin 管理员组

文章数量: 887021

windows脚本

在 Windows 平台下,有时候会通过脚本来做一些快速的批量的操作,不仅节省时间,使用起来还很方便,可以进行批量处理文件,杀死进程等操作。脚本使用方法总结的比较好的一篇文章见:传送门。

脚本常用示例

(1)创建 bat 脚本及中文乱码问题
在 Windows 平台下,新建一个文本文档,然后将其后缀名改为 bat 即可,例如:test.bat,这样就创建好了一个脚本文件,添加内容后直接双击文件即可运行,简单易用。
不过,这种方法新建的脚本常常会无法正常显示中文
原因:
批处理文件,是以ANSI编码方式。若以别的方式(如UTF-8)编辑了批处理,转换成ANSI格式即可,正常创建的文件的格式都是utf-8的。
解决:
在代码里修改执行时的编码格式:

@echo off
::后续命令使用的是:UTF-8编码
chcp 65001
echo 中文
pause

其他 类似转换:

doc 代码页(自行百度):
chcp 65001  就是换成UTF-8代码页
chcp 936 可以换回默认的GBK
chcp 437 是美国英语

实现sleep定时功能

在实际使用中,经常会想要定时去处理东西,但是windows脚本很奇怪,竟然没有类似linux 下的sleep()函数功能,很是吃惊。网上多是利用ping指令来模拟定时功能。例如:

ping 168.11.1.1 -n 1 -w 1000 >nul

切记,这个ip地址一定要不能ping通,要是能ping通的话,时间就完全不对了。需要更换一个不能ping通的ip地址。

-n 参数为ping的次数,-w为每一次的超时时间,单位是毫秒,1000即1s,需要其他时间可相应进行换算。所以上述指令可以模拟出1s的时间,类似于linux下的sleep(1)。这个可以用于脚本的时间精确要求不高场景。

死循环功能脚本

在写脚本时,有时想要用到死循环进行测试,可使用以下示例:

:loop
::添加自己要执行的任务
echo  add your own work !
goto:loop

利用goto功能来无线跳转,实现类似while(1)死循环的功能。

pause后重新执行

@echo off
:loop
set /p var=please input num:
echo your input num=%var% 
pause
goto:loop

如上,每执行一次便会暂停,按键enter后便会重新全部执行,主要还是利用goto实现总体的循环。

查看进程及杀死进程

使用tasklist指令来查看windows下正在运行的进程。

tasklist指令的使用方法如下:

可以通过PID来杀死进程,也可以直接杀死对应的进程名称,*.exe。

例如:
  	:: 利用进程名杀死对应进程进程
    TASKKILL /IM notepad.exe
    :: 利用pid杀死1230 1241 1253 及其子进程
    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
    ::其他
    TASKKILL /F /IM cmd.exe /T
    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
    TASKKILL /S system /U 域\用户名 /FI "用户名 ne NT*" /IM *
    TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"

setlocal 与 变量延迟

本条内容引用[英雄出品]的批处理教程:
要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。
为了更好的说明问题,我们先引入一个例子。
例1:

@echo off
set a=4
set a=5 & echo %a%
pause

结果:4
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?
让我们先了解一下批处理运行命令的机制:
批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例1,批处理在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)
而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:
例2:

@echo off
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause 

结果:5
解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。
分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为
4,“set a=5 & echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。
再举一个例子巩固一下。
例3:

@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
pause

结果:
1
2
3
4
5
解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什
么结果呢?结果是这样的:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
即没有感知到for语句中的动态变化。
提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也可以加以利用,看例子。
例:交换两个变量的值,且不用中间变量

@echo off
::目的:交换两个变量的值,但是不使用临时变量
::Code by JM 2007-1-24 [email=CMD@XP]CMD@XP[/email]
::出处:http://www-dos/forum/viewthread.php?tid=27078
set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2%& set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
pause

输出空行

echo输出空行

原生态的解释遗漏了echo另外一个重要功能:输出空行。在DOS脚本中,有时为了调试方便,加入一下空行。很多文章或者教程给出的解决方案都是在echo后面加一个点号echo.,这样就会输出空行。即:

echo.
其实:echo输出空行的方法至少有十种:

echo=
echo,
echo;

echo+
echo/
echo[
echo]

echo:
echo.
echo
这十种方法可以分为三组,每组的效率依次递减,第一组的效率是最高的。

修改cmd窗口大小、标题、字体、背景颜色

①改变窗口大小

 mode con cols=80 lines=80

②设置cmd窗口的标题

 title=设置窗口标题

③改变字体及背景颜色

 color    [fb]

例如:  color 0a
说明:
F:前景颜色,即字体颜色
B:背景颜色,即CMD窗口的背景颜色

颜色属性由两个十六进制数字指定 – 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

 0 = 黑色                     8 = 灰色
 1 = 蓝色                     9 = 淡蓝色
 2 = 绿色                     A = 淡绿色
 3 = 湖蓝色                  B = 淡浅绿色
 4 = 红色                     C = 淡红色
 5 = 紫色                     D = 淡紫色
 6 = 黄色                     E = 淡黄色
 7 = 白色                     F = 亮白色

例如: "color 0a " 是在背景色为黑色上设置字体颜色为淡绿色。

本文标签: 使用方法 脚本 Windows