教你编写bat脚本Windows批处理

目录
  • 常见用途
  • bat命令速查
    • 常用参数
  • echo
  • 注释
    • Rem
    • 使用::声明
  • dir :获取目录内容
  • > :将输出重定向到文件
  • 变量
    • 命令行参数
    • set命令
      • 字符串
      • 数值
  • 局部变量 vs 全局变量
  • 环境变量输出
  • 字符串
    • 创建
    • 空字符串
    • 字符串拼接
    • 字符串长度
    • 转int
    • 截取
    • 右对齐
    • 删除字符串
    • 删除两端(保留中间)
    • 删除空格:=
    • 替换
  • 数组
    • 创建
    • 访问
    • 修改
    • 迭代
    • 数组长度
    • 结构体
  • if语句
    • if defined :变量是否存在
    • if exists:文件是否存在
    • if errorlevel:测试运行的最后一个命令的退出代码
  • for语句
    • /d
    • /r
    • /l
    • /f
  • goto语句
  • 运算符
    • 关系运算符
  • 系统日期
    • 日期格式化
  • 系统时间
  • 输入输出
    • 重定向
  • 函数
    • 调用 call :function_name
  • 进程
    • 查看进程列表TASKLIST
    • 终止进程
    • 启动进程
  • 别名
    • doskey 别名管理
      • 创建
      • 删除
  • 管道(|)

批处理脚本文件具有特殊的扩展名BAT或CMD,这种类型的文件通过称为**命令解释器(cmd.exe)**的系统文件提供的接口(shell)来识别和执行。

常见用途

  • 为不同的目的设置服务器
  • 自动管理活动和日志,如删除不需要的文件或日志文件
  • 自动将应用程序从一个环境部署到另一个环境。
  • 立即在各种机器上安装程序。

bat命令速查

命令 备注
VER 显示正在使用的MS-DOS的版本
ASSOC 这是将扩展名与文件类型(FTYPE)相关联的批处理命令,显示现有关联或删除关联
cd 更改不同的目录,或显示当前目录
CLS 清屏
COPY 文件复制
DEL 删除文件
DIR 列出目录内容
DATE 系统日期
ECHO 显示消息,或打开、关闭命令回显
EXIT 退出DOS控制台
MD 创建目录
MOVE 移动文件或目录
PATH 显示或设置路径变量
PAUSE 等待输入
PROMPT 用于更改或重置cmd.exe提示符
RD 删除目录(需为空)
REN 重命名文件和目录
REM 注释
START 在新窗口中启动程序,或打开文档
TIME 设置或显示时间
TYPE 将文件或文件的内容打印到输出中
VOL 显示卷标
ATTRIB 显示或设置当前目录中的文件的属性
CHKDSK 检查磁盘是否有问题
CHOICE 为用户提供了一个选项列表
CMD 调用另一个命令提示符实例
COMP 根据文件大小比较2个文件
CONVERT 将卷从FAT16或FAT32文件系统转换为NTFS文件系统
DRIVERQUERY 显示所有已安装的设备驱动程序及其属性
EXPAND 从压缩的.cab压缩文件中提取文件
FIND 在文件或输入中搜索字符串,输出匹配的行
FORMAT 将磁盘格式化为使用Windows支持的文件系统(如FAT,FAT32或NTFS),从而覆盖磁盘的先前内容
HELP 显示Windows提供的命令的列表
IPCONFIG 显示Windows IP配置。显示连接的配置和连接的名称
LABEL 添加,设置或删除磁盘标签
MORE 一次显示一个或多个文件的内容
NET 根据使用的命令提供各种网络服务
PING 通过网络将ICMP/IP “回显”发送到指定的地址的包
SHUTDOWN 关闭计算机,或者注销当前用户
SORT 从源文件获取输入,并按字母顺序排序其内容,从A到Z或从Z到A。它将在控制台上打印输出
SUBST 将驱动器号分配给本地文件夹,显示当前分配或删除分配
SYSTEMINFO 该批处理命令显示计算机及其操作系统的配置
TASKKILL 该批处理命令结束一个或多个任务
TASKLIST 列出任务,包括任务名称和进程标识(PID)
XCOPY 以更高级的方式复制文件和目录
TREE 将当前目录的所有子目录的树显示为递归或深度的任何级别
FC 列出两个文件之间的实际差异
DISKPART 显示和配置磁盘分区的属性
TITLE 该批处理命令设置控制台窗口中显示的标题
SET 显示当前系统上的环境变量列表

