批处理Batch,简称 bat)是一系列 Dos 指令依照必定的次序组成的一个可履行文件,后缀名是 .bat 或许 .cmd,其常用于 Dos 或许 Windows 系统,通常咱们是指 Dos 脚本。

本文咱们主要解说批处理的根本指令,掌握这些内容根本就能够顺畅看懂常用的批处理脚本,最终再以 vscode 源码中用于发动项目的 code.bat 脚本实战一下。下面咱们就从最熟悉的,根本上咱们都见到过的 echo 开端吧!

echo

在批处理中echo用于输出信息,默许会将指令自身也输出。创建 index.bat 文件中增加如下所示代码:

echo hello
pause

双击运转 index.bat 脚本后能够看到如下图所示内容:

批处理脚本整不明白那你可能要处处被处理

能够看到经过 echo 输出了指定的内容,pause 是暂停指令并且输出了一句 “请按任意键继续” ,否则终端运转完成后直接退出就看不到效果了。值得留意的是 echo 指令自身也被输出了,假如要关闭批处理指令自身的输出能够经过 @echo off 设置从此行开端往后不再输出批处理指令自身,出发遇到了 @echo on 从头敞开输出指令自身 (假如遇到了中文乱码的问题请往后看):

:: 设置不再输出指令自身
@echo off
:: 输出hello字符
echo hello
:: 暂停
pause

批处理脚本整不明白那你可能要处处被处理

这儿的 ::vscode 中表明的是注释,:: 后边跟着注释内容。注释还能够运用 @rem表明:

:: comments
@rem comments

假如在编码 bat 脚本时需求用到中文,则在运用 vscode 时有可能会遇到中文乱码问题,其他的比方记事本或许 notepad++ 不会。在 vscode 中编写带中文的 bat 文件需求做一些修改器设置。首要咱们写个带中文的 bat 脚本如下所示:

:: 中文注释
@echo off
:: 输出中文内容到一个中文称号的文件中
echo 你好 > 你好.txt
pause

首要需求确认换行符是CRLF(假如是 windows 系统)和编码格局是 GBK的,如下图所示:

假如不是则需求设置成 GBKCRLF。然后在面板中将翻开 bat 文件的编码格局也设置成 GBK 的,这样今后翻开 bat 文件都是 GBK 了,否则默许翻开都是以 utf8 预览的,这样就会看到乱码。

批处理脚本整不明白那你可能要处处被处理

批处理脚本整不明白那你可能要处处被处理

装备都完成后咱们再从头翻开修改 bat 脚本,然后保存运转测验,发现运转和预览都正常了,如下图所示:

批处理脚本整不明白那你可能要处处被处理

输出重定向

  • > 将内容输出到指定的方位,比方写入到指定文件,输出到空设备、控制台等。值得留意的是>是掩盖输出:
@echo off
:: >指令是掩盖输出
echo 123 > hello.txt
:: 456会掩盖123内容
echo 456 > hello.txt
pause
  • >>指令能够做到追加输出,比方:
@echo off
:: >>指令是追加输出
echo 123 >> hello.txt
:: 456会追加在123后边
echo 456 >> hello.txt
pause

set

在批处理中 set 指令是用来检查、设置和移除环境变量的。

运用 set 指令不加任何参数能够检查一切的环境变量,set key=value 的形式的设置环境变量,key 是变量名,value 是变量值。

@echo off
:: 设置环境变量
set envVarName=envVarValue
:: 检查一切环境变量
set
:: 检查环境变量称号为envVarName最初的环境变量
set envVarName
pause

批处理脚本整不明白那你可能要处处被处理

set 指令运用 /A 参数能够让右值支撑表达式写法:

@echo off
set demoEnv=123
:: demoEnv2的值是3
set /A demoEnv2=1+2
:: demoEnv2的值是126,是demoEnv变量的值加demoEnv2的值的成果
set /A demoEnv3=%demoEnv% + %demoEnv2%
set demoEnv
pause

批处理脚本整不明白那你可能要处处被处理

set 指令赋值是右侧内容为空则能够移除环境变量,如下所示:

批处理脚本整不明白那你可能要处处被处理

运用 setlocalendlocal 指令能够区分一个部分效果域,在该效果域内设置的变量不会影响到外部的环境变量:

批处理脚本整不明白那你可能要处处被处理

文件途径相关

%~dp0 获取脚本文件地点文件目录, %cd% 获取当时脚本履行地点环境的文件目录:

@echo off
:: 获取脚本文件地点文件目录
echo %~dp0
:: 获取当时脚本履行地点环境的文件目录
echo %cd%
pause

批处理脚本整不明白那你可能要处处被处理

除此之外,如下更多获取文件途径等相关指令如下:

批处理脚本整不明白那你可能要处处被处理

字符串处理

  • 字符串截取

运用 %变量名:~下标, 字符数% 能够截取环境变量的值的子字符串,~ 指定截取字符串的开端位(从 0 开端),, 后边的参数指定截取的字符数:

批处理脚本整不明白那你可能要处处被处理

  • 字符串替换

%变量名:替换方针=替换内容% 指令能够替换字符串,留意 : 后边的空格也会表明一个字符,因此要当心增加空格。假如要移除指定内容,则将要替换的字符串不设置值即可,如下所示:

@echo off
set demoEnv=abcade
:: 输出bcde
echo %demoEnv:a=%
set demoEnv2=abc
:: 输出 ffbc
echo %demoEnv2:a=ff%
pause

