背景
在搭建DevOps流水线的时候,如果遇到Windows构建环境,我们或多或少需要用到CMD命令或Batch Script,每次到用的时候总觉得知识匮乏,记录下。
常用命令
清除屏幕(cls)
Clear Screen
将输入命令的cmd窗口显示的字符全部清除
cls
改变目录(cd)
Change Directory
cd
,是在Unix、类Unix、Windows和DOS操作系统下用于改变工作目录的命令行命令。在Unix的Shell脚本与Windows或DOS的批处理文件中亦可使用。
通过cd
命令,可以前进到子目录、后退到父目录、回到根目录(Unix下为/
,DOS下为\
)或者进入到任何给出的目录中去。
例如:
ls
cd Music
应注意的一点是,在不同的操作系统中,如果不给出变量会让cd产生不同的结果。例如,如果在DOS下不给出变量而执行,会显示出当前的工作目录来;而在Unix下不给出变量而执行,则会返回到起始目录去。在脚本或批处理内执行的cd,也会产生不同的结果。在DOS中,批处理文件中使用的该命令可以直接改变调用者的当前目录;而在Unix下,使用cd命令的脚本则无法改变调用者的当前目录。这是因为在Unix下的脚本通常在子外壳中执行。
cd通常是由命令行解释器内建提供的。绝大多数的Unix shell(Bourne shell、tcsh、bash等)、Windows的cmd.exe和Windows PowerShell、以及DOS的COMMAND.COM均是这种情况。
Windows的命令行外壳通常使用Windows API来改变当前的工作目录;而Unix系统的cd则是调用POSIX C的函数chdir():即是,当该命令执行时,不会为前往另一个目录而创建一个新的进程,而是由外壳代为执行这条命令,ls等其他命令也是这种情况。这是因为,创建新的进程时,子进程会继承父进程创建时的目录。而如果cd命令继承了父进程的目录,则它永远也不能达到它的目标。
目录(dir)
Directory
dir
是一个条列档案及目录的命令行界面指令,在CP/M、VMS、DOS、OS/2、Singularity及Microsoft Windows等操作系统中都有此指令。
dir
指令基本上会列出目录中的档案及子目录的名称,也可以列出其档案大小,建立时间等相关资讯,并且列出所在的磁盘机、可用空间等资讯。dir指令也可以寻找其档案名称符合特定条件的档案。
例如:
dir
更多指令:
DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]
[drive:][path][filename]
Specifies drive, directory, and/or files to list.
/A Displays files with specified attributes.
attributes D Directories R Read-only files
H Hidden files A Files ready for archiving
S System files I Not content indexed files
L Reparse Points - Prefix meaning not
/B Uses bare format (no heading information or summary).
/C Display the thousand separator in file sizes. This is the
default. Use /-C to disable display of separator.
/D Same as wide but files are list sorted by column.
/L Uses lowercase.
/N New long list format where filenames are on the far right.
/O List by files in sorted order.
sortorder N By name (alphabetic) S By size (smallest first)
E By extension (alphabetic) D By date/time (oldest first)
G Group directories first - Prefix to reverse order
/P Pauses after each screenful of information.
/Q Display the owner of the file.
/R Display alternate data streams of the file.
/S Displays files in specified directory and all subdirectories.
/T Controls which time field displayed or used for sorting timefield.
C Creation
A Last Access
W Last Written
/W Uses wide list format.
/X This displays the short names generated for non-8dot3 file names. The format is that of /N with the
name inserted before the long name. If no short name is present, blanks are displayed in its place.
/4 Displays four-digit years.
使用说明:
- 开关符
- [/P]表示分屏显示。当文件较多,每显示完一整屏后屏幕暂停,并提示“请按任意键继续”,用户按键后显示下一屏,重复该过程直至显示完毕。
- [/W]表示以简洁形式(紧缩格式)显示文件清单,目录中只显示文件名和扩展名。
- [/S]对于给定的文件标志符,显示其在指定目录及指定目录所有下级子目录中的相应位置清单。
- 文件标志符filespec中的文件名和扩展名可以使用通配符?和*
- 当文件名是.时,可以省略不写。例如:.ext,filename.可简写为filename.。
- 该命令可以将显示结果送向打印机。
创建目录(mkdir)
Make Directory
mkdir
命令在Unix、DOS、OS/2和Microsoft Windows操作系统以及PHP脚本语言中用于创建一个目录。DOS、OS/2和Windows中,这条指令常被简写用作md
。
用法:
mkdir $NewDirName
例如:
mkdir TempDir
在类Unix操作系统中,mkdir提供参数。最常用的三个参数为:
-p
: 以路径名格式指定目录名,如果路径名中的目录不存在,便会新建一个。-v
:显示mkdir创建的每个目录。通常与-p配合使用。-m
:指定目录的文件权限。
移除目录(rmdir)
Remove Directory
rmdir
是UNIX、类Unix系统(例如FreeBSD、Linux)、DOS、OS/2或Windows操作系统中一个移除空文件夹的命令。
用法:
rmdir $ExitedDirName
例如:
rmdir TempDir
在UNIX系统中,rmdir只能移除空文件夹。若要递归的文件夹及其中的所有内容,请使用rm命令。
设置环境变量(set)
所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改。也就是说当关闭此cmd命令行窗口后,将不再起作用。
如果要永久性的修改环境变量,要么通过注册表修改,要么通过系统高级设置手动来添加。
通过单纯的set命令可以查看当前所有的环境变量的值
set
如果要查看其中某一个的值可以直接使用:
set $targetEnvParam
例如:
set APPDATA
设置或者修改变量值:
set $targetEnvParam=$targetEnvValue
例如:
set TempEnvParam=TeamSpace
然后我们通过%$targetEnvParam%
打印输出下它的值
echo %TempEnvParam%
如果写到batch script里面也可以获取到,比如
echo %TempEnvParam%
然后我们执行:
set TempEnvParam=PrintSpace
1.bat
还可以追加内容
set TempEnvParam=%TempEnvParam%+1111
其实关于这个环境变量,还有一些约定好的值
%AllUsersProfile%
: 局部 返回所有“用户配置文件”的位置。 {所有用户文件目录 – C:\Documents and Settings\All Users}%AppData%
: 局部 返回默认情况下应用程序存储数据的位置。 {当前用户数据文件夹 – C:\Documents and Settings\wy\Application Data}%Cd%
: 局部 返回当前目录字符串。%CmdCmdLine%
: 局部 返回用来启动当前的 Cmd.exe 的准确命令行。%CmdExtVersion%
: 系统 返回当前的“命令处理程序扩展”的版本号。%CommonProgramFiles%
: {文件通用目录 – C:\Program Files\Common Files}%ComputerName%
: 系统 返回计算机的名称。 {计算机名 – IBM-B63851E95C9}%ComSpec%
: 系统 返回命令行解释器可执行程序的准确路径。 C:\WINDOWS\system32\cmd.exe%Date%
: 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。%ErrorLevel%
: 系统 返回最近使用过的命令的错误代码。通常用非零值表示错误。%HomeDrive%
: 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。 {当前用户根目录 – C:}%HomePath%
: 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。 {当前用户路径 – \Documents and Settings\wy}%HomeShare%
: 系统 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。%LogonSever%
: 局部 返回验证当前登录会话的域控制器的名称。%Number_Of_Processors%
: 系统 指定安装在计算机上的处理器的数目。 {处理器个数 – 1}%Os%
: 系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。 {操作系统名 – Windows_NT}%Path%
: 系统 指定可执行文件的搜索路径。%PathExt%
: 系统 返回操作系统认为可执行的文件扩展名的列表。%Processor_Architecture%
: 系统 返回处理器的芯片体系结构。值: x86,IA64。 {处理器芯片架构 – x86}%Processor_Identfier%
: 系统 返回处理器说明。%Processor_Level%
: 系统 返回计算机上安装的处理器的型号。 {处理器型号 – 6}%Processor_Revision%
: 系统 返回处理器修订号的系统变量。 {处理器修订号 – 0905}%ProgramFiles%
: {程序默认安装目录 – C:\Program Files}%Prompt%
: 局部 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 $P$G%Random%
: 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。%SystemDrive%
: 系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器。 {系统根目录 – C:}%SystemRoot%
: 系统 返回 Windows XP 根目录的位置。 {系统目录 – C:\WINDOWS}%Temp%
: 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。 {当前用户临时文件夹 – C:\DOCUME1\wy\LOCALS1\Temp}%Time%
: 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。9:16:25.05%UserDomain%
: 局部 返回包含用户帐户的域的名称。 {包含用户帐号的域 – IBM-B63851E95C9}%UserName%
: 局部 返回当前登录的用户的名称。 {当前用户名 – wy}%UserProfile%
: 局部 返回当前用户的配置文件的位置。 {当前用户目录 – C:\Documents and Settings\wy}%WinDir%
: 系统 返回操作系统目录的位置。 {系统目录 – C:\WINDOWS}
打印信息(echo)
echo
是BAT脚本中常用的命令,可以用来打印信息,也可以用来修改文件中的内容。
- 运行时不显示命令本身
@echo xxx
例如:
@echo off
- 查看命令帮助
echo /?
- 关闭DOS命令提示符,在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。
echo OFF
- 显示当前ECHO设置状态
echo
- 输出提示信息
echo $targetTipMessage
例如:
echo HelloWorld
- 输出空行,等效于回车
echo.
紧跟一个.
可以输出一个空行
例如:
echo.|time
将ECHO.
加在自动批处理文件中,使原本在屏幕下方显示的提示画面,出现在屏幕上方。
- 作为后面指定的输入,相当于在调用的命令出现人机对话时输入“Y”回车
echo Y|CHKDSK/F
- 建立新文件或增加文件内容
echo 文本内容 > 文件名
例如:
echo @echo off > 2.bat
还可以追加
echo 追加文本内容 >> 文件名
例如:
echo echo 123 >> 2.bat
执行其他文件(call)
call命令用于调用另一条批处理文件。
call 1.bat
注释标记(rem)
rem表示此命令后的字符为解释行,不执行,也就是起到注释作用。
@REM 执行开始
echo ...
@REM 执行结束
参数符号(%)
%
表示参数,参数是指在运行批处理文件时在文件名后加的字符串。
- 使用两个
%
包裹一个名称就代表一个变量参数
%EnvParam%
%0
代表文件名本身
比如我们在2.bat中写上
%0
这时候执行2.bat会进入死循环,因为它在2.bat里面继续执行2.bat
- 字符串输入按
%1
到%9
的顺序表示
比如我要给2.bat执行时传参,那么我要获取到第一个参数和第二个参数
2.bat Param1 Param2
echo %1
echo %2
执行之后就会:
我们来看一个有意思的案例,我们一共传两个参数进入,第一个是/v
,第二个是1.0.0.1
同时我们还准备一个TempVersion
的环境变量,它的值:set TempVersion=2.0.0.0
if "%1" == "/v" (
set AppVersion=%2
) else (
set AppVersion=%TempVersion%
)
echo %AppVersion%
执行:
2.bat /v 1.0.0.1
2.bat
我们看到,当传了两个参数,满足了if条件,它最终打印出来的AppVersion的值是我输入的1.0.0.1,当我没有传入参数的时候,它就走的是else的逻辑,走的环境变量值是2.0.0.0
- 显示当前目录完整路径: %CD%
echo %CD%
条件判断(if)
- 判断参数是否等于字符串
if 参数 == 字符串(
)
if 参数 == 字符串(
) else(
)
例如:
if "%1" == "/v" (
echo %1
) else (
echo default
)
- 文件是否存在
if exist $targetFileName
例如:
if exist 1.bat(
)