常用参数

/L: for循环移动范围的/L参数用于迭代数组
/A:数值

echo

@echo off
  • “echo off” :关闭脚本的显示(不显示命令)。
  • “@” :使命令也适用于自己。

注释

Rem

Rem Remarks

程序执行时忽略Rem关键字之后的任何内容。

使用::声明

:: Remarks

dir :获取目录内容

> :将输出重定向到文件

@echo off
Rem This is for listing down all the files in the directory Program files
dir "C:\Program Files" > C:\lists.txt
echo "The program has completed"

变量

命令行参数

rem Test.bat
@echo off
echo %1
echo %2
echo %3

运行方式

Test.bat 1 2 3

set命令

set /A variable-name=value

  • variable-name: 变量的名称
  • value:变量值。
  • /A:如果该值本质上是数值,则使用此开关。

字符串

@echo off
set message=Hello World
echo %message%
rem 变量需要包含在%符号中显示

数值

@echo off
SET /A a=5
SET /A b=10
SET /A c=%a% + %b%
echo %c%

局部变量 vs 全局变量

  • 默认情况下为全局变量。
  • 调用SETLOCAL命令,使变量局部在脚本的范围内。
  • 在调用SETLOCAL之后,任何变量赋值在调用ENDLOCAL,调用EXIT,或者当执行到达脚本中的文件结尾(EOF)时都会返回。
@echo off
set globalvar=5
SETLOCAL
set var=13145
set /A var=%var% + 5
echo %var%
echo %globalvar%
ENDLOCAL

环境变量输出

@echo off
echo %JAVA_HOME%

字符串

创建

set message=Hello World

空字符串

SET a=
if [%a%]==[] echo "String A is empty" 

要检查是否存在空字符串,需要在方括号中包含变量名,并将其与方括号中的值进行比较。

字符串拼接

@echo off
SET a=Hello
SET b=World
SET /A d=50
SET c=%a% and %b% %d%
echo %c%
:: Hello and World 50

字符串长度

@echo off
set str=Hello World
call :strLen str strlen
echo String is %strlen% characters long
exit /b
:strLen
setlocal enabledelayedexpansion
:strLen_Loop
   if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof

转int

使用set变量设置为字符串的变量后,可以使用set变量的**/A开关转换为整数**。

@echo off
set var=13145
set /A var=%var% + 5
echo %var%

截取

%variable:~num_chars_to_skip%
%variable:~num_chars_to_skip,num_chars_to_keep%

输出:

Helloworld 
Hello

~0,5用于指定需要显示的字符

右对齐

@echo off
set x=1000
set y=1
set y=%y%
echo %x% 

set y=%y:~-4%
echo %y%

输出​​​​​​​

1000
1

使用~-4选项来表示只想显示字符串y的最后4个字符

删除字符串

@echo off
set str=Batch scripts is easy. It is really easy.
echo %str%
:: 删除is
set str=%str:is=%
echo %str%
:: Batch scripts easy. It really easy.

删除两端(保留中间)

@echo off
set str=Batch scripts is easy. It is really easy
echo %str% 

set str=%str:~1,-1%
echo %str%
:: atch scripts is easy. It is really eas

删除空格:=

@echo off
set str=This string    has    a  lot  of spaces
echo %str% 

set str=%str:=%
echo %str%
:: Thisstringhasalotofspaces

替换

@echo off
set str=This message needs changed.
echo %str% 

set str=%str:needs=has%
echo %str%
:: This message has changed.

数组

创建

  • 方法一:set
set a[0]=1
  • 方法二:值列表遍历
@echo off
set list=1 2 3 4
(for %%a in (%list%) do (
   echo %%a
))

访问

