---
title: "【batshell】bat脚本"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/bat-script-reference/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/03-软件工程与质量保障/CI-CD与质量保障/CI-CD工具链/【batshell】bat脚本.md"
content_hash: 343f433e53a1f1b2d151ab8d7cf07a4438a5c5c1f6d630a078a3c9f7dc28419d
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 【batshell】bat脚本

> 创建时间：2020/9/23 22:06

  * 【bat/shell】bat脚本
    * 特性
    * Variable
      * Assignment
      * Reading
      * Listing
      * Variable Scope (Global vs Local)
      * 一些特殊的变量
      * Tips
    * 常用命令
      * echo
      * rem ::
      * pause
      * start & call
        * start
        * call
      * set
        * 字符串操作相关
      * for
        * 无开关
        * 开关/L
      * 判断语句
      * goto
      * 目录相关（创建，删除，判断存在）
        * 删除
      * copy && xcopy
        * copy - 复制文件
        * Xcopy 支持文件/文件夹新建
      * move
      * %~dp0
      * 日期和时间
    * ref

## 特性

DOS is case insensitive.

## Variable

### Assignment

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

### Reading

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

### Listing

SET command with no arguments - list all variables for the current command prompt session

> SET will list all regular (static) variables for the current session. This listing excludes the dynamic environmental variables like %DATE% or %CD%.

### Variable Scope (Global vs Local)

By default, variables are global to your entire command prompt session.

**SETLOCAL** \- make variables local to the scope of your script.
After calling SETLOCAL, any variable assignments revert upon calling **ENDLOCAL** , calling **EXIT** , or when execution reaches the end of file ( **EOF** ) in your script.

### 一些特殊的变量

`%~dpn` \- the full path to the parent folder of the ith command line argument.
`%~dp0` \- the path of the folder for the script file

> %CD% - 扩展到当前目录字符串。
>  %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
>  %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
>  %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
>  %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
>  %CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。
>  %CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。
>  %HIGHESTNUMANODENUMBER% - 扩展到此计算机上的最高 NUMA 节点号。

### Tips

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

`SET /?` \- the help text for SET

## 常用命令

### echo

打开回显或关闭请求回显功能，或显示消息。如果没有任何参数，echo命令将显示当前回显设置。

语法

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

示例：

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

### rem ::

注释
当关闭回显时，rem和::后的内容都不会显示；
当打开回显时，rem后的内容会显示出来，然而::后的内容仍然不会显示。

### pause

暂停命令。运行 Pause 命令时，将显示下面的消息：
Press any key to continue…（或：请按任意键继续…)

### start & call

#### start

调用外部程序，所有的DOS命令和命令行程序都可以由start命令来调用。

> MIN 开始时窗口最小化
>  SEPARATE 在分开的空间内开始 16 位 Windows 程序
>  HIGH 在 HIGH 优先级类别开始应用程序
>  REALTIME 在 REALTIME 优先级类别开始应用程序
>  WAIT 启动应用程序并等候它结束
>  parameters 这些为传送到命令/程序的参数

#### call

Call xxx.bat parameter1 p2 p3
参数字符串若包含空格，必须使用引号，否则被拆成多个参数

### set

  1. 显示变量：
set 显示批处理当前已定义的所有变量及其值
set s 显示所有以s开头的变量及值

  2. 设置和调用变量，set aa=abcd，就是把aa定义为abcd。

  3. 删除变量：set aa=

#### 字符串操作相关

字符串截取
set 目标字符串=%源字符串:~起始值,截取长度%

### for

#### 无开关

`for %%i in (a,"b c",d) do echo %%i`
%%variable是批处理程序里面的书写格式，在DOS中书写为%variable

#### 开关/L

实现对循环次数的直接控制

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

创建5个文件夹:

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

### 判断语句

实用场景：调用bat时若没有传参则退出

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

/b 表示只退出批处理脚本，不退出命令行

Demo2:

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

### goto

goto 标签 注释内容（可以用作说明goto的条件和执行内容）
:标签 注释内容（可以用作标签下方段的执行内容）

### 目录相关（创建，删除，判断存在）

```csharp
string a = &quot;test&quot;;
string tmp = &quot;est&quot;;
string b = &quot;t&quot; + tmp;
Console.WriteLine(string .ReferenceEquals(str1, str2));

```

判断是否存在： if not exist %Directory%
删除目录(文件夹)： rd /s /q D:\NETDATA
删除文件： del “%Directory%\%file1%”
创建目录： md %Directory2%\picTmp

#### 删除

删除指定目录所有指定文件
del /f /s /q /a 你的文件路径*.删除的后缀

> /F 强制删除只读文件。
>  /S 从所有子目录删除指定文件。
>  /Q 安静模式。删除全局通配符时，不要求确认。
>  /A 根据属性选择要删除的文件。

### copy && xcopy

#### copy - 复制文件

file1和file2表示文件夹，不会新建文件
copy a.txt .\file1\ 若file1不存在，则显示：系统找不到指定路径
copy file1 .\file2\ 会把file1中的文件复制到file2中

#### Xcopy 支持文件/文件夹新建

copy a.txt .\file1\ 若file1不存在，则自动创建。 如果file后面去掉斜杠『\』，系统要求做出判断是建立文件还是文件夹

> 常用选项
>  /E 复制目录和子目录，包括空的。
>  /I 如果目标不存在，又在复制一个以上的文件，则假定目标一定是一个目录。
>  /Y 禁止提示以确认改写一个现存目标文件。
>  /F 复制时显示完整的源和目标文件名。

xcopy Dir1 Dir2 /E /Y /I /F

### move

移动文件
move “file.txt” “%targetDir%”

### %~dp0

%0代表bat文件本身的完整路径
~dp 是变量扩展选项（d - driver，代表盘符，p - path代表路径）

其他扩展选项：

> **%~f0** \- 完整的路径+文件名
>  **%~n0** \- 文件名(无扩展名)
>  **%~x0** \- 文件扩展名
>  %~s0 - 扩充的路径只含有短名(“s”为Short，短的)
>  %~a0 - 将 %0 扩充到文件的文件属性(“a”为attribute，即属性)
>  %~t0 - 将 %0 扩充到文件的日期/时间(“t”time)
>  %~z0 - 将 %0 扩充到文件的大小(Size 大小)

### 日期和时间

日期
格式： %date%
结果： 2012-07-31

时间呢
格式： %time%
结果： 10:21:21.68

格式： %date:~x,y%以及%time:~x,y%
说明： x是开始位置，y是取得字符数

获取完整的日期和时间
格式： %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
结果： 20120731111039

如果时间早于10点，那么只显示日期不显示时间，如：20120731
格式： %date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%
结果： 20120731052539

## ref

<https://www.jianshu.com/p/5a1a882ead95>
