批处理(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的,如下图所示:
假如不是则需求设置成 GBK 和 CRLF。然后在面板中将翻开 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 指令赋值是右侧内容为空则能够移除环境变量,如下所示:
运用 setlocal 和 endlocal 指令能够区分一个部分效果域,在该效果域内设置的变量不会影响到外部的环境变量:
文件途径相关
%~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)
















