当前位置: 首页 > news >正文

东莞模板网站好购买域名网

东莞模板网站好,购买域名网,网络规划设计师题库,电子商务网站建设与管理课程论文文章目录 什么是BAT常用命令与语法help与/?titlecolormodeechopausecallremset/a/p gotostartifif errorlevel for普通用法for /l 用法for /d用法for /r用法for /f用法in (file)delims和tokensskipeolusebackq 变量扩展变量延迟 setlocalshiftdirrd#xff08;删除文件夹pausecallremset/a/p gotostartifif errorlevel for普通用法for /l 用法for /d用法for /r用法for /f用法in (file)delims和tokensskipeolusebackq 变量扩展变量延迟 setlocalshiftdirrd删除文件夹del删除文件pushd与popdtypefindassocftype特殊符号篇%用途一批处理参数用途二引用变量 *、通配符、、重定向符^转义字符|管道符、、||组合符%~参数扩展截取/替换字符串截取替换 字符串界定符, 空格的替代符; 参数并列符()nul 其他常用命令汇总 与操作系统的交互命令explorer 参考文献 什么是BAT 全称即Batch批处理是一类可执行的文本文件扩展名为.bat。 常用命令与语法 help与/? 都可以用来查看某个指令的帮助文档。 语法格式指令 /?或者是help 指令 如title /?就是打印title这个指令的帮助文档。 需要注意单独执行help会打印出支持的所有指令以及简单的功能说明。 title 语法格式title window_name 作用设置当前的cmd窗口标题 color 语法格式color 16进制颜色格式 用来设置批处理控制台的背景和字体颜色颜色属性由两个十六进制数字组成第一个数字表示背景颜色第二个数字表示字体颜色。 每个数字可以为以下值 0黑色 1蓝色 2绿色 3湖蓝色 4红色 5紫色 6黄色 7白色 8灰色 9淡蓝色 A淡绿色 B淡浅绿色 C浅红色 D淡紫色 E淡黄色 F亮白色如color 07表示常规的黑底白字。 mode 一般用来调整当前命令行窗口的大小、代码页等。 如 mode con cols113 lines15 color 0A 就是调整窗口的长是113个字符宽是15个字符顺带给窗口换了换颜色一般会放在最前面执行。 可以通过在cmd窗口中输入mode /?来查看详细功能。 echo 语法格式 echo [{on|off}] [message]on允许批处理文件在处理时回显命令off不允许。 在调用了echo off之后接下来执行的所有命令都将不会在前台打印出命令本身。 举个例子现在有一个a.bat其内容为 echo on dir echo 111111这时候执行a.bat前台得到的输出是 D:\TEMPa.batD:\TEMPecho onD:\TEMPdir驱动器 D 中的卷是 Data卷的序列号是 20FB-E397D:\TEMP 的目录2023/07/12 23:26 DIR . 2023/07/12 23:26 DIR .. 2023/07/12 23:48 27 a.bat 2021/10/17 20:40 DIR U盘旧资料1 个文件 27 字节3 个目录 14,122,348,544 可用字节D:\TEMPecho 111111 111111可以看到每行命令本身都被打印了出来。 如果我们把第一行改成echo off则前台得到的输出是 D:\TEMPa.batD:\TEMPecho off驱动器 D 中的卷是 Data卷的序列号是 20FB-E397D:\TEMP 的目录2023/07/12 23:26 DIR . 2023/07/12 23:26 DIR .. 2023/07/12 23:52 28 a.bat 2021/10/17 20:40 DIR U盘旧资料1 个文件 28 字节3 个目录 14,122,348,544 可用字节 111111可以看到除了第一行命令外其他命令本身都没有被打印出来。而且看着更舒服了有没有。 可以加在一行命令的行首位置表示禁止当前行命令本身回显在屏幕上。 如echo on 相比使用echo on|off来控制整个脚本层级的回显可以更方便的控制行级的回显。 所以以上一小节介绍的代码为例如果想当前屏幕完全不显示任何命令需要写成这样 echo off dir echo 111111前台结果 D:\TEMPa.bat驱动器 D 中的卷是 Data卷的序列号是 20FB-E397D:\TEMP 的目录2023/07/12 23:26 DIR . 2023/07/12 23:26 DIR .. 2023/07/13 00:02 29 a.bat 2021/10/17 20:40 DIR U盘旧资料1 个文件 29 字节3 个目录 14,122,348,544 可用字节 111111这个结果看起来就舒服多了。 pause 用于暂停批处理的执行由用户决定是否继续执行。 echo 111 pause echo 2222前台在执行完第一句代码之后就会显示按任意键继续。。同时卡住不再继续执行除非用户点击了任意键之后才会再执行第三句代码。 比较有意思的是如果你不想让界面显示按任意键继续。。但还想要让界面卡住不向下执行则可以结合重定向符来实现比如 echo off echo 1 pause echo 2 pause nul echo 3有兴趣可以试试输出2之后光标会卡住但界面上没有显示除非按任意键才能继续向下执行。 这个本质是将pause指令的输出重定向到了黑洞里即nul。 call 可以用来调用其他的批处理文件语法是 call xxx.bat这里的作用跟start基本一致。 也可以实现类似goto的效果调用执行当前bat中指定标号后面的命令直到批处理结尾 语法格式 call :label_name [arguments] 比如 echo off call :x 参数 echo 111:x echo 222 echo %1打印结果 D:\TEMPa.bat 222 参数 111 222 ECHO is off.可以看到call在跳转执行完之后又会返回自己的位置接着向下执行。 需要注意call后面的标号必须加上冒号即:label。 感觉没有goto好用所以个人感觉call的最大作用就是用来调用其他的批处理文件。不过call带参数的这个设定倒是有点像函数了。 rem 用来注释命令语法 rem 注释内容需要注意如果你设置了echo on的话注释也会显示在前台输出里。 set 用来设置变量的语法 set [options] var_namevar_value不过如果在cmd里执行help set之后打印出来的set的命令帮助里set的功能其实是显示、设置或删除cmd.exe环境变量。 set命令里提供有两个命令行开关即options set /a expression set /p variable[promptString]/a /a指定等号右边的字符串为被评估的数字表达式即执行简单的算术运算或者逻辑位与运算等并将结果赋值回变量如 echo off set /a var12 echo %var% set /a var2*4 echo %var% set /a var100 echo %var% set /a var这是什么 echo %var%依次的输出为 D:\TEMPa.bat 3 8 100 0注意等号右边需要是数字表达式起码也得是数字看最后一个示例传进来的是字符串直接返回0了。 额外提一句bat中支持运算的数值范围是(-2147483647, 2147483647)举例 set /a var21474836471 echo %var%输出-2147483648 注意2147483647 2^31-1是32位操作系统中最大的符号型整型常量。 /a用来做逻辑位与运算的时候运算符应该用双引号括起来要不然会报错比如说 set /a var32 echo %var%/p /p允许将变量设置成用户输入的一行输入读取输入之前可以显示指定的提示信息即promtStringpromtString可以是空的。如 set /p var请输入文本 echo %var%执行后会打印提示信息然后光标等待输入 D:\TEMPa.bat 请输入文本等用户键入信息回车后就输出为 D:\TEMPa.bat 请输入文本you are hero you are hero还可以用来显示变量 如set x表示打印出所有以字母x为开头的变量。 变量名在使用的时候需要在前后都加上百分号如 echo off set xxx 123 set x echo %xxx% echo 1111打印输出 D:\TEMPa.bat xxx 123 ECHO 处于关闭状态。 1111比较有意思的有两个地方。 第一个地方echo字符串成功了但是echo %xxx%失败从结果可知是被echo off卡死了也就是说echo变量的时候是受echo off影响的。 另外一个有趣的地方是set x。 如果我保持同一个cmd不关闭在执行完a.bat之后再在这个cmd中执行一个b.bat文件其内容为 echo off set xxx_2 456 set x这时候打印的输出为 D:\TEMPb.bat xxx 123 xxx_2 456可以看到刚才a.bat声明的变量也在这里被打出来了。 所以我感觉set x的变量空间应该是指在同一个cmd内。 goto goto是一个流程控制转向功能早期的编程语言很多都支持goto语句但是后来由于goto跳转带来的debug不确定性慢慢的后面的语言都不支持goto了。 语法格式 goto 某个label:某个label注意label是有长度限制的不能超过8个字符如果超过则只会取前8个字符。 看着功能跟call差不多但还是有些区别的 call在跳转执行完label代码后会再跳回原来的位置继续向下执行代码所以label处代码是会被执行两次但goto在跳转执行完label代码后就会继续向下执行不会跳转回去。 如以下代码 echo off goto last echo 111:last echo 222打印输出为 D:\TEMPa.bat 222start start命令启动一个新的cmd窗口并在其中执行指定的命令。 语法格式 start [title] [/dPath] [/i:] [/min] [/max] [{/separate | /shared}] [/wait] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/B]title可选项表示新的cmd窗口的标题注意需要用双引号括起来/dPath表示路径[/i:]表示将当前cmd的环境传送给新的cmd窗口具体啥作用不清楚我原先以为是把变量空间传过去但刚才测试了一下不加/i新的窗口仍然可以调用老cmd里定义的变量[/min]将新cmd窗口最小化[/max]将新cmd窗口最大化[{/separate | /shared}]前者表示在单独的内存空间启动16位程序后者表示在共享的内存空间启动。没懂是啥意思[/wait]启动应用程序并等待它结束新cmd窗口被关闭后才会继续向下执行[{/low | /normal | /high | /realtime | /abovenormal | belownormal}]启动应用程序的优先级依次是空闲优先级、一般优先级、高优先级、实时优先级、超常规优先级、低出常规优先级[/B]表示启动应用程序时不必打开新的cmd窗口 注意参数啥的要放在start后面如start /min [title] 简单举个例子比如说打开记事本start notepad if 常用分支控制结构 语法格式 if [not] 条件1 括号包起来的方法体1 [else 方法体2] if [not] exist filename 方法体1 if [not] errorlevel number 方法体1 if [/i] string_1 compareop string_2 方法体1 if defined variable 方法体1 [else 。。。] if aa ()errorlevel number 似乎是指上一条命令的运行返回状态。 [/i]表示强制比较意思是忽略大小写。 常用的compareop有 EQU等于NEQ不等于LSS小于LEQ小于等于GTR大于GEQ大于等于 比较数字和字符都是通过上面的比较符bat里不支持或者这种运算符因为这在bat里是重定向符。 估计bat是将所有的变量都视为是string型了。 if defined variable 方法体1 [else 。。。]用来判断变量是否已经定义了 注意 if的方法体需要用括号包起来。方法体的左括号必须跟在代码的行末且else必须跟if方法体的右括号在同一行 举例 echo off if defined xxx (echo 123) else (echo 456)会输出456,。 但是如果方法体不用括号包起来也能跑但是啥输出都没有。 格式举例 echo off if abc EQU bcd ( echo 11 ) else ( echo 22 )[/i]表示强制比较意思是忽略大小写。 举例 echo off if /i abc EQU ABc ( echo 11 ) else ( echo 22 )打印11。如果把/i取消掉那么打印的是22。 判断文件是否存在 if exist c:\test (echo 存在文件)if errorlevel 语法格式为if [not] errorlevel number 方法体1 如果上面最近一条命令返回一个等于或大于指定数字的退出代码则指定条件为true。这个errorlevel是一个系统变量里面会保存上一条命令的执行状态执行完毕后的退出代码即0~255之间。 一般来讲退出代码等于0表示命令正确执行成功 如 net user if %errorlevel% 0 echo 命令执行成功输出 D:\TEMPa.batUser accounts for \\LAPTOP-94Qxxxxx------------------------------------------------------------------------------- Administrator DefaultAccount Guest wxx WxxxxxxxlityAccount The command completed successfully.命令执行成功再补一个例子就不追加输出了 set /p var请输入一个命令 %var% if %errorlevel% 0 goto yes :yes echo %var%执行成功for for是bat里很强大也是很复杂的一个命令。建议看一下参考文献10介绍的很详细。 基本语法 for [/l | /d | /r | /f | ] {%variable | %%variable} in (set) do (方法体 )%variable是在命令提示符下调用for循环时定义变量的方式即在cmd中直接写代码时的用法注意这里变量是区分大小写的 %%variable是在批处理中调用for循环时定义变量的方式注意这里变量也是区分大小写的。我们这里介绍的主要是BAT批处理所以使用的就是%%variable。 set指定目录、文件、或者是字符串 参数解析 /l它的set是一系列按步长划分的数字表示for循环需要在指定范围内循环如for /l %%n in (0, 1, 9) do ()表示从0到9步长为1没错步长是放在了中间。。。如此共循环10次/d表示只匹配目录及文件夹不匹配文件名/r表示递归语法比较特殊是for /r [[drive :]path] [%% | %]variable in (set) do command [command-parameters]/r后面指定目录将在这个目录树的每个目录中执行for语句如果没有指定目录则默认为当前目录。如果set只是一个句号即(.)则只列举目录树/f灵魂参数用于提取文本信息如读取文件内容、提取分割字符等等等等是专门用来操作文本字符串的。 普通用法 普通用法就是for循环后面什么参数都不跟只是针对set集合里的元素做遍历 语法格式例如 for %%variable in (set) do command [command-parameters]或者是 for %%variable in (set) do (command [command-parameters] )注意的点有几个 set必须括号括起来其代表一个序列包含一个及一个以上的元素多个元素间可以通过逗号、制表符、空格、分号或者等号分割for会循环将set里的值赋给%%variable直到set里面的值遍历完毕后for循环才结束为了避免跟命令行传参冲突%%variable应该尽量避免定义成%%0~%%9这种形式 举一个实际例子 echo off for %%a in (1,2,3,4) do (echo %%a )输出结果 D:\Code\BATa.bat 1 2 3 4再举一个例子 举例打印当前目录下的所有txt文件的内容 echo off set /a sum0 for %%x in (*.txt) do (echo %%x文件内容如下type %%xecho.set /a sumsum1 ) echo 一共打印了%sum%个文件打印输出 D:\Code\BATa.bat a.txt文件内容如下 这是a.txt b.txt文件内容如下 这是b.txt c.txt文件内容如下 这是c.txt 一共打印了3个文件其中echo.表示换行。。。。 for /l 用法 /l更像是编程里常规意义上的for循环是带有计数器的其中set里表示一个步长序列其语法为 for /l %%variable in (start, step, end) do command这里的/l就是loop的意思。 以(1,1,5)为例表示从1到5生成一个步长为1的序列即1,2,3,4,5 以(5,-1,1)为例表示从5到1生成一个步长为-1的序列即5,4,3,2,1 简单举个例子 echo off for /l %%a in (8, -2, 0) do (echo %%a )打印结果 D:\Code\BATa.bat 8 6 4 2 0for /d用法 加上/d参数之后set集合里放的应该就是一个路径for循环将遍历这个路径下的所有文件夹但是不会去深入遍历文件夹下的子文件夹也不会去遍历出单个文件。 所以这里的/d其实就是directory。 以目录D:\Code\BAT为例其下的文件结构如下 D:\Code\BAT-- d1/-- dd1/-- d2/-- d3/-- a.txt-- b.txt执行代码 echo off for /d %%a in (D:\Code\BAT\*) do (echo %%a )输出 D:\Code\BATa.bat D:\Code\BAT\d1 D:\Code\BAT\d2 D:\Code\BAT\d3注意 set里记录的路径最后面一定要带上星号代表目录下的所有不然不输出set里面同样支持多个路径并列多个路径之间可以用逗号、空格等隔开形如for /d %%a in (D:\Code\BAT\* D:\Code\ttss\*) dofor将按顺序一个路径一个路径遍历; for /r用法 /r参数跟/d功能近似主要是应用于文件遍历不能遍历文件夹。 /r用于搜索指定路径及其子目录下符合情况的文件如果后面没有指定路径的话默认用当前目录。它的语法有点特殊 for /r [path] %%variable in (模式匹配) do ()注意 路径是直接跟在/r参数后面的而不是放在set里set里放的是待匹配的pattern比如说(*.txt)表示所有的txt文件 常用功能匹配指定模式的文件统一改名。 以目录D:\Code\BAT为例其下的文件结构如下 D:\Code\BAT-- d1/-- dd1/-- ddd1.txt-- d2/-- d3/-- a.txt-- b.txt-- c.txt执行代码 echo off for /r D:\Code\BAT\ %%a in (*.txt) do (echo %%a )打印结果 D:\Code\BATa.bat D:\Code\BAT\a.txt D:\Code\BAT\b.txt D:\Code\BAT\c.txt D:\Code\BAT\d1\dd1\ddd1.txtfor /f用法 /f是for里面用来处理跟字符串相关的工作如文件内容、命令的返回内容等。 语法格式 for /f [options] %%variable in (file) do command for /f [options] %%variable in (command) do command for /f [options] %%variable in (string) do command注意 第一种语法里 for读取文件里的内容并以行为单位循环处理每次处理一行但是会忽略空行以及分号打头的行默认情况下即不使用options额外配置的情况下每行会以默认的分隔符空格和制表符再度分割为第1小节、第2小节等等然后只返回第1小节 第二种语法里 注意set里的字符串是一个完整的命令是需要单引号括起来的整个for循环其实是循环这个命令的输出结果 第三种语法里 注意set里的字符串是通过双引号括起来的for循环是循环这个字符串 接下来只以in (file)为例讲解for /f里常用的options。in (string)和in (command)用法跟它差不多所以就不赘述了。 in (file) 假设现在有一个a.txt其内容为: 11111 22 222 333;3344444 ;55555 6666677777 88888 99999让我们执行代码 echo off for /f %%a in (D:\Code\BAT\a.txt) do (echo %%a )打印结果为 D:\Code\BATa.bat 11111 22 333;33 44444 66666 77777 88888 99999可以看到 第2行由于行内有空格所以只返回了空格前的这一部分第4行由于是空行所以没有输出第6行由于行首是分号所以也没有输出但以等号、空格作为行首的第七八行却正常输出 对于第2行这种情况如果想拿到每行切出来的所有内容或者是想让每行按照自己想要的方式切割可以使用delims和tokens这两个options。 delims和tokens delims用来定义每行的分隔符默认是使用空格和制表符作为分隔符但是要注意delims是相当于保持默认而不是表示什么分隔符都不加 tokens用来控制每行返回切割后的哪些列如 tokens2-5表示返回第2列到第5列或者是列举式的如token2,3,4,5token2,*表示返回第二列到最后一列如果需要全部显示则token*只需要一个变量来接收即可。 但是我们在for循环里只定义了一个变量即%%variable如何用这一个变量来拿到每行切出来的所有列呢 这个其实也简单可以这么写 for /f tokens1,2,3 %%a in (a.bat) do (echo %%a,%%b,%%c )因为我们的变量定义的是%%a所以如果想取到其他的列那就需要按照英文字母顺序继续向下排依次是%%b%%c等等。 那如果字母排完了呢有兴趣再查吧一般情况下是用不完。。。 2023-9-16 10:13:37 有一个比较有趣的事情就是如果只加delims而不指定tokens可以猜一下会输出什么 我们现在有一个test.txt文件其文件内容如下 how are you? Im fine, and you? Im fine, thank you. bye然后代码如下 echo off for /f delims, %%a in (test.txt) do (echo %%a )猜猜结果是怎样的 输出如下 D:\TEMPa.bat how are you? Im fine Im fine bye可以看到如果不指定token的话是只返回第一个分隔符前面的部分实际上是等价于for /f delims, tokens1 %%a这个可不是因为我们只定义了一个变量去接收值哈你就算在echo的时候加入了%%b也是没效果的。 skip 忽略前n行。 语法格式skipn表示跳过第1行到第n行从第n1行开始读取默认n0 举个例子 for /f skip6 token2-5 delims %%a in (a.bat) do ()eol 用来指定当某一行行首以什么符号开始时就忽略它。 比如说eol#表示以#开头的行都忽略掉。 需要注意eol只能指定单个字符不能指定多个 usebackq 这是一个增强型参数用处不大就是改变了对引号的使用限制。 对于command由单引改为反引号即in (command)对于字符串由双引号改成单引号即in (‘string’);对于文件路径原来是啥引号都不加现在是改成双引号括起来。 仅做了解吧。 即for /f usebackq %%i in .... 变量扩展 %%~a即%%a的扩展可以删除双引号。 直接上例子 echo offfor /f %%a in (temp.txt) do echo %%a echo 扩展后输出 for /f %%a in (temp.txt) do echo %%~a输出为 111 222 333 44444 55555 666 扩展后输出 111 222 333 44444 55555 666引号的删除有几大原则 如果字符串首尾两端都有双引号则首尾两端的双引号都删除如果字符串首端有双引号而尾部没有则删除首端双引号如果字符串尾端有双引号而首端没有则不做任何处理。只删双引号不删单引号。 另外for循环里也支持bat里常规的参数扩展见下文特殊符号篇 - 参数扩展一节。 如%~fa表示文件路径名、%~da表示文件所在的驱动器号等。 直接举例 for /f %%a in (dir /b) do echo %%~fa输出为 D:\Code\BAT\111.bat D:\Code\BAT\a.bat D:\Code\BAT\a.txt D:\Code\BAT\b.bat D:\Code\BAT\b.txt D:\Code\BAT\c.txt D:\Code\BAT\d1 D:\Code\BAT\d2这里还有一个特殊的for参数扩展即%~$PATH:i其中$PATH表示名为PATH的环境变量。这个参数扩展的意思是在指定的环境变量里寻找包含变量%i的目录并返回第一个符合情况的全路径。 如果环境变量未定义或者没有找到符合情况的文件就会返回空字符串。 举例 for /f %%a in (notepad.exe) do echo %%~$path:a输出为 C:\Windows\System32\notepad.exe变量延迟 变量延迟的这个概念其实不止在for循环中有体现在整个bat编程中都是有涉及的。 常规的bat里是有个缺陷的 以下面为例 set num0 for /f %%i in (dir) do (set /a num1echo 当前的值是%num% ) echo 最后的值是%num%猜猜输出是什么其输出结果是 D:\TEMPa.bat 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 当前的值是0 最后的值是15for循环体内部的%num%值始终未被改变这就是一个大问题。 简单的讲bat里面的代码有个预编译的过程而预编译时代码是一块接着一块来预编译的那什么样的代码算一块呢比如说像set num0或者echo off这样的代码一行就算一块。而像for循环的这种一整个for循环算一块。比如说刚才举的那个例子其实一共有三块代码第一块是set num0第三块是echo 最后的值是%num%中间的for循环则整体算作一块。 块里的代码在预编译的时候其实是会把%variable_name%这样的代码替换成常量所以说上面例子里的%num%就一直输出为0而实际上内存里的num其实是一直在随着for循环变化的。 怎么说呢显示早于计算或者说同一块代码里对同一变量既有调整又有输出的话输出的值是不变的。 那如何解决这个问题呢那就可以引入变量延迟了举例 setlocal enabledelayedexpansion set num0 for /f %%i in (dir) do (set /a num1echo 当前的值是!num! ) echo 最后的值是%num%输出为 D:\TEMPa.bat 当前的值是1 当前的值是2 当前的值是3 当前的值是4 当前的值是5 当前的值是6 当前的值是7 当前的值是8 当前的值是9 当前的值是10 当前的值是11 当前的值是12 当前的值是13 当前的值是14 当前的值是15 最后的值是15这下子就正常了。 上面的例子里我们做了两处修改一是加入了setlocal enabledelayedexpansion来启用变量延迟功能二是配合变量延迟使用!variable_name!来替换%variable_name% 或者是使用call %%variable_name%%的方式也能达到变量延迟的效果比如说将上述实例改写成 set num0 for /f %%i in (dir) do (set /a num1call echo 当前的值是%%num%% ) echo 最后的值是%num%输出是一样的。 setlocal 在批处理运行过程中设置自身的临时环境变量不会影响系统环境变量。 命令格式 setlocal [enableextensions | disableextensions] [enabledelayedexpansion | disabledelayedexpansion]前一组参数表示启用/禁用命令扩展直到与之配套的endlocal; 第二组参数表示启用/禁用延迟环境变量扩展直到出现与之配套的endlocal; 举例说明 echo off setlocal pathd: echo 局部环境变量path set path endlocal echo 全局环境变量path set path打印输出 D:\Code\BATa.bat 局部环境变量path Pathd: PATHEXT.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC 全局环境变量path PathC:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;D:\software\python37\Scripts\;D:\software\python37\;C:\Users\linhui\AppData\Local\Microsoft\WindowsApps;D:\software\PyCharm2022.2.2\bin;;D:\software\IntelliJ2022.2.2\bin;;D:\software\Microsoft VS Code\bin;D:\software\jdk1.8;D:\software\jdk1.8\bin;D:\software\Git\bin; PATHEXT.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC可以看到在临时环境中PATH的值被重写了。 上面的例子展示的是如何在临时环境中重置环境变量那如果我是想在临时环境中新增环境变量的值呢即保证原有值不变 echo off setlocal pathd:;%path% echo 局部环境变量path set path endlocal打印输出 D:\Code\BATa.bat 局部环境变量path Pathd:;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;D:\software\python37\Scripts\;D:\software\python37\;C:\Users\linhui\AppData\Local\Microsoft\WindowsApps;D:\software\PyCharm2022.2.2\bin;;D:\software\IntelliJ2022.2.2\bin;;D:\software\Microsoft VS Code\bin;D:\software\jdk1.8;D:\software\jdk1.8\bin;D:\software\Git\bin; PATHEXT.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC可以看到我们成功为PATH新增了一个值 shift shift在实际中并不常用是用来移动批处理中可替换参数的位置。 因为在批处理中最多只能接收9个命令行参数内部是通过%0~%9来调用其中%0是指当前bat文件的文件名。 那如果我想传的命令行参数大于9个呢比如说20个 这时候就可以使用shift将每个参数复制到上一个参数中使用。 命令格式 shift [/n]n是数字且只能是0~8 当赋予n某个值的时候就意味着命令从第n个参数开始移位如调用一次shift /2会将%3移动到%2将%4移动到%3其他依次类推而%0和%1则不受影响 当n赋予的值是0、1或者是不带任何数字的shift时表示批处理文件中命令行参数整体左移一个位置直到可替换参数为空。 举例 echo off echo %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 shift /0 echo %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 shift /0 echo %0 %1 %2 %3 %4 %5 %6 %7 %8 %9打印输出为 D:\Code\BATa.bat 1 2 3 4 5 6 7 8 9 10 11 12 a.bat 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 11可以看到从第0位参数开始后面命令行参数依次前移调用一次前移一次。 接下来我们试一下shift /1打印输出为 D:\Code\BATa.bat 1 2 3 4 5 6 7 8 9 10 11 12 a.bat 1 2 3 4 5 6 7 8 9 a.bat 2 3 4 5 6 7 8 9 10 a.bat 3 4 5 6 7 8 9 10 11可以看到0号参数并没有被替换。 再试一下shift打印输出为 D:\Code\BATa.bat 1 2 3 4 5 6 7 8 9 10 11 12 a.bat 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 11所以shift的输出效果跟shift /0是一样的。 但是0号参数是文件名以调用命令行参数为例一般我们也不会从%0开始调用而是从%1开始调用。 基于此shift和shift /0以及shift /1的效果是一样的我们只需要每次读取%1就可以把所有命令行参数都遍历读取完。 教程里给的例子很有趣在这里记录一下 echo off :start if %1 goto end echo %1 shift goto start :end echo 已经结束打印输出 D:\Code\BATa.bat 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 已经结束通过if goto的形式实现了循环的作用很有趣。 另外别忘记if里在做等于的判断时两边变量都套了双引号。 dir 展示指定目录下的所有文件和文件夹类似linux里的ls -l dir支持很多参数举例 dir /a表示以特定模式做展示其中/ad表示只展示文件夹/aa应该是表示只展示文件 dir /b表示以简单模式输出即只输出文件名和文件夹名其他一概不输出如 D:\Code\BATdir /b a.bat a.txt d1dir /s则表示展示指定目录及其子目录下所有的文件和文件夹。 rd删除文件夹 语法格式rd /参数 文件夹路径 支持的参数有 /s移除指定路径下的所有目录和文件/q安静模式在删除目录的时候不会再询问是否确认删除。 如果不带参数的话那就只能删除空目录。 del删除文件 语法格式del /参数 文件路径 支持的参数有很多 /q安静模式删除文件的时候不会再询问是否确认删除/f强制删除包括只读文件/p删除每个文件之前都要先问一遍/s在指定目录下的所有子目录下都删除指定文件 如 del /q/a/f/s d:\temp\*.* #删除 d:\temp 及子文件夹里面的所有文件包括隐藏、只读、系统文件不包括子目录不带参数的话不能删除隐藏、系统、只读文件。 pushd与popd pushd 指定路径将当前目录存储到一个虚拟栈里然后将当前工作目录切换成指定的路径如pushd c:\或者是pushd c:\users\ popd将当前工作目录切换成栈里保存的上一个目录作用相当于cd 上一个目录 这里需要注意pushd存储路径的时候是相当于用一个栈去存储的然后popd一个一个弹出栈直到栈里弹空了。 type 很简单的指令用来展示文件的内容跟linux里的cat功能一致。 其语法格式为 TYPE [drive:][path]filename find 作用是查找文件中的指定字符串常用语法格式 find [/v][/c][/n][/i] search_string [drive:][path]filename/v表示仅显示不包含指定字符串的行/c表示包含指定字符串的行数/n显示所展示列的行号/i搜索字符串时忽略大小写 假设我有一个test.txt其内容是 how are you? Im fine, and you? Im fine, thank you. bye执行find you test.txt输出为 ---------- TEST.TXT how are you? Im fine, and you? Im fine, thank you.执行find /v you test.txt输出为 ---------- TEST.TXT bye执行find /c you test.txt输出为 ---------- TEST.TXT: 3执行find /n you test.txt输出为 ---------- TEST.TXT [1]how are you? [2]Im fine, and you? [3]Im fine, thank you.find在日常使用中其实也经常跟管道符和type结合使用如type test.txt | find /n you输出为 [1]how are you? [2]Im fine, and you? [3]Im fine, thank you.可以看到这样的输出更加简洁不会再输出文件名了。 assoc assoc设置文件扩展名关联的文件类型 单纯执行assoc会打印出当前电脑所有文件扩展名对应的文件类型如 .001WinRAR .386vxdfile .3g2WMP11.AssocFile.3G2 .3gpWMP11.AssocFile.3GP .3gp2WMP11.AssocFile.3G2 .3gppWMP11.AssocFile.3GP .7zWinRAR .aaiTunes.aa .AACWMP11.AssocFile.ADTS .aaxiTunes.aax .accdaAccess.ACCDAExtension.16 .accdbAccess.Application.16 .accdcAccess.ACCDCFile.16 .accdeAccess.ACCDEFile.16 .accdrAccess.ACCDRFile.16 .accdtAccess.ACCDTFile.16想查看指定扩展名对应的文件类型如想看txt后缀的可以使用assoc .txt输出为 .txttxtfile意思是txt后缀的对应文件类型是txtfile。 也可以通过assoc来修改指定扩展名对应的文件类型。 比如说已知.docWord.Document.8我现在想把.txt文件也设置成word文档文件那么就 assoc .txtWord.Document.8需要注意这个命令需要在管理员权限下的窗口下才能运行可能还需要重启电脑。 之后我们的txt文件就得用word文档来打开了。 assoc这个功能感觉没啥子用啊。。。。 ftype ftype设置文件类型的关联方式 所谓的关联方式其实就是默认打开的软件。 使用方法跟assoc其实基本一致。 单纯执行ftype会打印出本机所有文件类型对应的打开软件的路径如 ChromeHTMLC:\Program Files\Google\Chrome\Application\chrome.exe --single-argument %1 cloudmusic.aacD:\software\CloudMusic\cloudmusic.exe--play%1查看指定文件类型的打开软件如txtfile可以通过ftype txtfile 输出 txtfile%SystemRoot%\system32\NOTEPAD.EXE %1就是windows自带的记事本软件。 修改的话跟assoc也是一样就不赘述了。 这个指令讲真看着也没啥用。 特殊符号篇 % 百分号的用处还是挺大的。 用途一批处理参数 在批处理中最多只能接收9个命令行参数内部是通过%1~%9来调用而%0是指当前bat文件。%*表示所有参数。 如 echo %0 echo %1 echo %2 echo %*输出示例 D:\Code\BATb.bat 参数1 参数2 参数3 b.bat 参数1 参数2 参数1 参数2 参数3由于%0代表当前bat文件自身因此当你需要复制当前文件的副本的时候可以这么写 copy %0 d:\b.bat用途二引用变量 使用%var_name%表示引用一个变量。 简单举个例子 set a12 echo %a%*、通配符 这个跟大家都是一样的*表示任意多个字符也包含0个而表示任意一个字符也包含0个。 这个比较简单常用于匹配文件名上 if exist *.txt echo 当前文件夹下有文本文件dir a?.txt后者表示列出当前目录下第一个字母是a第二个字母是任意字符的文件。 、、重定向符 跟shell一样用来控制数据输入的方向和方式。 表示输入重定向右侧数据流入左边 表示输出重定向数据从左边流入右边且覆盖式写入 表示输出重定向数据从左边流入右边但是是追加式的写入到右边 随便举个例子 echo type a.txt b.txt将a.txt的内容复制到b.txt类似shell中的cat a.txt b.txt. 这里没什么好讲的。 这里有个比较有意思的应用就是利用输入重定向符来修改当前的系统时间 echo 2023-01-01 temp.txt date temp.txt然后以管理员权限打开的CMD来运行上面的bat之后查看系统时间就变成了 这个确实有点意思。 ^转义字符 ^有两大作用一个是作为转义的前导字符另一个是作为换行的续行字符。 ^实际上是对重定向符、以及的专用前导字符用来抹除它们的特殊意义只作为普通字符使用。 如echo test a.txt是将字符串test覆盖式写入a.txt文件之中。 但如果是echo test ^ a.txt则是会将后面内容作为一个完整字符串直接输出即 可以看到^被转义输出成了 ^也可以作为续行字符在每行的后面追加一个^在输出时可以作为一行来输出举例 echo 中华^ 人民^ 共和国 echo 万岁最终打印出 D:\Code\BATb.bat 中华人民共和国 万岁但如果把每行末尾的^去掉则是 D:\Code\BATb.bat 中华 人民 is not recognized as an internal or external command, operable program or batch file. 共和国 is not recognized as an internal or external command, operable program or batch file. 万岁直接报错。 |管道符 跟shell里一样是将前面命令的输出结果作为后面命令的输入传递并执行。 举个教程里的例子 find red a.txt | sort result.txtfind会打出所有包含red字符串的行。 管道符有个比较有意思的用法有的指令可能需要用户键入特殊值之后才能执行比如删除文件的时候需要输入yes确认后才能删除。但是使用管道符的话就可以伪装用户输入yes。 以puase指令举例 正常只执行一个puase的时候当前cmd会卡在以下界面直至你点击了任意键才会退出当前bat的执行。 但如果你执行的是 echo aaa | pause bat会将aaa传输给pause指令相当于你执行了pause指令之后又连着点了三下键a所以实际运行的时候会直接退出当前bat即 、、||组合符 连接两条命令顺序执行当前面的命令执行出错后就不再执行后面的命令执行成功后才会继续向下执行 如dir h:\ dir c:\ dir d:\ 如果你没有h盘的话那第一个命令就会报错整行命令都不会执行。 ||同样是连接两条命令顺序执行但跟正好相反它是当前执行失败后才会执行下一条指令执行正确后反而不会再向下执行。 则更加简单了它是顺序执行多条命令不管前面命令是否执行成功都会去执行后面的命令。语法格式命令一 命令二 命令三 ... 注意管道符、重定向符、组合符在运行的时候是有优先级的区别的即 管道符|的优先级 重定向符 组合符。 如dir c:\ dir d:\ a.txt 由于重定向符的优先级要高于组合符所以最终只会把d盘的目录输出到a.txt文件里。 %~参数扩展 之前讲过%0表示当前脚本而%1、%2、%3…%9表示命令行参数而%~则表示针对这些参数的扩展以针对%0的扩展为例支持的扩展方式有 %~f0将%0扩展到一个完全合格的路径名。f应该是代表full即全路径%~d0仅将%0扩展到一个驱动器号其实就是输出当前脚本所处的盘符%~p0仅将%0扩展到一个路径不包含盘符即只到当前脚本的上层文件夹p应该对应path%~n0仅将%0扩展到一个文件名不带后缀这个很好理解就是只显示当前脚本的名字n应该可以理解为name%~x0仅将%0扩展到一个文件扩展名即只显示当前脚本的后缀名%~s0扩展的路径只含有短名s大概代表short短名的意思是如果文件名超过了一定的长度限制后会按照某种规则把名字给缩短来显示。很奇怪的使用方式%~a0将%0扩展到当前脚本的文件属性%~t0将%0扩展到文件的日期和时间创建时间这个t自然代表time或者date的意思%~z0将%0扩展到文件的大小z可能代表了size 以上命令扩展也支持%~f1、%~f8等形式。 直接上例子写一个test.bat内容如下 echo offecho %%~f0 %~f0 echo %%~d0 %~d0 echo %%~p0 %~p0 echo %%~n0 %~n0 echo %%~x0 %~x0 echo %%~s0 %~s0 echo %%~a0 %~a0 echo %%~t0 %~t0 echo %%~z0 %~z0输出结果如下 D:\TEMPtest.bat %~f0 D:\TEMP\test.bat %~d0 D: %~p0 \TEMP\ %~n0 test %~x0 .bat %~s0 D:\TEMP\test.bat %~a0 --a-------- %~t0 2023/07/19 22:38 %~z0 182%s0和%a0确实没看懂。。。。 另外这些扩展参数是可以互相组合的比如说%~dp0就是拿当前脚本的完整路径不含文件名 参数扩展同样也支持其他参数比如说%~x1如果你传的第一个参数确实是个文件名比如说是a.txt那么%~x1的确会返回一个.txt。 截取/替换字符串 注释 两个冒号在一起表示注释作用跟rem是一样的语法格式:: 这是注释或者是:这是注释但还是更推荐rem 结合goto实现跳转 这个自行查看goto语法就可以 对字符串进行操作截取和替换 截取 截取的语法%variable_name:~start_pos,n_length% 如 %v:~0,5% 表示从变量v的第1个字符开始一共截取5个字符 %v:~-5% 表示截取最后5个字符 %v:~2,-5% 表示从第3个字符截取到倒数第5个字符 %v:~-2,5%表示从倒数第2个字符开始向后截取5个字符如果不够5个那就有多少显示多少 如 echo offset v123456789 echo %v% echo %v:~0,5% echo %v:~-1,5% echo %v:~-5% echo %v:~-1,-5%输出 D:\Code\BATb.bat 123456789 12345 9 56789 56789替换 语法格式 %varable_name:待替换字符串新字符串%如 echo %date% echo %date:/% echo %date:/-%输出 D:\Code\BATb.bat 周三 2023/08/16 周三 20230816 周三 2023-08-16“” 字符串界定符 允许我们在字符串里包含空格。 比如说cd c:\Program Files 2023-8-21 22:02:33 但是讲道理这个的用处好像不大因为我刚才在自己电脑上试了一下cd c:\Program Files也能正常进入目录。可能在别的场景里会更有用吧。。。 , 空格的替代符 就相当于是空格。 如dir,d:\作用跟dir d:\一毛一样。 ; 参数并列符 当多条指令所使用的命令相同的时候但参数值或者说目标值不同的时候可以使用;来并列所有的参数。 如dir c:\;d:\会顺序执行dir c:\和dir d:\ 但这里要注意并列后的命令只要有一条执行出错那所有的命令都不会执行。 如dir c:\;d:\;h:\如果我没有h盘的话那这条命令直接报错即使我有c盘和d盘也不会去执行前两个命令。 并列符只是会让写起来更简便一些个人觉得用处不大。 () 2023-8-21 22:15:29 没看懂具体的作用说是括号内的多条命令会被组合视为一条命令来执行。 感觉用处不大除了在for循环里。 跟变量延迟有关 nul nul表示将指令的输出重定向至空设备不在前台做显示类似linux里的/dev/null即黑洞 用法就更简单了比如说echo 111 nul前台不会有任何输出。 其他常用命令汇总 ren 当前文件名 新文件名即rename修改文件名 与操作系统的交互命令 explorer 语法格式explorer 完整路径 会打开指定路径处的文件资源管理器。 如explorer D:\Code\BAT 日常做一些小脚本的话还是有点用处的。 这个的原理其实很简单因为explorer.exe就是windows系统的文件资源管理器程序而且路径默认是加入了环境变量的因此我们可以在任意位置输入explorer来打开文件资源管理器。 参考文献 程序员血月-B站主页 22年的看着挺多挺全面的而且很详细建议看看哔哩哔哩-windows批处理教程 虽然有点老前面讲的也有点晦涩有的地方有些嗯但是后面给出了丰富的场景和实例还行吧。批处理之家 有点老了不过bat这么多年也没咋变过所以还是比较实用有很多小例子。bat批处理命令之Start的详细用法\批处理打开指定的应用程序\批处理最大化\最小化打开程序Windows官方文档-setlocalWindows官方文档-shift批处理命令-----shift的用法BAT脚本中%~dp0(获取当前目录)bat脚本中的%~的作用【BAT】for命令用法 写的非常好全面且深入Windows命令之findstr命令批处理实用技巧bat中冒号的作用(注释 跳转 截取、替换字符串)
http://www.sadfv.cn/news/53512/

