Windows系统Shell脚本

变量

  创建自定义变量

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

 MS-DOS的内置环境变量

// 使用set /? 查看

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

--- // 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 /?

  注释 rem或者::开头

  常用命令

# 查看所有环境变量,相当于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

# // 重命名
ren    src.txt dst.txt
rename src.txt dst.txt

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

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

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

# 属性 查看文件和文件夹属性 去掉隐藏属性 增加只读和隐藏属性
attrib /D 
attrib -h dst.txt
attrib +r +h dst.txt


# // 开始批处理文件中环境改动的本地化操作。在执行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

# 命令行相关 F7按键
doskey /history

# 删除一个或多个文件,同del
# 删除目录和子目录下文件/s
# 强制删除只读文件/f
erase *.obj
erase /s /q dir
del /f /s /q *.obj

# 重命名
ren gitignore.txt .gitignore

# 显示目录结构 仅显示包含文件夹和显示所有文件的树形结构
tree
tree /f

控制语句

分支控制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

# 空 /d /r /f /l 
# ps: 循环前注意查看当前目录(echo %CD%),%%i和%i有可能调整

--- // 显示当前目录下所有包含有.bat和.txt的文件名
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

--- // 执行dir列举隐藏文件和文件目录,之列举目录dir /AHD /B
for /f %%i in ('dir /AH /B') do ( 
echo %%i)

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

--- // 遍历参数 待确认
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

# 列举进程 查找指定进程
tasklist
tasklist | findstr /i "*.exe"

# 关闭进程(/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%

# 检测进程,并关闭进程
tasklist | findstr /i "TestApp.exe"
if %errorlevel% EQU 0 (taskkill /f /im "TestApp.exe")

# 延时5秒
choice /t 5 /d y /n >nul

常见例子 

@echo off

echo start clean ...

rem clean *converted.pcm files
for /r %cd% %%f in (*converted.pcm) do ( 
echo delete %%f
del %%f )

rem clean *out.pcm files
for /r %cd% %%f in (*out.pcm) do ( 
echo %%f
del  %%f )

rem clean *out.pcm files
for /r %cd% %%f in (*converted?_out_converted.aac) do ( 
echo %%f
del  %%f )

echo done
pause>nul

文件或文件夹信息获取

@echo off

for %%i in (*.txt) do (
echo %%i
echo %%~fi
echo %%~di
echo %%~pi
echo %%~ni
echo %%~xi
echo %%~ti
echo %%~zi)

# %%~fi:表示获取该文件的绝对路径信息
# %%~di:表示获取该文件所在的盘符
# %%~pi:表示获取该文件的路径,不包含盘符的信息
# %%~ni:表示获取该文件的文件名,不包含扩展名信息
# %%~xi:表示获取该文件的扩展名
# %%~ti:表示获取该文件的上次修改时间
# %%~zi:表示获取该文件的大小

函数调用

@echo off
 
set  runtime_dir=%cd%
set  script_dir=%~dp0
if EXIST ffmpeg_local  set  source_local_dir=%cd%\ffmpeg_local\source

rem 调用copy_header_file函数
if defined source_local_dir (
  pushd %source_local_dir%\..
  call:copy_header_file %source_local_dir% "paramter2" 300
  popd
)

pause

rem 定义copy_header_file函数
:copy_header_file
    echo %~1 %~2 %~3
goto:eof

参考

Bat 批处理之 for/f 详解

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值