Windows系统Shell脚本

变量

  创建自定义变量

REM 设置变量
set var1=value1
REM 打印变量
echo %var1%

 MS-DOS的内置环境变量

// 使用set /? 查看

--- // 执行程序后返回值
errorlevel
eg: if %errorlevel% EQU 0 (echo succeeded) else (echo failed)

--- // call调用bat 传入第一、二等等参数
%1 %2 ... %9
eg: call ".\Demo.bat" string1 string2  ---Demo.bat-->  if not "%1"=="string1" echo %1

--- // call调用bat 传入第一、二等等参数,当参数以引号开头时,%~1会自动将引号删除。
%~1 %~2 ...

--- // 当前日期和时间
date time ...
eg: echo %date% %time%

--- // 当前目录 
cd 
eg: echo %cd%

其他系统变量

# 只可以用在批处理文件中,表示所在的批处理文件的目录
%~dp0

# 执行脚本文件名
%~n0

# 执行脚本文件名(加后缀)
%~nx0

命令

  查看命令列表 help

  查看命令帮助 /? 例如:set /?

  常用命令

# 查看所有环境变量,相当于linux下的env
set

# // set 显示、设置或删除 cmd.exe 环境变量
set var
set /p var=输入变量值
set var=

# // findstr 在文件中寻找字符串
findstr /i call startup.bat

--- // 切换目录
cd /d d:

# // type 显示文本文件内容,与findstr结合使用
type startup.bat | findstr call

# // start 启动一个单独的窗口以运行指定的程序或命令
start iexplore www.baidu.com

--- // call 从批处理程序调用另一个批处理程序。
call startup.bat

# // pushd 保存当前目录以供 POPD 命令使用,然后改到指定的目录。
pushd d:\

# // popd  更改到 PUSHD 命令存储的目录
popd

# // md和mkdir 创建文件夹
md test1 test2
md "test1 test2"

# // rd和rmdir 删除文件夹
rd test1 test2
rd "test1 test2"
rd /s /q test1

# // 显示目录中的文件和子目录列表
dir /b

# // 移动文件并重命名文件和目录
move d:\test1 test2    // test2不存在时,移动test1到当前目录,并保存为test2 
move d:\test1 test2    // test2存在时,移动test1到test2中,作为test2的子目录 

# 复制
# xcopy 复制/e复制目录和子目录包括空目录 /s复制目录和子目录bu包括空目录
copy  /y  
xcopy /e /y  



# // 开始批处理文件中环境改动的本地化操作。在执行SETLOCAL之后所做的环境改动只限于批处理文件。
# // 要还原原先的设置,必须执行ENDLOCAL。达到批处理文件结尾时,
# // 对于该批处理文件的每个尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。
setlocal
endlocal

# // 暂停批处理
pause>nul

# // 退出 /b退出批处理而不是命令行
exit /b 1

不常用命令 

--- // assoc 显示或修改文件扩展名关联
--- // 显示当前文件关联 比如:.7z=WinRAR
assoc 
assoc .7z

--- // 显示活动代码页编号和指定代码页编号 简体中文936   MS-DOS美国英语437   UTF-8 65001 
chcp

--- // choice 该工具允许用户从选择列表选择一个项目并返回所选项目的索引。
--- // /c  选项列表,如 /c yn
--- // /n  隐藏选项列表
--- // /cs 区分大小写
--- // /t  指定超时时间,超过时间选择默认选项
--- // /d  制定默认选项
--- // /m  显示提示
choice /c yn /d y /t 10

# 重命名
ren gitignore.txt .gitignore

控制语句

分支控制if

--- // defined
if defined var1 echo var1定义
if not defined var2 echo var2未定义

--- // exist
if exist filename echo filename文件存在
if not exist filename echo filename文件不存在

--- // errorlevel
if errorlevel 0 echo 执行成功

--- // 遍历启动参数
:round
echo %1
shift
goto round

循环控制for

--- // 执行6次循环
for %%i in (1 2 3 4 5 6) do echo %%i
for /l %%i in (1,1,6) do echo %%i

--- // 显示当前目录下所有包含有e或者i的目录名
for %%c in (*.bat *.txt) do (echo %%c)

--- // 显示当前目录下所有包含有e或者i的目录名
for /d %%a in (*e* *i*) do echo %%a

--- // 遍历E盘test目录下所有文件
for /r E:\test %%b in (*) do echo %%b

--- // 遍历参数
for %a in (%*) do echo %a

--- // 1 -> 将从集合中取出元素当成文件名,并打开以每行当成一个循环单元(以非空格开头,空格截断)
--- // 2 -> 取每行元素
--- // 3 -> tokens表示第几个元素,与%%x对应,*代表整行 
--- //      比如tokens=1,3,4 %%i %%j %%k 分别对于从行取出的第一、三、四个
--- // 4 -> delims 表示分隔符,例子中表示空格作为分隔符
--- //      skip表示忽略文件前多少行
--- // 5 -> eol 表示忽略指示的行
for /f %%i in (1.txt) do echo %%i
for /f "tokens=* delims= " %%i in (1.txt) do echo %%i
for /f "tokens=1,3,4 delims= " %%i in (1.txt) do (echo %%i %%j %%k)
for /f "skip=1 tokens=* delims= " %%i in (1.txt) do echo %%i
for /f "eol=- tokens=* delims= " %%i in (1.txt) do echo %%i

常用for命令

FOR %variable IN (set) DO command [command-parameters]
FOR /D %variable IN (set) DO command [command-parameters]
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
FOR /L %variable IN (start,step,end) DO command [command-parameters]

常用脚本

# 启动文件管理器
start explorer.exe C:\Users\ws\Desktop

# 关闭进程(/t 同时终止启动的子进程 /f 强制终止进程 /im 进程名)
taskkill /pid 2560 /t /f
taskkill /im iexplore.exe

# 获取运行目录,脚本目录,上级目录
set  run_dir=%cd%
set  build_dir=%~dp0
cd   /d %build_dir%\..
set  root_dir=%cd%
cd   /d %run_dir%

参考

Bat 批处理之 for/f 详解

你可能感兴趣的:(系统)