Bootstrap

Windows系统常用工具及命令和bat文件介绍

常用的windos工具

命令工具名称描述
powershellwindows的shell工具
eventvwr事件查看器可以查看系统日志
taskmgr任务管理器查看已经运行的进程和性能、应用历史记录、开机启动等信息
services.msc服务管理可以查看本地的服务
regedt注册表编辑器
mstsc远程桌面连接
devmgmt.msc设备管理器可以查看各个外设的状态
diskmgmt.msc磁盘管理器可以进行磁盘分区
resmon资源监视器apu、磁盘、网络、内存信息监控
dcomcnfg系统组件服务组件服务(COM+)管理工具
mmc控制台
dxdiag检查DirectX信息(DirectX工具)微软公司创建的多媒体编程接口
rstrui系统还原工具
msconfig系统配置实用程序
recdisc光盘修复工具可以使用系统修复光盘启动计算机。
rasphone网络连接工具
ncpa.cpl网络连接属性面板工具
winver检查windows版本
mspaint画图板
write写字板
magnify放大镜
mobsync同步中心

windows常用命令

在windows下参数可以使用-/的效果一样

net user Administrator /active:yes
net user Administrator -active:yes

net命令

命令作用示例
net view用于显示网络上的计算机和共享资源。它可以用于查看网络上的计算机是否可用,以及查看特定计算机上的共享资源。示例:net view \10.10.1.192
net user用于管理用户账户和计算机设置。net user [用户名][命令] 命令可以是以下任何一个: add:创建一个新用户。 delete:删除一个用户。active:激活账户(yes:激活;no:禁用)。
net localgroup用于管理本地组。要将一个名为“test”的用户添加到名为“administrators”的本地组中,可以使用以下命令:net localgroup administrators test /add
net start用于启动服务。net start [服务名]
net stop用于停止服务net stop [服务名]
net statistics命令用于显示网络统计信息。它可以用于查看网络上的计算机和服务的统计信息,例如连接数、发送和接收的数据量以及网络性能。示例:net statistics workstation
net share用于管理共享资源,使网络用户可以使用某一服务器上的资源。当不带选项使用此命令时,它会列出该计算机上正在被共享的所有资源。对于每一种资源,Windows 都会报告其设备名或路径名,以及与之相关的描述性注释。
net config用于显示工作站或服务器服务的配置信息。NET CONFIG[SERVER / WORKSTATION] ,使用NET CONFIG命令配置server服务的语法是:NET CONFIG SERVER [/AUTODISCONNECT:time] [/SRVCOMMENT:“text”] [/HIDDEN:{YES
net use共享访问登录命令建立空连接:net use \IP\ipc$ “” /user:“” (一定要注意:这一行命令中包含了3个空格)建立非空连接:net use z: \IP\c$ “密码” /user:“用户名” (即可将对方的c盘映射为自己的z盘,其他盘类推)net use \IP\ipc$ “密码” /user:“用户名” (同样有3个空格)

目录和文件管理命令

  • dir:显示当前目录下的文件和子目录的列表。
    • cd:切换目录。例如:
      • cd folder:进入名为 “folder” 的子目录。
      • cd …:返回上一级目录。
      • cd /:进入根目录。
  • mkdir:创建新目录。例如:
    • mkdir folder:创建名为 “folder” 的新目录。
  • rmdir:删除空目录。例如:
    • rmdir folder:删除名为 “folder” 的空目录。
  • delerase:删除文件。例如:
    • del file.txt:删除名为 “file.txt” 的文件。
  • renrename:重命名文件或目录。例如:
    • ren oldname newname:将名为 “oldname” 的文件或目录重命名为 “newname”。
  • copy:复制文件。例如:
    • copy source.txt destination.txt:将名为 “source.txt” 的文件复制到 “destination.txt”。
  • xcopy:复制目录及其内容。例如:
    • xcopy source_folder destination_folder /E:将 “source_folder” 目录及其内容复制到 “destination_folder”。
  • move:移动文件或目录。例如:
    • move source.txt destination_folder:将名为 “source.txt” 的文件移动到 “destination_folder”。
  • attrib:修改文件或目录的属性。例如:
    • attrib +h file.txt:将 “file.txt” 文件设置为隐藏属性。

系统信息配置命令

  • systeminfo:显示关于操作系统的详细信息,如操作系统版本、安装日期、注册信息、主机名等。

  • hostname:显示计算机的主机名。

  • ipconfig:显示计算机的网络配置信息,如 IP 地址、子网掩码、默认网关等。

  • ping:测试网络连接的命令。例如,ping www.example.com 可以测试与 “www.example.com” 的连接。

  • tracert:跟踪网络数据包的路径。例如,tracert www.example.com 可以显示从本地计算机到 “www.example.com” 的网络路径。

  • netstat:显示网络统计信息和连接状态。例如,netstat -a 可以显示所有活动的网络连接和监听端口。

  • tasklist:显示当前运行的进程列表。例如,tasklist 可以显示所有正在运行的进程及其相关信息。

  • msconfig:打开系统配置实用程序,允许配置启动项、服务、启动方式等。

  • regedit:打开注册表编辑器,允许编辑系统的注册表项。

  • systeminfo | findstr /B /C:“OS Name” /C:“OS Version”:显示操作系统的名称和版本号。

  • chkdsk 磁盘检查命令

  • slmgr.vbs命令 windows软件授权管理工具
    slmgr-命令详解(Windows软件授权管理工具)

slmgr.vbs -dlv   #显示详细的许可证信息
slmgr.vbs -dli  #显示许可证信息
slmgr.vbs  -xpr  #当前许可证截止日期
slmgr.vbs  -dti  #显示安装ID以进行脱机激
slmgr.vbs -ipk  -(Product Key)   #安装产品密钥
slmgr.vbs -ato  #激活Windows
slmgr.vbs -cpky  #从注册表中清除产品密钥(防止泄露引起的攻击)
slmgr.vbs -ilc -(License file)  #安装许可证
slmgr.vbs -upk #卸载产品密钥
slmgr.vbs -skms -(name[ort] )  #批量授权

网络相关命令

ipconfig:显示网络配置信息,如 IP 地址、子网掩码、默认网关等。

ping:测试与特定主机的网络连接。例如,ping www.example.com 可以测试与 “www.example.com” 的连接。

tracert:跟踪数据包在网络上的路径。例如,tracert www.example.com 可以显示从本地计算机到 “www.example.com” 的网络路径。

netstat:显示网络连接和统计信息。例如,netstat -a 可以显示所有活动的网络连接和监听端口。

nslookup:执行域名解析查询。例如,nslookup www.example.com 可以查询 “www.example.com” 的 IP 地址。

ftp:启动 FTP 客户端,用于与远程 FTP 服务器进行文件传输。

telnet:启动 Telnet 客户端,用于与远程主机建立 Telnet 连接。

net:执行与网络相关的操作,如配置网络接口、连接共享资源等。例如,net use 可以连接到共享文件夹。

route:显示或修改 IP 路由表。例如,route print 可以显示当前的路由表。

arp:显示或操作本地 ARP 缓存。例如,arp -a 可以显示本地计算机的 ARP 缓存表。

批处理脚本的使用方法

首先是批处理脚本的使用方法。一般是新建一个文本文档,然后将后缀名改为.bat。然后选中该文件,右键选择编辑,编写脚本代码。编码完成后双击文件运行。

注释

  • :: 在批处理脚本中,使用表示注释当前行。
  • @echo off 使用@echo off表示此后不显示执行的命令本身。也就是说,如果不加这个,你的脚本在执行时,代码中的命令也会出现在cmd窗口中。
  • rem 在批处理文件中加入注解,也可用 REM 命令来屏蔽命令。 语法:
REM [string]

输出

echo 命令使用

  • echo 命令用来显示此命令后的字符 。echo语法如下:
echo [on|off] [message]

  - 参数:
    - on | off 指定是否允许命令的回显。若要显示当前的 echo 的设置,可使用不带参数的 echo 命令。 
    - message 指定让 MS-DOS 在屏幕上显示的正文。

实例:下面实例将在DOS控制台中输出 “hello bat”。

@echo off
echo hello bat
pause

脚本说明:

(1)@ 表示将不在 DOS 中显示 echo off 命令;

(2)echo off 表示后续命令在 DOS 中不显示;

(3)echo hello bat 表示将在 DOS 中显示 “hello bat” 字符串;

(4)pause 表示脚本执行完成后,不立即关闭 DOS 窗口,而是提示 “请按任意键继续…” 信息。当用户按了任意键,DOS 窗口将关闭;

重定向输出内容

  • 重定向输出内容(一般是将输出内容写入文件):

覆盖使用操作符>,附加使用操作符>>
标准输出为 1>或1>> 标准错误输出为 2>或2>>
单独使用>或>>默认为标准输出。
使用运算符>& 将标准输出和标准错误输出相互转换。如 1>&2 表示将标准输出当作标准错误输出使用。

@echo off
copu a.txt bak/b.txt >nul 2>nul
if %errorlevel%==0 (
    echo SUCCESS
) else (
    echo ERROR
)

上面的输出结果并没有输出 copu 命令执行的错误信息,只显示我们 echo 给出的提示信息。
其中:>nul 2>nul 就是把命令执行的输出信息和错误信息不输出到屏幕,而是输出到一个根本不存在的设备。>nul 等效于 1>nul,>nul 前面的 1 表示输出流2 表示错误流(1可以省略不写)

常见设备名:

  • con 控制台(键盘和显示器)
  • aux , com1 - com4 所有串口
  • prn , lpt1 - lpt3 所有并口
  • nul 空设备
  • clock$ 电子钟

如果我希望将这个结果写入一个文本文档result.txt中,则需要打开cmd,跳转到write.bat所在路径,然后执行以下命令:

write.bat 1> result.txt

输入

读取文件内容:

  • 使用操作符 < 来读取文件内容
string < result.txt #将result.txt中的内容读入string中。

接收参数

在cmd窗口中执行脚本时,将参数写在脚本名称的后面,用空格分开。
在脚本中通过%1, %2, %3…%9来使用这些参数。
第十个以及以后的参数需要用到循环和shift命令来获取。使用shift命令从参数列表中弹出第一个参数,这使得所有的参数都向左移动,这样第十个参数就可以通过%9来获取了。

同时,这些参数在接收时也可以有选项。如:
%~I表示从第I个命令行参数中删除引号。
%~fI表示展开第I个命令行参数完整路径。
%~dpI表示第I个文件路径参数的完整父级路径。
%~nxI表示第I个文件路径参数的文件名(包括扩展名)。

例如:
编写一个名为getParameters.bat的脚本文件:

@echo off
echo %1, %2, %3 #将接收的三个参数打印出来

在cmd中执行这个脚本:

getParameters.bat p1 p2 p3

结果会在cmd中打印出 p1 p2 p3.

接收用户输入

有两种接收用户输入的方式,分别为使用choice,和set /p。下面分别用这两种方式来实现同一个程序。

使用choice: 这里可以自己使用 choice /?查看一下用法

@echo off
chcp 
if not errorlevel 65001 chcp 65001 
::判断cmd窗口是否是utf-8的字符集
choice /c ny /m "Do you want to run the program again"
::/c指定了可选按键 /m在提示语句前表示输出”“中的那段文本。
if errorlevel 2 goto yes
:: errorlevel 代表可选按键中的第二个,即y。
if errorlevel 1 goto no
:no
echo no
goto exit
:yes
echo yes
:exit
echo 运行结束

使用set /p: 这里可以自己使用 set /?查看一下用法

@echo off
SET /P yes="Do you want to run this program again?[y/n]"
::首先输出yes中的内容,然后将用户输入赋值给yes
echo %yes% | findstr /i "y" > nul && GOTO yes
::利用管道将第一个命令的结果作为第二个命令的输入。
::findstr 表示查找输入内容是否有 y ,/i表示不区分大小写。
::nul表示不输出到显示器。

:yes
echo yes

两个程序的运行结果是一样的。
其中两个程序中都用到了命令 : ,这个命令用于声明一个代码块,其内容是一直到下一个 : 为止。格式为 : 代码块名称 内容。
由第一个程序可以看出,声明了yes和no两个代码块,其中no代码块没有内容。
使用goto指令来跳转向某个代码块。

管道

批处理脚本中用管道将第一个命令的结果作为第二个命令的输入。用 | 表示。

命令一.bat | 命令二.bat

errorlevel 基础用法

批处理文件中 errorlevel 与 %errorlevel% 的作用和用法。
errorlevel 常用来判断上条命令的执行情况。因此我们可以先看看 if /? 语句的帮助文档。如下

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

  NOT               指定只有条件为 false 的情况下,Windows 才
                    应该执行该命令。

  ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
                    指定数字的退出代码,指定条件为 true。

  string1==string2  如果指定的文字字符串匹配,指定条件为 true。

  EXIST filename    如果指定的文件名存在,指定条件为 true。

  command           如果符合条件,指定要执行的命令。如果指定的
                    条件为 FALSE,命令后可跟 ELSE 命令,该命令将
                    在 ELSE 关键字之后执行该命令。

ELSE 子句必须出现在同一行上的 IF 之后。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

一般上一条命令的执行结果返回的值只有两个,“成功”用 0 表示;“失败”用 1 表示;实际上,errorlevel 返回值可以在0~255 之间,例如 xcopy 默认的errorlevel 值就有5 个,分别表示5 种执行状态:

  • 0 复制文件成功

  • 1 未找到复制文件

  • 2 用户通过CTRL C 终止了xcopy操作

  • 4 出现了初始化错误

  • 5 出现了磁盘写入错误

全部的比较参数如下:

  • EQU - 等于,=
  • NEQ - 不等于,!=
  • LSS - 小于,<
  • LEQ - 小于或等于,<=
  • GTR - 大于,>
  • GEQ - 大于或等于,>=

变量

在Windows的批处理脚本中,变量是没有数据类型的,也不需要提前声明。

set命令语法

常用的 set 命令来显示、设置或删除 cmd.exe 环境变量。

SET [variable=[string]]
参数说明:
variable  指定环境变量名。
string   指定要指派给变量的一系列字符串。

显示当前环境变量,键入不带参数的 SET。实例如下:

C:\Users\Administrator> set java_home
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_171

如果命令扩展被启用,SET 会如下改变:等号或值不显示所有前缀匹配SET 命令已使用的名称的所有变量的值

C:\Users\Administrator>set p
Path=D:\ProgramFiles\Python38-32\Scripts\;D:\ProgramFiles\Python38-32\;D:\ProgramFil
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW;.PY;.PYW
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 158 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=9e09

扩展命令

在 SET 命令中添加了两个新命令行开关:

SET /A expression   指定 expression 为数字表达式

ET /P variable=[promptString]  命令行开关允许将变量数值设成用户输入的一行输入

/A 命令行开关指定等号右边的字符串为被评估的数字表达式

@echo off
rem 使用 /A 执行加法运算。其:val=32
set /A val=10+22
echo %val%
 
rem 将 val 环境变量加10,赋值给val2环境变量。其:val2=42
set /A val2=%val%+10
echo %val2%
 
rem 将 16 使用位移操作符,向右移动一位,移动一位等于除以2。其:val3=8
set /A "val3=16>>1"
echo %val3%
 
rem 使用分组符号提升加法的优先级,其:val4=18
set /A val4=(0+1+2+3+4+5+6+7+8+9)/5*2
echo %val4%
 
rem 使用 %% 进行取余运算,其:val5=4
set /A "val5=94%%10"
echo %val5%

/P 命令行开关

@echo off
set /p username=请输入姓名:
echo 你的姓名:%username%
pause

环境变量替换

::替换  用 "str2" 代替扩展结果中的每个 "str1"
@echo off
set val=hello bat
echo %val%
rem replace
echo %val:bat=CMD%
hello bat
hello CMD
::删除 从扩展结果中删除所有的 "str1""str2" 可以是空的
@echo off
set val=hello bat
echo %val%
echo %val:a=%

子字符串

会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。

%PATH:~10,5%

实例将截取从6(偏移量5)个字符开始的后面2个字符

@echo off
set val=administrator
echo %val%
echo %val:~5,2%

administrator
is

这里不多赘述,跟Python切片一样

延迟环境变量

DOS 终于添加了延迟环境变量扩充的支持。该支持默认总是被停用,但也可以通过 CMD.EXE 的 /V 命令行开关启用/停用延迟环境变量。详细信息您可以参阅 CMD /?

  • /V:ON 使用 ! 作为分隔符启用延迟的环境变量扩展。例如,/V:ON 会允许 !var! 在执行时扩展变量 var。var 语法会在输入时扩展变量,这与在一个 FOR循环内不同。

  • /V:OFF 禁用延迟的环境扩展。

实例:使用 ! 符号来输出变量,但是DOS默认是没有启动延迟环境变量,会原样输出变量名,不会解析变量名。

@echo off
set val=administrator
echo !val!

没有开启延迟环境变量的输出效果:

C:\Users\Administrator\Desktop>test.bat
!val!

下面是开启延迟环境变量的效果

C:\Users\Administrator>cmd /v:on
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>cd Desktop
C:\Users\Administrator\Desktop>test.bat
administrator

局部区域

setlocal 和 endlocal 命令是用来定义一个局部区域,这个局部区域中的环境变量任何变化都不会改变原先的环境变量。

演示使用 setlocal 和 endlocal 定义局部区域,然后在局部区域中修改 path。

@echo off
echo before setlocal:
set path
pause
 
setlocal
rem reset environment var path
set path=E:\tools
echo after setlocal and reset path
set path
pause
endlocal
 
echo recovery path by endlocal
set path

输出结果

C:\Users\Administrator\Desktop>test.bat
before setlocal:
Path=D:\ProgramFiles\Python38-32\Scripts\;D:\ProgramFiles\Python38-32\;D:\...
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW;.PY;...
请按任意键继续. . .
after setlocal and reset path
Path=E:\tools
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW;.PY;...
请按任意键继续. . .
recovery path by endlocal
Path=D:\ProgramFiles\Python38-32\Scripts\;D:\ProgramFiles\Python38-32\;D:\...
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW;.PY;...

更改批处理文件处理参数

shift 命令用于更改批处理文件处理参数的方式,如指定起始处理参数的位置等。先使用 shift /? 看看帮助信息:

如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:
 
    SHIFT /2
 
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
@echo off
shift /2
echo 参数1:%1
echo 参数2:%2

结果:

C:\Users\Administrator\Desktop>test.bat arg1 arg2 arg3
参数1:arg1
参数2:arg3

获取磁盘路径

当前执行环境目录

%cd% 返回的是当前执行环境目录(如果是DOS窗口,则是DOS窗口里面的路径),并非是 bat 脚本实际所在的路径。

C:\Users\Administrator\Desktop> test.bat
C:\Users\Administrator\Desktop
 
rem 我们在 C:\Users\Administrator 目录执行脚本,输出的也是该目录
C:\Users\Administrator>call Desktop/test.bat
C:\Users\Administrator

文件的实际路径

%~dp0 可以用来获取批处理文件的实际路径,与当前 DOS 环境所在的目录没有关系。d 为 Drive 的缩写,即为驱动器,磁盘;p 为 Path 缩写,即为路径,目录;

G:\batdir>zhushi.bat下脚本为例

  • %~0:指的是当前脚本,可以简写成%0
  • %~d0 :仅将显示当前脚本的磁盘分区(G:
  • %~f0 :当前脚本的完整路径+文件名称和后缀(“f” 是 file,即文件 实例:G:\batdir\zhushi.bat
  • %~p0 :脚本文件路径不包含盘符(\batdir\
  • %~n0 :文件名称不包含路径和后缀(“n” 是 name 文件名 zhushi
  • %~x0 :文件扩展名(.bat
  • %~s0 :扩充的路径只含有短名(“s” 为 Short,短的)
  • %~a0 :扩充到文件的文件属性(“a” 为 attribute,即属性)
  • %~t0 :扩充到文件的日期/时间(“t” time)
  • %~z0 :扩充到文件的大小(Size 大小)
  • %~$PATH:0 查找列在路径环境变量的目录,并将 %0 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串

可以组合修饰符来得到多重结果:

  • %~dp0 仅将 %0 扩充到一个驱动器号和路径
  • %~nx0 仅将 %0 扩充到一个文件名和扩展名
  • %~fs0 仅将 %0 扩充到一个带有短名的完整路径名
  • %~dp$PATH:0 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。
  • %~ftza0 将 %0 扩充到类似输出线路的 DIR
  • %0 为当前批处理文件。如果0换成1为第一个文件,2为第2个

IF语句

比较运算符

  • EQU - 等于,=
  • NEQ - 不等于,!=
  • LSS - 小于,<
  • LEQ - 小于或等于,<=
  • GTR - 大于,>
  • GEQ - 大于或等于,>=

if 语句

if 语句执行批处理程序中的条件处理。语法:

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
参数说明:
  • NOT 将表达式的结果取反。例如:表达式为true,not后就为false。只有条件为 false 的情况下,Windows 才应该执行该命令。
  • ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。
  • string1==string2 如果指定的字符串 string1 等于 string2,条件表达式为 true,执行 if 语句的命令。
  • EXIST filename 如果指定的文件名存在,指定条件为 true。
  • command 如果符合条件(即表达式为TRUE),指定要执行的命令。如果指定的条件为 FALSE,命令后可跟 ELSE 命令,该命令将在 ELSE 关键字之后执行该命令。

if-else 语句

上面简单的介绍了 “if” 语句的基础用法。本节我们将介绍 if-else 语句,该语句用来处理 “如果条件为真,执行语句1;否则,执行语句2”。伪语句:

if 条件 == true
    语句1
else
    语句2

if-elseif-else 语句

如果条件分支比较少,使用 if-else 就可以了。但是,如果你遇到条件非常多的怎么处理呢?if-else 也能处理,批处理提供了 if -elseif-else 类似 switch 语句。

@echo off
set /p score=输入成绩:
if %score% lss 60 (
    echo 未及格,需要多努力啊!
) else if %score% lss 70 (
    echo 及格,多做题
) else if %score% lss 80 (
    echo 良,加把劲考
) else if %score% lss 90 (
    echo 优,你很优秀,继续保持
) else (
    echo 不是凡人
)

set /p 是获取输入的整行参数

if语句拓展

如果命令扩展被启用,IF 会如下改变:

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command
  • [/I] string1 compare-op string2 其中 /I 开关说明要进行的字符串比较不分大小写。如果 string1string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。
  • CMDEXTVERSION number 其中CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它是在跟与命令扩展有关联的内部版本号比较
  • DEFINED variable 判断是否定义过这个环境变量如果已定义环境变量,DEFINED 条件的作用跟 EXIST 的一样,除了它取得一个环境变量,返回的结果是 true。

goto语句

在使用 goto 语句之前,我们先执行 “goto /?” 查看 goto 语句的帮助文档

goto 代码块名称

:代码块名称

实现代码跳转执行

@echo off
setlocal
set /p input=请输入字母A或B:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
echo 您输入字母错误
goto end
REM 定义了一个标签
 
:A
echo 您输入的字母是A
goto end
REM 定义了一个标签
 
:B
echo 您输入的字母是B
goto end
:end

for语句

for语句基础语句

for 语句是对一组文件中的每一个文件执行某个特定命令。基本格式如下:

REM 在 CMD 窗口中
FOR %variable IN (set) DO command [command-parameters]
 
REM 在批处理文件中
FOR %%variable IN (set) DO command [command-parameters]

参数说明:

  • %variable 指定一个单一字母可替换的参数,该参数用来存放 for 语句每次迭代的数据。

  • (set) 指定一个或一组文件,可以使用通配符。
    in 和 do 之间的(set)表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔。

  • command 指定对每个文件执行的命令。

  • command-parameters 为特定命令指定参数或命令行开关。

注意:在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。变量名称是区分大小写的,所以%i 不同于 %I。

@echo off
for  %%A in (ABC) do echo %%A
for  %%I in (ABC) do echo %%I
for  %%Z in (ABC) do echo %%Z
REM %%J 和 %%j 是不同的两个变量
for  %%J in (ABC) do echo %%j

for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I 和 %%i 会被认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的 %0~%9 这 10 个形式变量发生冲突,请不要随意把 %%I 替换为 %%0~%%9 中的任意一个

使用批处理文件打印当前目录下面所有的文件名称。
如下:

@echo off
for %%i in (*.*) do echo "%%i"

使用批处理文件打印当前目录下面所有后缀为 txt 的文件名称。

@echo off
for %%i in (*.txt) do echo "%%i"

for /D语句拓展

for语句默认将会匹配文件名。如果添加了 /D 扩展命令,则该 for 语句与目录名匹配,而不与文件名匹配。

@echo off
 
REM 匹配当前目录下面的文件名
echo 第一个 for 语句
for %%i in (*) do echo "%%i"
 
REM 匹配当前目录下面的目录名
echo 第二个 for 语句
for /D %%i in (*) do echo "%%i"

搜索 C 盘下的所有目录,但是不包含子目录。

@echo off
for /D %%i in (C:/*) do echo "%%i"

for /R语句拓展

指定目录获取列表递归进入根目录树 [Drive:]Path

指定目录下的包含子目录列表

将递归进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则认为是当前目录。如果 set 只是一个句点(.),则只枚举目录树
*是文件
.是枚举目录树

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

参数详情:

  • [[drive:]path] 表示指定目录,默认是当前文件路径 .
  • %variable 指定一个单一字母可替换的参数,该参数用来存放 for 语句每次迭代的数据。
  • set 一个可迭代的集合,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔。
  • command-parameters 为特定命令指定参数或命令行开关。

实例:搜索 C 盘是否有 notepad.exe 可执行文件。如果存在,则使用 start 启动 notepad.exe 程序。

@echo off
for /r c:/ %%i in (notepad.exe) do (
    if exist %%i (
        echo 找到了 notepad.exe
        REM 去启动 notepad.exe
        start %%i
        goto end
    )
)
echo 没有找到 notepad.exe
 
:end

for /L语句拓展

for /L 用使用给定信息创建序列,语法如下:

FOR /L %variable IN (start,step,end) DO command [command-parameters]
  • start:指定创建序列的开始位置

  • step:for 语句创建序列时单步距离。

  • end:指定创建序列结束位置

for /F语句拓展

主要用来处理文件和一些命令的输出结果。它可以提取文本文件的内容,进行逐行分析和处理。语法:

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]
  • "options" eol=#(忽略#开头的行)、skip=n(跳过前N行)、delims=xxx(指定分隔符号基)、tokens=x,y,m-n(提取哪一列)
  • file-set 为一个或多个文件名。
    for 语句会逐一分析指定的每个文件,打开指定文件、读取并处理文件内容。处理包括读取文件内容,将文件内容逐行读取,然后将每行解析成零或更多的符号(默认使用空格作为分隔符)。
  • "string" 字符串使用" "把要提取文本包含其中
  • 'command' 提取命令的输出结果,命令要用' '包含其中

for /F 的 usebackq 选项

usebackq 命令的功能和意义不是很明朗,据说是由机器自动添加进去的,因此它变得可有可无,我们写代码时可无,机器执行时可有。但可以肯定的是,启用该选项时,它会改变“FOR /F“解析文本的功能,集合内原有引号功能失效,因此需要变成新的引号。

usebackq 处理有空格的文件名
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给 for 函数体,用逗号和/或空格分隔符号。请注意,此 for 函数体的语句引用 %i 来获得第二个符号,引用 %j 来获得第三个符号,引用 %k 来获得第三个符号后的所有剩余符号。对于带有空格的文件名,你需要用双引号将文件名括起来。为了用这种方式来使用双引号,还需要使用 usebackq 选项,否则,双引号会被理解成是用作定义某个要分析的字符串。

%i 在 for 语句中显式声明,%j 和 %k 是通过tokens= 选项隐式声明的。可以通过 tokens= 一行指定最多 26 个符号,只要不试图声明一个高于字母 “z” 或"Z" 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;而且,不能同时使用超过 52 个(a-zA-Z 等于 26+26)。

@echo off
 
REM 将抛出“系统找不到文件 test”错误
for /F "usebackq" %%a in (test text.txt) do (
    echo %%a
)
 
REM 正确
for /F "usebackq" %%a in ("test text.txt") do (
    echo %%a
)
usebackq 处理文本字符串

还可以在 for /F 语句中直接分析字符串,需要使用单引号将 file-set 括起来。这样,该字符串会被当做一个文件中的内容来进行解析。

实例:直接在 file-set 中使用单引号来解析字符串。

@echo off
 
REM 解析失败
for /F "usebackq tokens=1-3" %%a in ("张三|28|87") do (
    echo %%a
)
 
REM 解析成功
for /F "usebackq tokens=1-3" %%a in ('张三 28 87') do (
    echo %%a
    echo %%b
    echo %%c
)
 
usebackq处理 CMD 命令

最后,可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 file-set 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到内存中,并被当作文件分析。如以下例子所示:

@echo off
FOR /F "usebackq delims==" %%i IN (`set`) DO (
    echo %%i
)

结果:

C:\Users\Administrator\Desktop\bat> test.bat
ALLUSERSPROFILE
APPDATA
ChocolateyInstall
ChocolateyLastPathUpdate
CLASSPATH
... 省略 ...

FOR变量增强

FOR 变量已被增强。你可以使用下列选项语法去增强 for 变量:
  • %~I 删除任何引号("),扩展 %I
  • %~fI 将 %I 扩展到一个完全合格的路径名
  • %~dI 仅将 %I 扩展到一个驱动器号
  • %~pI 仅将 %I 扩展到一个路径
  • %~nI 仅将 %I 扩展到一个文件名
  • %~xI 仅将 %I 扩展到一个文件扩展名
  • %~sI 扩展的路径只含有短名
  • %~aI 将 %I 扩展到文件的文件属性
  • %~tI 将 %I 扩展到文件的日期/时间
  • %~zI 将 %I 扩展到文件的大小
  • %~$PATH:I 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串
可以组合修饰符来得到多重结果:
  • %~dpI 仅将 %I 扩展到一个驱动器号和路径
  • %~nxI 仅将 %I 扩展到一个文件名和扩展名
  • %~fsI 仅将 %I 扩展到一个带有短名的完整路径名
  • %~dp$PATH:I 搜索列在路径环境变量的目录,并将 %I 扩展到找到的第一个驱动器号和路径
  • %~ftzaI 将 %I 扩展到类似输出线路的 DIR
    实例:获取每个文件的路径,文件名称,文件大小以及文件扩展名。
@echo off
FOR %%i IN (*) DO (
    echo PATH=%%~dpi  NAME=%%~nxi  SIZE=%%~zi  EXT=%%~xi
)

结果:

C:\Users\Administrator\Desktop\bat> test.bat
PATH=C:\Users\Administrator\Desktop\bat\  NAME=call.bat  SIZE=0  EXT=.bat  
PATH=C:\Users\Administrator\Desktop\bat\  NAME=for.txt  SIZE=4382  EXT=.txt
PATH=C:\Users\Administrator\Desktop\bat\  NAME=hello.bat  SIZE=25  EXT=.bat
PATH=C:\Users\Administrator\Desktop\bat\  NAME=ping.txt  SIZE=1323  EXT=.txt
PATH=C:\Users\Administrator\Desktop\bat\  NAME=test.bat  SIZE=98  EXT=.bat
PATH=C:\Users\Administrator\Desktop\bat\  NAME=text_content.txt  SIZE=50  EXT=.txt

子程序

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

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

子程序调用格式:

call :label arguments

子程序语法:

:label
command1

commandn
goto :eof

CALL命令

call 是一个功能强大的命令,它不但可在批处理程序中调用另一个批处理程序,而且还可调用指定标号处后面的所有命令(也可以称为子程序)。语法如下:

CALL [drive:][path]filename [batch-parameters]

参数说明:

  • [Drive:] 指定被调用批处理文件的盘符

  • [Path] 指定被调用批处理文件路径

  • FileName 指定被调用的批处理文件名,当被调用的批处理文件与正在执行的批处理文件都处于同一目录下时,可以省略盘符及路径;

  • batch-parameters 指定批处理程序所需的命令行参数信息;

  • /? 在命令提示符显示帮助;
    实例:创建两个批处理文件,分别为 test.bat 和 sub.bat。在 test.bat 中调用 sub.bat,不传递任何参数信息。

start 命令

start 命令用来启动一个单独的窗口来运行指定的程序(如:exe 文件)或命令(如:批处理脚本 *.bat)。

在使用 start 之前,先使用 start /? 命令查看 start 的手册信息:

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
      [command/program] [parameters]

参数描述:

  • "title" 在窗口标题栏中显示的标题。
  • path 启动目录。
  • B 启动应用程序,但不创建新窗口。应用程序已忽略 ^C 处理。除非应用程序启用 ^C 处理,否则 ^Break 是唯一可以中断该应用程序的方式。
  • I 新的环境将是传递给 cmd.exe 的原始环境,而不是当前环境。
  • MIN 以最小化方式启动窗口。
  • MAX 以最大化方式启动窗口。
  • SEPARATE 在单独的内存空间中启动 16 位 Windows 程序。
  • SHARED 在共享内存空间中启动 16 位 Windows 程序。
  • LOW 在 IDLE 优先级类中启动应用程序。
  • NORMAL 在 NORMAL 优先级类中启动应用程序。
  • HIGH 在 HIGH 优先级类中启动应用程序。
  • REALTIME 在 REALTIME 优先级类中启动应用程序。
  • ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。
  • BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。
  • NODE 将首选非一致性内存结构 (NUMA) 节点指定为十进制整数。
  • AFFINITY 将处理器关联掩码指定为十六进制数字。进程被限制在这些处理器上运行。当 /AFFINITY 和 /NODE 结合时,会对关联掩码进行不同的解释。指定关联掩码,正如 NUMA 节点的处理器掩码正确移动到零位起始位置一样。进程被限制在指定关联掩码和 NUMA 节点之间的那些通用处理器上运行。如果没有通用处理器,则进程被限制在指定的 NUMA 节点上运行。
  • WAIT 启动应用程序并等待它终止。
  • command/program 如果它是内部 cmd 命令或批文件,则该命令处理器是使用 cmd.exe 的 /K 开关运行的。这表示运行该命令之后,该窗口将仍然存在。如果它不是内部 cmd 命令或批文件,则它就是一个程序,并将作为一个窗口化应用程序或控制台应用程序运行。
  • parameters 这些是传递给 command/program 的参数。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当然我们也可以使用 “start 目录地址” 打开资源管理器,或者使用 “start 网站URL” 通过默认浏览器打开指定的 URL。

pushd 命令

将当前目录的路径保存下来,并且切换到你指定的新目录路径。语法:

PUSHD [path | ..]

参数说明:

  • path 指定你要切换的目标目录路径

如果命令扩展被启用,除了一般驱动器号和路径,PUSHD 命令还接受网络路径。如果指定了网络路径,PUSHD 将创建一个指向指定网络资源的临时驱动器号,然后再用刚定义的驱动器号(前面创建的临时驱动器号)更改当前的驱动器和目录。可以从 Z: 往下分配临时驱动器号,使用找到的第一个没有用过的驱动器号。更多信息可以使用 pushd /? 查看

实例:通过 DOS 窗口输入 pushd 命令切换到 D 盘;然后使用 popd 命令,恢复到原来的目录。

C:\Users\Administrator>pushd D:\
D:\>popd
C:\Users\Administrator>

popd 命令

该命令用来将当前目录切换到 pushd 命令存储的目录路径。语法:

POPD

如果命令扩展被启用,从 PUSHD 目录堆栈 POPD 驱动器时,POPD 命令会删除 PUSHD 创建的临时驱动器号。更多信息可以使用 popd /? 查看

实例:使用 pushd 切换到 D:\ 盘,然后再次使用 popd 命令切换到执行 pushd 之前的目录。

@echo off
echo %cd%
pushd "D:\"
echo %cd%
popd
echo %cd%

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
C:\Users\Administrator\Desktop\bat
D:\
C:\Users\Administrator\Desktop\bat
;