资讯动态

Windows批处理bat的基本语法

发布时间:2026/10/8 13:18:56 来源:尧图企业网站定制
默认情况下批处理执行时会把每条命令先打印出来再执行。造成屏幕很多命令有时候我们只需要输出命令的输出结果就行了不需要吧执行的命令也输出到屏幕中如echo hello pause当然也可以全局生效使用echo off就行了但是我们也不想echo off这条命令也输出来于是我们看到很多bat批处理的第一句echo off。echoecho想当语C语言的puts即把文本输出到屏幕中如echo hello。想要输出off和on文本本身使用命令echo(off echo(on特殊字符想要输出需要转义有下列字符转义需要转义%|^!(在延迟变量情况下即setlocal enabledelayedexpansion)()这两个是for循环体中使用的^输出后面的字符^本身被忽视。echo offecho%%echo^^echo^echo^|rem 这个在延迟变量阶段会报错应该使用echo ^^!echo^!echo^(echo^)echo^echo^想要输出后不换行使用echo offnulset/pHello变量变量使用命令set定义如set astrset astr引用使用%a%和Linux的shell的$一样。变量引用%var%的替换过程发生在cmd解析的时候而不是执行的时候。可以理解为先替换后执行echo offsetaoldsetanewecho%a%以上的命令输出为old原因是在命令解析阶段已经替换为了变量值了。这个特性有了很多诡异的情况如下的bat脚本会报错echo offsetstrhello worldecho%str%原因是在解析阶段%str%被替换为了hello world而在bat里面有特殊含义world会被当成命令因此需要转义即set strhello ^ world。/a表示数学运输如set /a sum12echo off :: 十六进制set/a a0xA 0xB :: 八进制set/a b07 067 :: 这里的变量引用不需要%%set/a ca becho%c%/p用户输入相当于C语言的scanf延迟变量cmd 读到一整块代码整个for/if括号块时会先做一次语法解析%var%在这一步就被替换成当时的值——相当于拍了一张快照之后循环里变量怎么变输出的都是快照。cmd 命令解析过程cmd 解析一条命令分为以下几个阶段从上到下依次进行。1. 读取输入从 bat 脚本逐行读取括号块、if/for等复合语句整体读入读完才进入下一阶段行尾的^是续行符cmd 读到行尾是^就吞掉换行把下一行拼上来echo offechohello^ world输出helloworld2.%var%变量展开把命令里的%var%替换为当前的值。因为括号块是整体读入的块里的%var%在读入时就已定值echo offsetaoldsetanewecho%a%输出new。echo offsetaold(setanewecho%a%)输出old——块读入时a还是old%a%就已经定值了。%%会被替换为%这就是为什么不能用^转义%^转义发生在更晚的阶段管不住更早展开的%3. 特殊字符处理%var%展开后cmd 开始识别特殊字符| ( ) ^ ^是转义符让紧随其后的特殊字符失去特殊含义。^不能阻止%var%展开因为%展开在更早的阶段^的寿命只到本阶段单个^在这里就被吃掉而!要到更晚的延迟展开阶段才变特殊所以单个^也挡不住!见第 4 阶段引号内^基本失效echo a^b原样输出a^b^^会坍缩成一个能活到延迟展开阶段的^因此echo ^^!^^!输出!!4.!var!延迟展开仅在setlocal enabledelayedexpansion之后生效发生在特殊字符处理之后、每条命令执行之前。与%var%的本质区别%var%在整块读入时定值!var!在执行前才求值echo off setlocal enabledelayedexpansionsetaold(setanewecho%a%echo!a!)输出old和new。延迟展开下的转义varHELLO实测结果写入实际输出原因!var!HELLO正常延迟展开^!var^!HELLO坑^挡不住!^!var!/!var^!HELLO同上caret 被无声吃掉!var!^!HELLO尾巴的!落单被删除^^!var!!var^^坍缩成活着的^转义了后面的!!var^^!空^^未被处理变量名成了var^未定义Hello!Hello落单的!直接删除a!b!c!dacd!b!展开为空!d落单被删ab^^!cdab!cd输出字面!的正确姿势规则总结单个^在第 3 阶段就被吃掉!在第 4 阶段才变特殊所以单^挡不住!想输出字面!写^^!或临时关掉延迟展开落单的!找不到配对被直接删除不是原样输出配对从左往右第一个!到下一个!之间全部当变量名所以!var^^!查的是变量var^5. 识别与执行识别命令名内部命令echo/set等优先于同名外部程序、参数、重定向重定向、管道|在本阶段真正生效管道坑|两侧各自在子进程里重新完整走一遍解析流程会起两个字进程以后再说。echo off setlocal enabledelayedexpansion(setvHelloecho!v!)|findstr /n.endlocal输出!v!速查表想输出写法备注字面%%%bat 文件里交互命令行单个%即可字面!^^!开延迟展开时没开就写!字面^^^字面|^^|^^引号内不用转字面引号内cmd 没有\转义这套一句话总结%比^早!比^晚——cmd 的转义不是全局的是按阶段来的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