for循环

for 指令用于对一组字符串或许文件履行某些指令,会顺次提取每个元素将值赋给指定的变量,然后对运转履行 do 后边的指令。%% 符号是在 for 循环中设置和获取变量的语法。根本格局如下所示:

@echo off
:: 循环一组字符串
for %%i in (HELLO,WORLD) do (
   echo %%i
)
pause

批处理脚本整不明白那你可能要处处被处理

for 指令能够遍历一组文件,能够运用通配符 * 表明一切文件。留意,假如echo输出的内容含有特别字符则需求运用 对特别字符进行转义,如下所示:

@echo off
:: 遍历当时目录下一切文件
:: 也能够运用类似aa.*等的格局
for %%a in (*) do (
   :: 输出迭代内容
   echo ^|--%%a
)
pause

批处理脚本整不明白那你可能要处处被处理

for 指令的 /F 参数能够用来处理文件内容或许一些指令的回来成果,能够提取文件内容进行逐行分析处理。根本指令格局如下:

for /F "指定指令的参数" in (文件或许指令) do (
  :: 待运转的指令
)

假设有一个 hello.txt 文件,文件内容如下图所示:

批处理脚本整不明白那你可能要处处被处理

下面演示读取 hello.txt 文本内容按行遍历,运用空格切割每行内容,提取切割后的榜首列和第二列子字符串进行输出:

批处理脚本整不明白那你可能要处处被处理

/F 参数的内容如下所示:

  • delims 指定切割内容,能够指定多个分隔符,比方delims=|:;指定了运用竖线、冒号和分号进行切割,假如包含空格则要把空格放在最终
  • tokens 指定如何提取切割后的子字符串,tokens=n,m,z指定提取第 n 例、第 m 列和第 z 列,tokens=m-n指定提取第 m 列到第 n 列,提取的子字符串会赋值给指定的环境变量(例如这儿的 %%a),并且会顺次递增赋值给%%b%%c,一直到 %%z
  • skip=n 指定解析文件时从文件头部越过的行数
  • eol=c 指定忽略以指定字符最初的行数

假如 for 循环处理的文件名包含空格,则需求运用双引号包裹起来。

code.bat实战

:: 从当时行开端不显现指令自身
@echo off
:: 设置部分效果域
setlocal
:: 设置控制台标题
title VSCode Dev
:: 记录项目根途径的方位
:: pushd记录方位,后续履行popd指令时跳转回该方位
:: %~dp0表明脚本文件地点文件目录的方位,\..表明再上一层目录
pushd %~dp0\..
:: Get electron, compile, built-in extensions
:: 预发动
:: 假如变量 VSCODE_SKIP_PRELAUNCH 不存在,履行 node build/lib/preLaunch.js指令
:: 留意:在.vscode/settings.json中装备了files.exclude字段指定不显现的内容
::      因此在vscode中看不到build/lib/preLaunch.js文件,其内容是build/lib/preLaunch.ts编译后的产物
if "%VSCODE_SKIP_PRELAUNCH%"=="" node build/lib/preLaunch.js
:: 从product.json文件中提取nameShort字段的值(Code - OSS),该值实则是electron.exe的称号
:: findstr从product.json文件中提取含有 "nameShort":.* 格局的行
::    /R表明把后边的参数作为表达式运用,/C:"xxx"表明指定的字符串包含的空格不能作为分隔符
:: for循环迭代筛选的行,`delims=:,`按分号或逗号切割字符串,`token=2`提取切割成果的第二项
::    将提取成果赋值给变量a,设置环境变量NAMESHORT的成果为环境变量a,%%~a中的~表明去掉一切的引号
for /f "tokens=2 delims=:," %%a in ('findstr /R /C:"\"nameShort\":.*" product.json') do set NAMESHORT=%%~a
:: 去除NAMESHORT变量的一切 空格引号 两个字符
set NAMESHORT=%NAMESHORT: "=%
:: 去除NAMESHORT变量的一切引号,并且在后边拼接.exe字符
set NAMESHORT=%NAMESHORT:"=%.exe
:: 拼接CODE变量值为electron的程序途径
set CODE=".build\electron\%NAMESHORT%"
:: Manage built-in extensions
:: 调用code.bat时榜首个参数传递的是--builtin则跳转到下面builtin的方位处履行
if "%~1"=="--builtin" goto builtin
:: Configuration
:: 装备环境变量
set NODE_ENV=development
set VSCODE_DEV=1
set VSCODE_CLI=1
set ELECTRON_ENABLE_LOGGING=1
set ELECTRON_ENABLE_STACK_DUMPING=1
:: Launch Code
:: 程序发动的代码
:: 调用electron程序履行根目录下文件,会自动获取package.json中指定的main字段作为发动入口
:: main字段指定的为./out/main,该文件由src/main.js编译而来
%CODE% . %*
goto end
:builtin
%CODE% build/builtin
:end
:: 跳转回pushd记录的方位,即项目根目录
popd
endlocal

这儿的根本指令信任咱们都看得理解,code.bat 脚本是 vscode 源码的项目发动脚本,这个脚本主要做了两件事:

  • 履行一个 node build/lib/preLaunch.js 指令履行预发动相关的内容
  • 依据 product.json 中的 nameShort 字段找到实在的 electron 发动程序的方位,运转该程序(类似于 electron your/main/emtry