Windows编程bat脚本教程


最近接触到了一些windows编程相关的内容,在博客中简单记录一下,以后有机会的话会继续完善。

输出命令

  • echo
    输出命令,空格之后直接键入需要输出的变量或者字符就会输出到命令行中。
    在这里插入图片描述

for /L %%i in(1,1,7) do() 是bat脚本的一种循环语法,/L表示该集表示以增量形式从开始到结束的一个数字序列(start,step,end),始于1终于7增量步幅为1。%%i表示遍历的过程中每个集合变量。

在命令行中每个命令都会被输出一次,这不利于观察我们想要的输出。可以添加@echo off 来关闭命令回显。
rem,注释,还有::也表示注释,两者区别,大家请小度

变量声明与赋值

  1. 变量声明
    bat脚本变量无需声明可以直接使用,未声明变量为空字符串。字符串大小写不敏感。未特殊处理下脚本变量全部为全局变量。
  2. 变量赋值
    使用set语句为变量赋值。rem 为注释命令。
@echo off
set var1=2+2 rem 默认的set赋值方式为字符串赋值,故 var1为"2+2"字符串
set /a var2=2+2 rem /a 是表达式运算,仅适合32位整型运算,可以是负数
set /p var3=Please input a number: rem /p 是命令行输入,将输入值赋值给变量
set /p md5=<crc.py rem 读取py文件内容并赋值给py变量,默认读取一行
echo var1: %var1%
echo var2: %var2%
echo var3: %var3%
echo md5: %md5%
pause rem 暂停脚本的执行,并显示一条提示信息,等待用户按下任意键继续执行脚本。

在这里插入图片描述
3. 变量读取

  • %var%获取变量值,如上图。
  • set var 输出所有以var打头的变量。
  • set 输出所有变量,包括系统花环境变量:TEMP、PATH等
  • !var!,变量延迟,延迟读取变量值。后面介绍“变量延迟
    系统内置变量:
    %date%,系统日期,类似:2020/02/29 周六
    %time%,获取系统时间,类似:17:13:15.18
    %cd%,获取当前目录
    %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字
    %NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
    %PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于Itanium
    %PROCESSOR_IDENTFIER% 系统 返回处理器说明。
    %PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
    %PROCESSOR_REVISION% 系统 返回处理器的版本号。
    %COMPUTERNAME% 系统 返回计算机的名称。
    %USERNAME% 本地 返回当前登录的用户的名称。
    %USERPROFILE% 本地 返回当前用户的配置文件的位置。
    %~dp0,bat脚本文件所在目录

4.变量作用域
变量默认为全局变量,程序结束销毁。可使用setlocal设置局部变量区,到endlocal结束。
在这里插入图片描述
5.变量延迟
默认情况下,批处理脚本会在执行过程中一次性解析并展开所有变量。例如在同一行内初始化一个变量后更改,但变量会维持初始化值。
启用对变量的延迟扩展,使你能够在执行过程中动态读取和修改变量的值。

@echo off
setlocal enabledelayedexpansion rem 启用变量延迟
set count=0
for %%i in (1 2 3 4 5) do (
    set /a count+=1
    echo Iteration !count!: %%i rem !var!语法来延迟扩展count变量
)
endlocal

使用!而不是%来访问变量的值,使得变量在脚本的执行过程中根据需要进行解析和扩展,而不是在一开始就全部展开。
6. 特殊变量(命令行参数)
通过使用命令行参数,可以根据需要在批处理脚本中接收和处理外部传递的值。这使得脚本能够根据不同的参数执行不同的操作。

@echo off

echo The script name is: %0
echo The first argument is: %1
echo The second argument is: %2
echo All arguments are: %*

pause
endlocal
  • %0:表示批处理脚本本身的名称(包含扩展名)。
  • %1, %2, %3, …:表示命令行参数中的第一个、第二个、第三个参数,以此类推。例如,如果你执行脚本并提供了参数 file.txt,则 %1 将包含 file.txt。
  • %*:表示所有的命令行参数。该变量将包含所有提供的参数。
  • %~1,第一个参数去引号,如:wimdows.bat “arg1”,则%~1得到arg1
  • %~f0,脚本文件完整路径名
    在这里插入图片描述

标准输入、输出

  • 标准输入(stdin):从键盘或其他输入设备读取数据的标准输入流。在 BAT 脚本中,我们可以使用 set /p 命令从用户手动输入获取数据,并将其读取到脚本中进行处理。
  • 标准输出(stdout):将程序或脚本的输出内容发送到屏幕或其他输出设备的标准输出流。在 BAT 脚本中,我们可以使用 echo 命令将文本或变量的内容输出到屏幕上,供用户查看。
  • 标准错误(stderr):它是指在程序或脚本执行过程中出现错误或异常时发送的错误信息的输出流。在 BAT 脚本中,默认情况下,标准错误会与标准输出合并在一起并显示在屏幕上。但我们也可以使用 2> 运算符将标准错误重定向到文件中进行记录或进一步处理。

