http://steve-jansen.github.io/guides/windows-batch-scripting/part-1-getting-started.html

  • 注释:REM 或 :: ,但是在 FOR 循环中使用 :: 可能会出错
REM This is a comment!
:: This is a comment too!! (usually!)
  • 关闭/打开批处理输出:
@ECHO OFF     关闭之后的批处理输出,@表示关闭此句命令的输出
ECHO ON 打开输出
  • 输出一条消息
ECHO This is a message.
  • 变量:未定义的变量,值为""(空串)
  • 变量定义
SET foo=bar  注意,=左右不要有空格
SET /A foo=2+2 /A选项表示可以在赋值时使用数学计算
  • 变量定义会覆盖已有的同名变量
  • 不要将变量命名为和系统已经存在的常用变量相同的名字
  • 读取变量(两边加%)
ECHO %foo%
  • 列出所有已有的变量
SET
  • 全部变量与局部变量

变量默认都是全局的,如果想使用局部变量,先调用一句

SETLOCAL

之后设置的变量为局部变量。局部变量会在

ENDLOCAL

之后全部清除,或者是在 EXIT 命令之后清除,或者是在当前脚本结束时清除。

  • 命令行变量
% 当前正在运行的批处理文件的路径,如果路径带空格,这个值会带双引号
% 第1个参数
% 第9个参数
%~ 同%,去掉双引号
%~n0 同%~,只有名字
更多请看下面解释
%~dp0 当前脚本的父目录 %~dp1 第1个参数所表示的文件的目录或目录的父目录(如果第1个参数不是个路径的话,那么就是当前所在的目录)
%~nx1 第1个参数的名字+扩展名(也是针对路径式的参数,如果参数不是路径那这么用就没有什么意义了) SET me=%~n0
SET parent=%~dp0
 
  1. ~:去除引号
  2. d:drive
  3. p:path
  4. n:file name
  5. x:extension
  6. f:full name
  7. s:DOS 8.3风格的路径,例如C:\PROGRA~1
  • SHIFT指令
SHIFT  将命令行参数往左移一个,移完后,%1等同于移之前的%

If判断文件是否存在

// 如果文件存在就打印YES
IF EXISTS "x.bat" (
ECHO YES
) ELSE (
ECHO NO
) // 如果文件不存在就打印 do something
IF NOT EXISTS "x.bat" (
ECHO do something
)
  • IF变量判断
//
IF "%foo%"=="Qiucw" (
ECHO Yes, it's qiucw
) ELSE (
ECHO No, it's not qiucw
)
IF NOT DEFINED name (
SET name=Qiucw
) ECHO %name%
// 命令扩展
SETLOCAL ENABLEEXTENSIONS
SET age=
IF %age% EQU (
)
  1. EQU - equal
  2. NEQ - not equal
  3. LSS - less than
  4. LEQ - less than or equal
  5. GTR - greater than
  6. GEQ - greater than or equal
  • 循环
// 打印C盘所有文件
FOR %%i IN (C:\*) DO (
@ECHO %%i
)
  • 返回值
  1. %ERRORLEVEL%可以取得最近运行的程序或脚本的返回值
  2. 系统自带的命令如ECHO,IF,SET不会影响这个值
IF %ERRORLEVEL% NEQ  (
)
  • &&和||
// 此处:如果SomeCommand.exe返回值是0,则执行后面的命令
SomeCommand.exe && ECHO SomeCommand.exe succeeded! // 此处:如果SomeCommand.exe返回值不是0,则执行后面的命令
SomeCommand.exe || ECHO SomeCommand.exe failed with return code %ERRORLEVEL% // 此处,如果SomeCommand.exe返回值不是0,那么退出整个脚本(返回码1)
SomeCommand.exe || EXIT /B
  • 函数
  1. 函数要定义在脚本末尾
  2. 函数要以  EXIT /B 【ERRORCODE】返回给主逻辑
  3. 脚本主逻辑必须要以 EXIT /B 【ERRORCODE】 明确退出
@ECHO OFF
SETLOCAL :: script global variables
SET me=%~n0
SET log=%TEMP%\%me%.txt :: The "main" logic of the script
IF EXIST "%log%" DELETE /Q %log% >NUL :: do something cool, then log it
CALL :tee "%me%: Hello, world!" :: force execution to quit at the end of the "main" logic
EXIT /B %ERRORLEVEL% :: a function to write to a log file and write to stdout
:tee
ECHO %* >> "%log%"
ECHO %*
EXIT /B

:tee函数注意点

  1. 用 %* 表示所有函数参数
  2. log 要追加而不是覆盖,所以用 >> 而不是 >
  3. log文件可能带空格,所以用 "%log%" 而不是 %log%
  4. 函数结果要用 EXIT /B 0
  • Sleep
// 睡2秒
PING.EXE -N 127.0.0.1 > NUL
  • stdin, stdout, stderr

数字代号:0代表标输入,1代码输出,2代表错误