echo %a[0]%

修改

Set a[3]=4 

迭代

@echo off
setlocal enabledelayedexpansion
set topic[0]=comments
set topic[1]=variables
set topic[2]=Arrays
set topic[3]=Decision making
set topic[4]=Time and date
set topic[5]=Operators 

for /l %%n in (0,1,5) do (
   echo !topic[%%n]!
)

for循环移动范围的/L参数用于迭代数组

数组长度

@echo off
set Arr[0]=1
set Arr[1]=2
set Arr[2]=3
set Arr[3]=4
set "x=0"
:SymLoop 

if defined Arr[%x%] (
   call echo %%Arr[%x%]%%
   set /a "x+=1"
   GOTO :SymLoop
)
echo "The length of the array is" %x%

结构体

@echo off
set len=3
set obj[0].Name=Joe
set obj[0].ID=1
set obj[1].Name=Mark
set obj[1].ID=2
set obj[2].Name=Mohan
set obj[2].ID=3
set i=0
:loop
if %i% equ %len% goto :eof
set cur.Name=
set cur.ID=
for /f "usebackq delims==.tokens=1-3" %%j in (`set obj[%i%]`) do (
   set cur.%%k=%%l
)
echo Name=%cur.Name%
echo Value=%cur.ID%
set /a i=%i%+1
goto loop

if语句

if %c%==15 (echo "The value of variable c is 15") else (echo "Unknown value") 

if defined :变量是否存在

if defined str1 echo "Variable str1 is defined"

if exists:文件是否存在

if exist C:\set3.txt (echo "File exists") else (echo "File does not exist")

if errorlevel:测试运行的最后一个命令的退出代码

if errorlevel n somecommand

各种命令发出整数退出代码来表示命令的状态。 通常,如果命令成功完成,则命令通过传递0;如果命令失败,命令通过传递1。

for语句

  • %variable 指定一个单一字母可替换的参数。注意:批处理脚本中使用%%variable
  • (set) 指定一个或一组文件。可以使用通配符。
  • command 指定对每个文件执行的命令。
  • command-parameters 为特定命令指定参数或命令行开关。

/d

/r

/l

/f

goto语句

@echo off
SET /A a=5 

if %a%==5 goto :labela
if %a%==10 goto :labelb
:labela
echo "The value of a is 5"
exit /b 0
:labelb
echo "The value of a is 10"

运算符

关系运算符

运算符 备注
EQU 相等
NEQ 不等
LSS 左小于右
LEQ 小于等于
GTR 大于
GEQ 大于等于

系统日期

echo %DATE%

日期格式化

@echo off
echo/Today is: %year%-%month%-%day%
goto :EOF
setlocal ENABLEEXTENSIONS
set t=2&if "%date%z" LSS "A" set t=1 

for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('echo/^|date') do (
   for /f "tokens=%t%-4 delims=.-/ " %%d in ('date/t') do (
      set %%a=%%d&set %%b=%%e&set %%c=%%f))
endlocal&set %1=%yy%&set %2=%mm%&set %3=%dd%&goto :EOF

系统时间

echo %TIME%

输入输出

  • 0:stdin 标准输入
  • 1:stdout 标准输出
  • 2:stderr 错误消息

重定向

DIR C:\ > lists.txt 2> &1
  • 使用文件编号和"&"前缀来组合stdout和stderr流

函数

:function_name
Do_something
EXIT /B 0
  • function_name是赋予函数的名字,它应该与函数的实际功能相匹配。
  • EXIT语句用于确保函数正常退出.
:Display
SET /A index=2
echo The value of index is %index%
EXIT /B 0

调用 call :function_name

@echo off
Rem main
SETLOCAL
CALL :Display 5 , 10
EXIT /B %ERRORLEVEL%
Rem function
:Display
echo The value of parameter 1 is %~1
echo The value of parameter 2 is %~2
EXIT /B 0
  • 确保在主程序中放入EXIT / B%ERRORLEVEL%语句,以便将主程序的代码与函数分开。
  • 使用~1来访问发送给函数的第一个参数,同样使用~2来访问第二个参数。

