草庐IT

windows bat脚本学习一(基础指令)

t_guest 2023-04-18 原文

1.pause

暂停批处理的执行并在屏幕上显示"请按任意键继续..."

例如:

改脚本执行结果为:

2.echo

显示指令,会把需要显示的内容展示出来。

例如:

 结果为:

3.echo off

在此语句后所有运行的命令都不显示命令行本身,但是本身的指令是会显示出来的。

例如:

 结果为:

4.@

不显示本行命令行

例如:

结果为:

5.call

调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)

创建另一个脚本test2.bat作为测试

 分情况,

第一种,2号脚本和1号脚本在同一个目录下

结果为:

第二种,2号脚本和1号脚本不在同一个目录,并且2号脚本目录包含中文路径。

结果报错:

这是因为中文路径系统默认识别不了,可以通过软件转编码来完成。这里以notepad++为例。

转码后保存,再次执行1号脚本

结果为:

 第三种,2号路径中包含了空格

 

修改脚本

结果:

 6.start

启动单独的“命令提示符”窗口来运行指定程序或命令。该命令包含有参数,如下:

"title" 指定在“命令提示符”窗口标题栏中显示的标题。

/dpatch 指定启动目录。

/i 将 Cmd.exe 启动环境传送到新的“命令提示符”窗口。

/min 启动新的最小化窗口。

/max 启动新的最大化窗口。

/separate 在单独的内存空间启动 16 位程序。

/shared 在共享的内存空间启动 16 位程序。

/low 以空闲优先级启动应用程序。

/normal 以一般优先级启动应用程序。

/high 以高优先级启动应用程序。

/realtime 以实时优先级启动应用程序。

/abovenormal 以超出常规优先级的方式启动应用程序。

/belownormal 以低出常规优先级的方式启动应用程序。

/wait 启动应用程序,并等待其结束。

/b 启动应用程序时不必打开新的“命令提示符”窗口。除非应用程序启用 CTRL+C,否则将忽略 CTRL+C 操作。使用 CTRL+BREAK 中断应用程序。

如果不加参数,则只开启新的窗口来执行命令。

例如:

结果:

如果需要修改新的窗口标题,则使用参数"标题"

例如:

结果

 如果2号脚本路径包含空格,则路径需要加"路径"

例如

结果

 7.%0-%9

 %0是指批处理文件的本身,%1-%9是传入的参数。这个参数是从批处理外传入的。

例如:

直接打开脚本显示:

在命令行输入:

输出结果为

 这里再补充一下扩展知识。

MDK 符号字解释

KEY        例子                                                                描述

%            PROJECT1.UVPROJX                                  带扩展名的文件名
#            C:\MYPROJECT\PROJECT1.UVPROJX       带扩展名的完整路径和文件名
@           PROJECT1                                                     没有扩展名或路径说明的文件名
$            C:\MYPROJECT\                                            用反斜杠扩展的文件路径名。
!            .\SRC\TEST.C                                    具有当前文件夹扩展名和相对路径规范的文件名
~ 1        123                                                                   当前光标位置的行号
^ 1         51                                                                    当前光标位置的列号

$D            从设备数据库中选择的设备名称。
E            编辑器文件名目前在焦点。
F            根据上下文,这个文件代码返回:在窗口Project中选择的文件。 当前活动的编辑器文件。 当前由构建过程翻译的文件.
H            应用程序HEX文件名 (PROJECT1.H86).
$J           编译器的绝对路径。 编译器基本文件夹列在项目-管理-项目项目-文件夹/扩展- ARMCC文件夹。例如我自己的该参数的输出结果就是D:\kei5\ARM\ARMCC\include
K            开发工具链的绝对根文件夹,不管使用的关键代码是什么
L            链接器输出文件。 通常用于调试的可执行文件(PROJECT1).
$M         CPU mask revision number.
P            当前项目文件名。
$S            当前激活的设备族包的安装文件夹.
X            视觉可执行程序文件(…\UV4\UV4. exe)。 适用于Key Code %, #, and @.
$X            目标-目标- XTAL选项中指定的以MHz为单位的XTAL时钟频率。
^X            XTAL时钟频率在千赫指定的目标-目标- XTAL选项。
Y            预处理器符号文件co-arm_<target_name>.h为C文件类型定义。 适用于关键代码#。
Z            预处理器符号文件co-arm_<target_name>.hpp为c++文件类型定义。 适用于关键代码#。

