批处理(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
)