相关文章:

  • wordpress当下载站怎么做劳务公司网站
  • 邯郸网站建设咨询安联网络平江网站建设
  • APP手机端电子商务网站建设网站降权表现
  • 旅游网站建设功能意义设计感的网站
  • 网站升级改版需要几天ppt成品免费下载的网站
  • wordpress 连接后台郴州网站优化
  • php网站开发价格蘑菇丁毕业设计网站
  • 静态网站是什么样东莞营销型网站开发
  • 遨翔网站建设wordpress网站生成app
  • 网站推广计划书范文500字泰州整站优化
  • 做网站郑州网站运营主要是做什么
  • js网站源码下载网站空间格式asp
  • 河北建设厅安监站官方网站页框 wordpress插件
  • 济南网站建设小程序开发怎样开始学做自媒体
  • 做一份seo网站诊断wordpress苏醒主题
  • 上云网站做等保人力资源公司加盟合作
  • 网站开发 理念怎么写佛山新网站制作
  • 网站全站开发长春网站建设致电吉网传媒优
  • 网站建设的栏目策划怎么做好网络营销推广
  • 怎么创建网站根目录浏览器直接进入网站的注意事项
  • 网站开发和app开发的区别宁波制作网站企业有哪些
  • 长沙做网站找哪家好构建网站需要会什么意思
  • 怎样获得做网站的客户国内做轮胎网站哪家好
  • 优惠券网站要怎么做推广贾汪城乡建设局网站
  • 如何建设红色旅游网站河南省城乡和住房建设厅网站首页
  • 网站如何提交关键词wordpress插件太多
  • iis做网站之vps企业用什么做网站
  • 环保设备网站建设方案腾讯云网站建设教程视频
  • 企业网站模板源码有哪些做外贸不能访问国外网站怎么办
  • 容桂低价网站建设WordPress主题在线生成