$L           $表示应用的是路径,L表示Output->Name of Executable中设置的名字,即工程的输出名(包含路径)。

@L        @表示引用的是文件名,@L引用工程的输出名字。换句话说就是使用Keil,在Output中设置的文件输出名字。

#L        #表示引用的是本身,#L即工程的输出文件。keil的输出文件是.axf文件。如我自己的该参数的输出结果就是D:\myproject\project\Objects\app.axf

实际fromelf.exe应该也要使用相对路径,所以命令可以改成:

$KARM\ARMCC\bin\fromelf.exe --bin -o "$L@L.bin" "#L"

$K        表示的是MDK的安装路径。

 10.choice

使用此命令可以让用户输入一个字符,从而运行不同的命令。

输入/?指令查看指令详情

/c 添加自己的选项

/n 不显示提示文本

需要注意的是/t和/d需要配合使用。/t倒计时几秒。/d倒计时结束后的默认选项

例如10秒倒计时结束后显示

11.type

显示文本文件的内容

先创建一个测试文本test.txt

 调用脚本来显示

结果为:

type 文件名 | more

 有事显示的内容过多,想要一行一行显示时调用。

 

最下行会显示more,任意键会再显示一行

type 文件名 | find "关键字"

只输出需要查找的关键字

 结果为

12.set

该指令用来设置变量

 不带参数为设置变量。

例如

@echo off
echo hello world
set value=123456
echo 输入的值为%value%
pause

执行结果为:

 set /p 变量=等待输入的提示字

例如

@echo off
echo hello world
set /p value=请输入值
echo 输入的值为%value%
pause

结果:

 set /a 变量=公式

例如:

@echo off
echo hello world
set /a value=1+2+3
echo 结果:%value%
pause

结果:

 13.IF

用于判断

 if exist 文件名

查看该文件是否存在

例如

@echo off
echo hello world
if exist test1.txt (
echo this file exist
) else (
echo this file not exist)
pause

结果为

可以写到一行,但是一定要注意空格,否则语法为失败。

 

此外,如果换行,必须"括号"为行最后一个字符。否则无法执行。

 if "字符串"=="字符串"

 判断两个字符串是否相等。

例如

@echo off
echo hello world
if "123"=="134" (
echo equality
) else (
echo not equality)
pause

结果:

 if %变量%

可以通过与set /p指令配合来完成输入数字的判断。

例如:

@echo off
echo 1.输出数字
echo 2.输出字符
echo 3.输出汉字
set /p value=请输入
if %value%==1 (
echo 数字
) else if %value%==2 (
echo 字符
) else if %value%==3 (
echo 汉字) else (
echo 输入错误)
pause

结果:

 可以通过与choice /c指令配合来完成输入数字的判断。

 例如:

@echo off
echo 1.输出数字
echo 2.输出字符
echo 3.输出汉字
choice /c 123
if %errorlevel%==1 echo 数字
if %errorlevel%==2 echo 字符
if %errorlevel%==3 echo 汉字
pause​

结果:

字符串对比

@echo off
echo hello world
set /p value=请输入字符串
if "%value%" == "true" (echo success
)else (echo false)

pause

结果如下:

 /i 参数:不区分大小写,更改代码

@echo off
echo hello world
set /p value=请输入字符串
if /i "%value%" == "true" (echo success
)else (echo false)
pause

 结果:

14.for

 循环指令。这里需要了解两个关键字%i、%%i

%i这个关键字不能在bat中使用。只能再CMD命令下的for中使用。

例如在cmd中:for %i in(command1) do command2

%%i是在bat的for中使用的指令。

例如for %%i in(command1) do command2

for %%i in(command1) do command2是for的语法使用规则。

1.for、in和do是for语句的关键字,它们三个缺一不可;

2.%%I是for语句中对形式变量的引用,即使变量l在do后的语句中没有参与语句的执行,也是必须出现的;

3.in之后,do之前的括号不能省略;