进程

查看进程列表TASKLIST

:: 获取内存大于40MB的进程
tasklist /fi "memusage gt 40000"
   
/S system 指定要连接的远程系统
/U [domain]user 指定命令应在其下执行的用户上下文
/P [password] 指定给定用户上下文的密码。 提示输入,如果省略。
/M [module] 列出当前使用给定的exe / dll名称的所有任务。 如果未指定模块名称,则显示所有已加载的模块。
/SVC 显示每个进程中托管的服务。
/V 显示详细的任务信息。
/FI filter 显示一组符合过滤器指定条件的任务。
/FO format 指定输出格式。 有效值:TABLE,LIST,CSV。
/NH 指定“列标题”不应显示在输出中。 仅适用于TABLE和CSV格式。
:: 获取内存大于40MB的进程
tasklist /fi "memusage gt 40000"

终止进程

START "title" [/D path] [options] "command" [parameters]
   
/S system 指定要连接的远程系统
/U [domain]user 指定命令应在其下执行的用户上下文。
/P [password] 指定给定用户上下文的密码。 提示输入,如果省略。
/FI FilterName 应用过滤器来选择一组任务,允许使用*通配符。
/PID processID 指定要终止的进程的PID。使用TaskList来获取PID。
/IM ImageName 指定要终止的进程的映像名称。 通配符*可用于指定所有任务或图像名称。
/T 终止指定的进程以及由其启动的任何子进程。
/F 指定强制终止进程。
:: 杀死(终止)打开的记事本任务
taskkill /f /im notepad.exe
:: 杀死了一个ID为9901的进程
taskill /pid 9901

启动进程

START "title" [/D path] [options] "command" [parameters]
   
title CMD窗口标题栏的文本(必需)
path 起始目录。
command 命令,批处理文件或可执行程序运行。
parameters 传递给命令的参数

options:

   
/MIN 启动窗口最小化。
/MAX 启动窗口最大化。
/LOW 使用IDLE优先级。
/NORMAL 使用NORMAL优先级。
/ABOVENORMAL 使用ABOVENORMAL优先级。
/BELOWNORMAL 使用BELOWNORMAL优先级。
/HIGH 使用HIGH优先级。
/REALTIME 使用REALTIME优先级。
:: 在新窗口中运行批处理脚本test.bat。 窗口将以最小化模式启动,并且指定标题为:“Test Batch Script”。
START "Test Batch Script" /Min test.bat
:: 在另一个进程中运行Microsoft Word,然后在MS Word中打开文件TESTA.txt
START "" "C:\Program Files\Microsoft Office\Winword.exe" "D:\test\TESTA.txt"

别名

dw=dir /w

当要执行dir /w命令时,可以简单地键入dw这个单词。dw这个词现在已经成为命令dir /w的别名。

doskey 别名管理

DOSKEY [options] [macroname=[text]]

创建

@echo off
doskey cd=cd/test
doskey d=dir

删除

@echo off
doskey cd=cd/test
doskey d=dir
d=

将d的值设置为NULL,所以宏d将被删除。

