没想到还会需要再次写批处理的一天,早先都是需要用时抱抱佛脚,导致现在都忘了差不多,既然这次刚好用到便做个记录,以加深印象。

命令

帮助

  • help 命令
  • 命令 /?

常用命令

  • cd:切换目录
    • cd ..:进入上一级目录
    • cd \:进入当前盘符的根目录
    • cd \d:切换盘符
  • md:创建文件夹(md D:\a\b\c 连续创建)
  • rd:删除文件夹
    • rd /s:包含子文件夹
    • rd /q:无需确认
  • del:删除文件
  • ver:查看系统版本
  • set:查看系统变量
  • cls:清屏
  • dir:显示当前目录文件
  • tree:以树型显示目录结构
  • type:显示文件内容
  • more:逐行显示文件内容
  • copy:复制文件
  • find:查找文件
  • time:显示当前时间
    • time /t:不提示输入日期
  • date:显示当前日期
    • date /t:不提示输入时间
  • ping
    • ping -l:指定大小
    • ping -n:指定次数

操作符

重定向

输入重定向

:: 重新排序文件,结果将显示在命令行中
sort < ip.txt

输出重定向

:: > 将输出写入到指定文件(会覆盖原文件,不存在则新建)
ipconfig > C:\ip.txt
:: >> 将输出添加到指定文件末尾
ipconfig >> C:\ip.txt

错误信息重定向

使用重定向隐藏一些命令的输出信息

:: 不显示输出结果
ipconfig > nul
:: 不显示输出结果同时不提示错误信息
ipconfi > nul 2 > nul

管道

管道(piping)可以将前一个命令的输出结果作为下一个命令的输入:

:: 最常用的是 find 和 more
:: 以行为单位从输出结果中找到有 10.1 的数据
ipconfig | find "10.1"

命令链

:: & 按顺序执行,不管失败与否
cd D:\ & dir

:: && 前一命令成功,才执行下一条命令
dir D:\ && sort

:: || 前一命令失败,才执行下一条命令
cd Z:\ || echo 不存在

可以用 () 把命令分组:

:: 把计算机名和 IP 地址写入到指定文件中
(hostname & ipconfig) > info.txt

运算符

  • equ:相等
  • neq:不相等
  • lss:小于
  • leq:小于等于
  • gtr:大于
  • geq:大于等于

脚本

脚本的开始

  • 关闭回显
    • @:关闭当前行回显;
    • echo off:从下一行开始关闭回显;
  • 空行
    • echo.:输出空白行
  • 标题
    • title:更改标题栏名称
  • 颜色
    • color:设置背景颜色
  • 注释
    • rem:注释(rem 是一条语句)
    • :::效果同上
  • 暂停
    • pause:将显示“按任意键继续…”
:: 关闭所有回显
@echo off
:: 空行
echo.
:: 设置标题
title 脚本的开始
rem 设置颜色
color 3f

跳转

:: goto 后面接着要跳转的标签
goto start
echo.
:start
echo 标签需要以冒号开头

变量

变量命名:

命名不区分大小写,可以使用字母、数字和符号,一般使用有意义的单词,多个单词使用小驼峰命名法。

变量值:

所有的变量值均以字符串形式存储。

设定变量值

:: 等号两边留有空格,常会失败
set var=value

变量的引用:

引用变量(包括内部变量),均使用 % 号包裹:OS%

变量的作用域:

在 Shell 中设置的变量适用于当前的实例,如果需要更近一步限定范围,可以使用 setlocalendlocal 语句。

语句

if 语句

  • if 语句:条件为真时执行;
  • if not 语句:条件为假时执行;
  • if…else 语句:条件为真和假时分别执行;
  • if defined 语句:指定变量存在,则执行;
  • if not defined 语句:指定变量不存在,则执行;

注:可以使用 @ 符号标记嵌套

for 语句

:: 遍历 0 - 10,步进为 2
for /l %a in (0, 2, 10) do echo %a

注:

  • for 中的变量区分大小写;
  • 在命令行交互式使用 for 时,使用的是 %variable,脚本中则是 %%varabile

程序返回码

批处理和其他脚本不同,并不能直接用 if 判断是否直接成功或失败,而是需要借助 errorlevel 命令。

:: 当前一个命令运行结束后,便可使用 errorlevel 配合 if 语句进行判断
if %errorlevel% == 1 (echo 执行失败)

返回码的错误类型值:

  • 1:表示通常的错误(最常见);
  • 2:表示执行错误,意味命令没有正确执行;
  • -2:表示算术错误;