4.command1表示字符串或变量,command2表示字符串、变量或命令语句;

意思为:循环调用command1中的元素作为参数,来参与command2的执行

此外需要注意几点

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

2.in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔

3.for语句依次提取command1中的每一个元素,把它的值赋予形式变量I,带到do后的command2中参与命令的执行并且每次只提取一个元素,然后执行一次do后的命令语句,而无论这个元素是否被带到command2中参与了command2的运行;当执行完一次do后的语句之后,再提取command1中的下一个元素,再执行一次command2,如此循环,直到command1中的所有元素都已经被提取完毕,该for语句才宣告执行结束。

例如:

@echo off
echo hello world
for %%a in (ele1 ele2 ele3) do (echo %%a)
pause

结果:

for /l ....

该集表示以增量形式从开始到结束的一个数字序列。

例如:

@echo off
for /l %%i in (1,1,20) do (echo %%i)
pause

结果:

高级用法

搜索当前目录下有哪些文件?

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

搜索当前目录下所有的文本文件?

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

15:goto

跳转执行标签

在Bat中有标签一词,跟C语言的函数类似。并且标签必须单独一行,并且以冒号开头

这里做一个死循环,如下:

@echo off
:loop
echo 1.输出数字
echo 2.输出字符
echo 3.输出汉字
set /p value=请输入
if %value%==1 (
echo 数字
) else if %value%==2 (
echo 字符
) else if %value%==3 (
echo 汉字) else (
echo 输入错误)
goto loop
pause

结果

这样在每次输入结果后,就会回到起始,重新执行。

16.符号(&、&&、||、|、>、>>)

 顺序执行多条命令,而不管命令是否执行成功

&& 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令

|| 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令(即:只有前面命令执行错误时才执行后面命令)

|  管道命令 前一个命令的执行结果输出到后一个命令 如:help | more

清除文件中原有的内容后再写入

>>  追加内容到文件末尾,而不会清除原有的内容主要将本来显示在屏幕上的内容输出到指定文件中指定文件如果不存在,则自动生成该文件

17.延迟环境变量扩展

        CMD在解释我们的命令的时候,首先会读取命令行一条完整的命令。然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合他的要求。如果我们要在我们的命令中引用一些变量,那么我们如何让CMD在解释我们的命令时。能识别出这个变量呢?这时我们就可以在变量名字两边加一个%号, 如%name%。当CMD在对读取我们的整行命令进行格式匹配的时候,就会发现name这个字符两边加了%号,就不会把他当作普通字符处理,而是会把他当 作一个变量处理。变量名叫name。然后CMD就会找到变量名对应的值,用变量名的值替换掉这个变量名字(name),(如果变量名不存在值,就返回空 值)。再将这个替换好并且匹配的命令执行。这个替换值的过程就叫做变量扩展。说白了就是把变量的名字,用他的值给替换掉后执行。也就是批处理如何识别一 个变量的过程.

例如:

set var=test

echo %var%

 此时编译器再读取的时候直接将%var%替换为test。所以显示就显示test。

在看下边这个

for /l %%i in (1,1,5) do (
set var=%%i
echo %var%)

这个在预编译的时候将%var%替换成%%i,但是%%i又不认识是什么,所以程序在运行的时候就会出错。运行结果如下:

此时就需要使用延迟环境变量扩展,即每条指令在执行之前才将变量进行替换,以保证对变量的任何修改都可以实时生效.。

使用setloacl ENABLEDELAYEDEXPANSION这个命令来启用\"延迟环境变量扩展\",遇到的变量需要用!变量!进行替换。那上边异常的代码可以修改为:

setlocal ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,5) do (
set var=%%i
echo !var!)

执行的结果为:

18.exit

退出当前DOS控制台。

例如:

echo hello world
for /l %%a in (0,0,0) do (
set /p input=请输入:
echo !input!
if !input!==pass (exit))
pause

结果:

只有输入pass,程序才会退出。

有关windows bat脚本学习一(基础指令)的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  5. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  8. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  9. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  10. ruby - 确定 ruby​​ 脚本是否已经在运行 - 2

    有没有一种简单的方法可以判断ruby​​脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免

随机推荐