// 把 DIR 的标准输出(stdout)重定向到 temp.txt(覆盖)
DIR > temp.txt // 把 DIR 的标准输出(stdout)重定向到 temp.txt(追加)
DIR >> temp.txt
// 把 DIR 的标准错误(stderr)重定向到 temp.txt(覆盖)
DIR > temp.txt // 把 DIR 的标准错误(stderr)重定向到 temp.txt(追加)
DIR >> temp.txt
// 把标准输出和标准错误合并
DIR SomeFile.txt >&
// 合并并重定向
DIR SomeFile.txt > output.txt >&
// 使用 SomeFile.txt 做为 SORT 的输入(注意这个有别于命令行参数)
SORT < SomeFile.txt

一个程序的输出直接做为另一个程序的输入

// 例如,DIR 的输出直接做为 SORT 的输入
DIR /B | SORT

抛弃程序的输出

PING 127.0.0.1 > NULL
  • 好玩

解释:CON 是 cmd 的 stdin,然后再把 TYPE 的 stdout 重定向到 output.txt……

有点不好理解,反正结果是,可以在命令行中输入文本,输入完成后按 Ctrl+Z 保存到 output.txt。

Windows bat 学习(初级)的更多相关文章

  1. Windows bat 学习(高级)

    有一种叫做 Command Processor Extensions 的东西,即命令处理器扩展.他会使命令更加高级,功能更多. 在 cmd 里可以使用 ECHO %CMDEXTVERSION% 查看当 ...

  2. windows bat脚本编写

    windows批处理 (cmd/bat) 编程详解 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码 ...

  3. 最全的Windows Azure学习教程汇总

    Windows Azure 是微软基于云计算的操作系统,能够为开发者提供一个平台,帮助开发可运行在云服务器.数据中心.Web 和 PC 上的应用程序. Azure 是一种灵活和支持互操作的平台,能够将 ...

  4. Windows bat with adb

    /********************************************************************* * Windows bat with adb * 说明: ...

  5. Bash On Windows的学习

    Bash On Windows的学习 Bash On Windows的卸载 删除软件和设置:在 cmd 运行lxrun /uninstall 删除所有文件:在cmd中运行lxrun /uninstal ...

  6. 【记录一次windows技术学习】使用笔记本DOS命令搭建WLAN热点

    [记录一次windows技术学习]使用笔记本DOS命令搭建WLAN热点 时间:2017-10-14 22:36:13 撰写者:AK末影人 [转发请注明出处] --------------------- ...

  7. Windows BAT 命令下del 与 rd 命令

    https://blog.csdn.net/jigetage/article/details/81180757 RD 与 DEL 命令 windows bat 目录和文件的删除处理. 命令:RD,删除 ...

  8. Entity Framework学习初级篇2

    Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍 本节,简单的介绍E ...

  9. Windows Bat 批处理脚本

    Windows Bat 批处理脚本 – Getting Started – Variables – Return Codes – stdin, stdout, stderr – If/Then Con ...

随机推荐

  1. 浅谈我的UI设计之路

    时光匆匆,进入UI学习已经快两个月了,这段时间过得很充实,因为有压力才有收获. 还记的刚刚学习手绘的时候,对于这个行业只有一个初步的认识,知道自己喜欢,但是真正学习的时候才发现,我要学习的东西还有很多 ...

  2. pyinstaller将python编写的打卡程序打包成exe

    编写了一个简易的定时提醒下班打卡程序,python代码如下: #coding:utf-8 import time import datetime from tkMessageBox import * ...

  3. 关于python内存地址问题

    遇到一个朋友,给我提了一个问题:python中的两个相同的值,内存地址是否一样? 当时印象里有这样一句话:Python采用基于值的内存管理模式,相同的值在内存中只有一份 于是张嘴就说是一样的 朋友说不 ...

  4. npm模块之http-proxy-middleware使用教程(译)

    单线程node.js代理中间件,用于连接,快速和浏览器同步 Node.js代理简单. 轻松配置代理中间件连接,快速,浏览器同步等. 由流行的Nodejitsu http代理提供. TL;DR 代理/ ...

  5. Linux内核分析——第四周学习笔记20135308

    第四周 扒开系统调用的“三层皮” 一.内核.用户态和中断 (一)如何区分用户态.内核态 1.一般现在的CPU有几种不同的指令执行级别 ①在高级别的状态下,代码可以执行特权指令,访问任意的物理地址,这种 ...

  6. 评审other's意见

    评审意见 1.组 a.界面不友好 b.没连数据库 2.组 a.没连数据库 b.无智能匹配当前时间 3.组 a.基本功能实现 b.界面未优化 4.组 ourselves 5.组 a.各反面较为完善 6. ...

  7. 实训四(cocos2dx sharesdk集成-1)

    随着项目的进行,好像陷入的技术优先的迷局,对那些可以实现的功能,代码的编写上越来越漫不经心,反而对没有掌握的技术求之若渴,不免显得有些好高骛远.在没有掌握之前,思考.学习.交流也是一种快乐与享受. 言 ...

  8. 2018软工实践—Beta冲刺(7)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Beta 冲鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调组内工作 整体软件测试 展示GitHub当日代码/文档签入记录(组 ...

  9. Solr查询语法

    基于solr版本:6.0.0 当配置好本地的环境之后,就访问http://localhost:8080/solr/index.html.或者是访问已经放在服务器上的solr环境,例如http://10 ...

  10. Alpha冲刺第8天

    Alpha第8天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 03160 ...