1.重定向
1)输出重定向:将命令的输出结果发送到文件而不是屏幕上。在记录日志、保存输出或将结果传递到其他程序是比较有用。在 BAT 脚本中,有两种主要的输出重定向方式: > 和 >>。

  • 单个大于符号 > 用于将命令的输出重定向到指定的文件,如果该文件不存在,则会创建新文件,如果文件存在,则会覆盖原有内容。例如
echo Hello, World! > output.txt
  • 双大于符号 >> 用于将命令的输出重定向追加到指定的文件末尾,而不覆盖原有内容。如果文件不存在,则会创建新文件。例如:
 echo Goodbye, World! >> output.txt

还可搭配有命令行输出的命令进行重定向。例如

dir > dir.txt		//dir文件、目录列表输出到dir.txt, dir.txt文件重新生成
dir >> dir.txt		//dir文件、目录列表添加到dir.txt, dir.txt存在则添加,否则新建
echo line1 > line.txt	//覆盖line.txt,内容为line1
type con > line.txt	//响应键盘输入,直到按ctrl+z结束,输出到line.txt文件

2)标准错误重定向:将错误消息发送到文件。标准错误重定向使用 2> 符号。例如:

dir nonexistent_folder 2> error.txt

3)标准输出、错误输出合并:通常我们会将标准输出和错误输出合并到一个文件,例如:

dir SomeFile.txt > output.txt 2>&1

在这里插入图片描述

stdin:标准输入,重定向时也用数字0表示
stdout:标准输出,重定向时也用数字1表示
stderr:错误输出,重定向时也用数字2表示

4)标准输入:可以使用输入重定向来从文件而不是键盘获取输入数据,在脚本中使用预定义的数据或从文件中读取大量数据非常有用。使用小于符号 < 进行操作。例如:

set /p input=<data.txt
echo Input: %input%

解释:从名为 data.txt 的文件中读取一行数据,并将其存储在名为 input 的变量中。然后,使用 echo 命令将读取到的数据输出到屏幕上。
可以使用输入重定向来执行命令,而不是从键盘手动输入。例如:

findstr "keyword" <data.txt

条件判断

可以使用条件判断来根据一定的条件执行不同的命令或操作。条件判断在编写脚本时非常有用,可以根据变量的值、文件的存在性或其他条件来决定不同的程序流程。

  1. IF 语句:IF 语句是最常用的条件判断语句,它可以基于一个或多个条件来选择要执行的命令。
  • IF EXISTS 检查文件或文件夹是否存在:
IF EXIST "file.txt" (
    ECHO File exists
) ELSE (
    ECHO File does not exist
)
  • IF 条件检查变量值:
SET myVar=10
IF %myVar%==10 (
    ECHO Variable is equal to 10
) ELSE (
    ECHO Variable is not equal to 10
)

判断两个字符串变量是否相等,可以使用 ==,equ;不等则可以使用 not ==,neq
字符串变量与常量比较,请带双引号,如:“%name%”==“marcus”
带 /i,表示忽略大小写,类似java的equalsIgnoreCase
数字比较
EQU,等于
NEQ,不等于
LSS,小于
LEQ,小于等于
GTR,大于
GEQ,大于或等于
2. &、&&、||

  • &,顺序执行多条命令,而不管命令是否执行成功,如:@echo off & setlocal
  • &&,顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
  • ||,顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令(即:只有前面命令执行错误时才执行后面命令),findstr命令时经常会使用&&和||符号,分别表示:找到执行…,没找到执行…
set str="Intel,AMD,NVIDIA"
echo  %str% | findstr /i "Infineon" > nul && (echo yes) || (echo no)

解释:将str作为管道输入,/i 大小写不敏感,寻找“asus”字符串。成功输出yes,否则输出no。

循环

bat脚本实现循环有2种方式:for循环或goto+if。

  1. for循环
    FOR 循环可用于遍历文件列表、目录内容、一组数字等,并对每个元素执行指定的操作。
  • 遍历文件列表:
FOR %%G IN (file1.txt file2.txt file3.txt) DO (
   REM 执行操作,%%G 代表当前文件名
   ECHO %%G
)
  • 遍历目录内容:
FOR %%G IN (C:\Folder\*) DO (
   REM 执行操作,%%G 代表当前文件或文件夹名
   ECHO %%G
)
  • 遍历数字范围:
FOR /L %%G IN (1, 1, 10) DO (
    REM 执行操作,%%G 代表当前数字
    ECHO %%G
)
  1. while循环
    BAT 脚本中没有原生的 WHILE 循环结构。不过,你可以使用 IF 语句和 GOTO 命令来模拟实现 WHILE 循环。
SET i=1

:loop
IF %i% LEQ 10 (
    ECHO %i%
    SET /A i+=1
    GOTO loop
)