管道(|

管道运算符(|)将一个命令的输出(默认为STDOUT)引导到另一个命令的输入(默认为STDIN)。

:: 两个命令同时启动,但是sort命令暂停,直到它接收到dir命令的输出。
:: sort命令使用dir命令的输出作为输入,然后将其输出发送到句柄1(即STDOUT)。
dir C:\ | sort

到此这篇关于教你编写bat脚本Windows批处理的文章就介绍到这了,更多相关bat脚本Windows批处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • windows如何使用bat脚本后台启动/停止和重启jar包服务

    前提:windows上安装jdk 1.启动jar脚本 @echo off START "app" javaw -jar app-0.0.1-SNAPSHOT.jar 2.停止jar脚本(如:jar包端口9090) @echo off set port=9090 for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do ( echo kill the process %%m

  • Windows环境bat脚本获取文件的创建时间

    windows环境获取时间相关概念 1.windows下DOS窗口date格式 针对date的结果将其进行格式化显示,如:YYYY-MM-DD 就要进行如下操作: 日期截取遵从格式 %date:~x,y%,表示从第x位开始,截取y个长度(x,y的起始值为0) 年份从第0位开始截取4位,月份从第5位开始截取2位,日期从第8位开始截取2位 2.windows下DOS窗口time格式 针对time的结果将其进行格式化显示,如:HH:MM:SS就要进行如下操作: 时间截取遵从格式 %time:~x,y%

  • Windows下bat批处理脚本使用telnet批量检测远程端口小记

    多年没写过批处理了,来新公司的第一个case却是需要写一个bat脚本,批量更新采集agent的配置文件,其中就涉及到远程IP的端口检测. 本以为会和Linux一样可以简单判断: 复制代码 代码如下: echo q|telnet -e 'q' $ip $port && echo "$ip:port 通"||echo "$ip:port 不通" 结果发现Windows下面telnet退出并没有执行结果的返回值: 一.借助工具 于是我优先开启懒人法则,找其

  • Windows使用bat批处理实现守护进程脚本分享

    本文转自网络,由于找不到原作者,因而无法知道出处.如果有幸让原作者看到,请联系我加上.先转载至此. 最近几天加班加疯掉了,天天晚上没法睡.开发部的一个核心程序总是会自己宕机,然后需要手工去起,而这个服务的安全级别又很高,只有我可以操作,搞得我晚上老没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell守护进程,这回搞个windows下的bat版守护程序吧,当时晚上思路已经很迟钝了,就叫了个兄弟让他写了,上去后运行效果不错,至少昨晚我安心睡了7小时.   早上来把程序改完善一些,增加了记录

  • Windows Bat脚本实现定时重启应用程序的项目实践

    目录 关闭和重启应用程序脚本 1.执行流程: 2.tasklist杀死线程基本命令 3.设置定期任务 关闭和重启应用程序脚本 @echo off echo "killing application ..." taskkill /f /im wemeetapp.exe echo "application was killed successfully." @ping 127.0.0.1 -n 6 >nul echo "starting applicat

  • 使用 windows bat 脚本命令一键启动MySQL服务的方法

    @echo off rem Copyright (c) 2019 Moses and/or its affiliates. rem Get Administrator Rights >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%' NEQ '0' ( goto UACPrompt ) else (

  • Windows bat脚本之for循环用法详解

    Windows bat脚本的for语句基本形态如下: 在cmd窗口中:for %I in (command1) do command2 在批处理文件中:for %%I in (command1) do command2 之所以要区分cmd窗口和批处理文件两种环境,是因为在这两种环境下,命令语句表现出来的行为虽然基本一样,但是在细节上还是稍有不同,最明显的一个差异就是:在cmd窗口中,for之后的形式变量I必须使用单百分号引用,即%I:而在批处理文件中,引用形式变量I必须使用双百分号,即%%I.为

  • 教你编写bat脚本Windows批处理

    目录 常见用途 bat命令速查 常用参数 echo 注释 Rem 使用::声明 dir :获取目录内容 > :将输出重定向到文件 变量 命令行参数 set命令 字符串 数值 局部变量 vs 全局变量 环境变量输出 字符串 创建 空字符串 字符串拼接 字符串长度 转int 截取 右对齐 删除字符串 删除两端(保留中间) 删除空格:= 替换 数组 创建 访问 修改 迭代 数组长度 结构体 if语句 if defined :变量是否存在 if exists:文件是否存在 if errorlevel:测

  • 教你编写 Pipeline 脚本的方法

    目录 前言 调试 grok 和 pipeline Grok 通配搜索 多行如何处理 Pipeline 字段命名注意事项 完整 Pipeline 示例 如何在一个 Pipeline 中切割多种不同格式的日志? 如何丢弃字段切割 add_pattern()转义问题 前言 Pipeline 编写较为麻烦,为此,DataKit 中内置了简单的调试工具,用以辅助大家来编写 Pipeline 脚本. 调试 grok 和 pipeline 指定 pipeline 脚本名称,输入一段文本即可判断提取是否成功 P

  • 教你编写Windows的VBScript与Mac的AppleSCript脚本解放双手

    目录 一.Windows 篇 —— VBScript 1.效果图 2.VBS 简介 3.代码实现 4.代码详解 5.其他语法 6.附:VBS 特殊字符表格 二.Mac 篇 —— AppleScript 1.效果图 2.代码实现 3.代码详解 一.Windows 篇 —— VBScript 最近发现 windows 上有一个好玩的东西,叫做 VBScript,可以用来自动执行一些操作. 1.效果图 先来看下最终效果吧! 以上就是一个简单的 VBS 脚本,运行时自动打开 Chrome 浏览器,然后自

  • 批处理BAT脚本中set命令的使用详解(批处理之家Batcher)

    目录 一.使用 set 命令进行赋值 1.等号两边不要有空格 2.变量值包含特殊字符需用双引号 3.避免使用系统环境变量同名的自定义变量 4.语法可行但不推荐使用 二.使用 set /p 命令读取输入 三.使用 set /a 命令进行数学运算(1) 四.使用 set /a 命令进行数学运算(2) 五.使用 set 命令进行字符串截取 六.使用 set 命令进行字符串替换 七.set命令知识点(1)把命令结果赋值给变量 八.set命令知识点(2)显示以某字符开头的变量 一.使用 set 命令进行赋

  • Windows 批处理cmd/bat常用命令详解

    目录 Windows批处理(cmd/bat)常用命令教程 常见问题: 前言 什么是批处理? 怎么创建批处理文件? 批处理命令简介 批处理常用命令总结 批处理符号简介 常用DOS命令 Windows Batch 常用命令 常见问题: 1.如果你自己编写的.bat文件,双击打开,出现闪退 2.批处理.bat 文件中输出中文乱码 Windows批处理(cmd/bat)常用命令教程 常见问题: 1.如果你自己编写的.bat文件,双击打开,出现闪退 2.批处理.bat 文件中输出中文乱码 解决方法在文章末

  • Windows系统清理QQ聊天记录、反监控QQ聊天的BAT脚本分享

    今天女朋友告诉我说她们公司居然查看她们qq聊天记录,对于这样的公司我只能说x,好吧,写个脚本先清理下本地的qq聊天记录,再去找机器是否有安装监控软件. 系统:windows 软件:qq 2013 下面是我写的清理qq聊天记录的bat脚本,内容如下: 复制代码 代码如下: @echo off taskkill /f /im qq.exe taskkill /f /im qqprotect.exe taskkill /f /im txplatfirm.exe cd C:\Documents and

  • Windows 2008任务计划执行bat脚本失败返回0x1的解决方法

    测试环境: C:\>systeminfo | findstr /c:"OS Name" OS Name: Microsoft Windows Server 2008 R2 Enterprise 很多人在Windows 2008里面创建任务计划执行bat文件的时候都会遇到这样的问题:任务计划执行之后返回的状态码是0x1而不是正常的0x0 我今天也被这个问题给坑了,几乎花了一天的时间来排错.单独执行bat脚本一切正常,在Windows 2003的任务计划里面执行bat脚本也没有问题,

  • Oracle 批处理自动备份bat脚本语句的步骤详解

    开门见山 1.备份的语句能执行 2.创建一个检单bat脚本能执行 3.把备份的语句放到bat 脚本里面 示例 @echo off echo 正在备份 Oracle 数据库,请稍等-- set expname=%date:~0,4%%date:~5,2%%date:~8,2% expdp 用户名/密码@orcl schemas=导出的用户 directory=备份的文件夹 dumpfile=%expname%.dmp logfile=%expname%.log 步骤 1.备份语句 确保导出的语句能

  • windows 批处理bat连接本地mysql 创建制定数据 并执行sql文件

    实例代码 @echo off set path=C:\Program Files\MySQL\MySQL Server 5.7\bin cd ./ set CURR_PATH=%cd% mysql -h localhost -u root --password=123456 < operate.txt mysql -h localhost -u root -p stcounter < stcounter.sql --password=123456 @echo off:关闭回显  不出现在doc

随机推荐