bat脚本,循环中并没有continue、break等中断,只能通过goto跳转跳出循环
可以在cmd命令框中使用 for /? 查看for命令使用说明,如下:
对一组文件中的每一个文件执行某个特定命令。
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
如果启用命令扩展,则会支持下列 FOR 命令的其他格式:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
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]
或者,如果有 usebackq 选项:
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]

另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:
%~I - 删除任何引号("),扩展 %I
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~P A T H : I − 查 找 列 在 路 径 环 境 变 量 的 目 录 , 并 将 到 找 到 的 第 一 个 完 全 合 格 的 名 称 。 如 果 环 境 变 量 名 未 被 定 义 , 或 者 没 有 找 到 文 件 , 此 组 合 键 会 扩 展 到 空 字 符 串 可 以 组 合 修 饰 符 来 得 到 多 重 结 果 : PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。如果环境变量名 未被定义,或者没有找到文件,此组合键会扩展到 空字符串 可以组合修饰符来得到多重结果: %~dpI - 仅将 %I 扩展到一个驱动器号和路径 %~nxI - 仅将 %I 扩展到一个文件名和扩展名 %~fsI - 仅将 %I 扩展到一个带有短名的完整路径名 %~dpPATH:I−查找列在路径环境变量的目录,并将到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串可以组合修饰符来得到多重结果:PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩展到类似输出线路的 DIR
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。

参考博客:windows bat 批处理脚本编写指南

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Windows操作系统中,我们经常需要修改DNS服务器地址,尤其是在一些网络环境下,需要手动更改DNS服务器地址比较麻烦,需要经过多个步骤才能完成。因此,我们可以编写一个Windows一键修改DNS批处理脚本.bat来实现快速修改DNS服务器地址的目的。 首先,我们需要打开bat文件编辑器,然后输入以下内容: echo off title 修改DNS服务器地址 ipconfig /flushdns echo 正在修改DNS服务器地址,请稍等... netsh interface ipv4 add dns "本地连接" 8.8.8.8 index=1 netsh interface ipv4 add dns "本地连接" 8.8.4.4 index=2 echo DNS服务器地址修改完成! pause 以上脚本语句实现了如下功能:先清除DNS缓存,然后添加两个DNS服务器地址,依次为8.8.8.8和8.8.4.4,并打印修改DNS服务器地址完成!最后,加入pause命令,让程序暂停,等待用户确认。 此时,我们可以将修改好的批处理脚本.bat文件保存在本地,然后找到文件夹,双击运行,即可实现一键修改DNS服务器地址,轻松快捷完成操作。 总的来说,Windows一键修改DNS批处理脚本.bat可以帮助我们快速地修改DNS服务器地址,节省时间和精力,提高操作效率,是非常实用的一个工具。 ### 回答2: Windows一键修改DNS批处理脚本(.bat)是一种可自动批量修改Windows系统DNS设置的工具。使用这种脚本能够方便地将多台计算机的DNS地址改为指定的服务器地址,从而提高网络访问速度和安全性。以下是编写此脚本的步骤: 首先,打开文本编辑器,如记事本或Notepad++等,创建一个空白文本文件。然后,将以下代码粘贴到文本文件中: @echo off netsh interface ip set dns name="以太网" source=static addr=192.168.1.1 echo DNS地址已成功修改。 pause 其中,以太网是网络适配器的名称,addr为你的DNS服务器的IP地址。这里的代码是为了设置DNS服务器地址为192.168.1.1。 保存文件时,确保将文件扩展名设置为.bat。例如,将文件名保存为“dns.bat”。 运行该脚本时,双击该.bat文件即可。它将自动修改计算机的DNS服务器设置,然后显示一个“DNS地址已成功修改”的消息。用户按任意键即可退出该脚本。 如果需要修改多台计算机的DNS地址,可以将此批处理脚本复制到每个计算机上,以便进行快速的修改。 ### 回答3: Windows一键修改DNS批处理脚本.bat可用于快速更改计算机的DNS设置,以便更轻松地访问互联网。此脚本通过命令行调用Windows的命令行工具来完成这个任务。 首先,需要在脚本中指定所需的DNS服务器的IP地址。可以将这些地址添加到脚本文件中,或者作为参数传递给脚本。 然后,脚本使用netsh命令来配置计算机的DNS设置。这个命令需要管理员权限才能运行,因此,脚本需要在管理员身份下启动。使用以下命令可以实现: ``` netsh interface ip set dns "本地连接" static DNS地址 ``` 其中,DNS地址是指所需的DNS服务器的IP地址,可以是多个。 脚本还可以添加一些用户友好的选项,例如询问用户是否要还原默认DNS设置等。这些选项可以使用批处理编程中的IF语句和GOTO语句实现。 总的来说,Windows一键修改DNS批处理脚本.bat是一个简单但实用的工具,可以帮助计算机用户更轻松地管理他们的网络设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值