温故知新,Windows命令知多少,学习Command Shell和PowerShell

背景

在搭建DevOps流水线的时候,如果遇到Windows构建环境,我们或多或少需要用到CMD命令或Batch Script,每次到用的时候总觉得知识匮乏,记录下。

常用命令

清除屏幕(cls)

Clear Screen

将输入命令的cmd窗口显示的字符全部清除

cls

image

改变目录(cd)

Change Directory

cd,是在Unix、类Unix、Windows和DOS操作系统下用于改变工作目录的命令行命令。在Unix的Shell脚本与Windows或DOS的批处理文件中亦可使用。

通过cd命令,可以前进到子目录、后退到父目录、回到根目录(Unix下为/,DOS下为\)或者进入到任何给出的目录中去。

例如:

ls
cd Music

image

应注意的一点是,在不同的操作系统中,如果不给出变量会让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

image

更多指令:

 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

image

在类Unix操作系统中,mkdir提供参数。最常用的三个参数为:

  • -p: 以路径名格式指定目录名,如果路径名中的目录不存在,便会新建一个。
  • -v:显示mkdir创建的每个目录。通常与-p配合使用。
  • -m:指定目录的文件权限。

移除目录(rmdir)

Remove Directory

rmdir是UNIX、类Unix系统(例如FreeBSD、Linux)、DOS、OS/2或Windows操作系统中一个移除空文件夹的命令。

用法:

rmdir $ExitedDirName

例如:

rmdir TempDir

image

在UNIX系统中,rmdir只能移除空文件夹。若要递归的文件夹及其中的所有内容,请使用rm命令。

设置环境变量(set)

所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改。也就是说当关闭此cmd命令行窗口后,将不再起作用。

如果要永久性的修改环境变量,要么通过注册表修改,要么通过系统高级设置手动来添加。

通过单纯的set命令可以查看当前所有的环境变量的值

set

image

如果要查看其中某一个的值可以直接使用:

set $targetEnvParam

例如:

set APPDATA

image

设置或者修改变量值:

set $targetEnvParam=$targetEnvValue

例如:

set TempEnvParam=TeamSpace

然后我们通过%$targetEnvParam%打印输出下它的值

echo %TempEnvParam%

image

如果写到batch script里面也可以获取到,比如

echo %TempEnvParam%

然后我们执行:

set TempEnvParam=PrintSpace
1.bat

image

还可以追加内容

set TempEnvParam=%TempEnvParam%+1111

image

其实关于这个环境变量,还有一些约定好的值

  • %AllUsersProfile%: 局部 返回所有“用户配置文件”的位置。
  • %AppData%: 局部 返回默认情况下应用程序存储数据的位置。
  • %Cd%: 局部 返回当前目录字符串。
  • %CmdCmdLine%: 局部 返回用来启动当前的 Cmd.exe 的准确命令行。
  • %CmdExtVersion%: 系统 返回当前的“命令处理程序扩展”的版本号。
  • %CommonProgramFiles%:
  • %ComputerName%: 系统 返回计算机的名称。
  • %ComSpec%: 系统 返回命令行解释器可执行程序的准确路径。 C:\WINDOWS\system32\cmd.exe
  • %Date%: 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
  • %ErrorLevel%: 系统 返回最近使用过的命令的错误代码。通常用非零值表示错误。
  • %HomeDrive%: 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  • %HomePath%: 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  • %HomeShare%: 系统 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  • %LogonSever%: 局部 返回验证当前登录会话的域控制器的名称。
  • %Number_Of_Processors%: 系统 指定安装在计算机上的处理器的数目。
  • %Os%: 系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。
  • %Path%: 系统 指定可执行文件的搜索路径。
  • %PathExt%: 系统 返回操作系统认为可执行的文件扩展名的列表。
  • %Processor_Architecture%: 系统 返回处理器的芯片体系结构。值: x86,IA64。
  • %Processor_Identfier%: 系统 返回处理器说明。
  • %Processor_Level%: 系统 返回计算机上安装的处理器的型号。
  • %Processor_Revision%: 系统 返回处理器修订号的系统变量。
  • %ProgramFiles%:
  • %Prompt%: 局部 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 $P$G
  • %Random%: 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
  • %SystemDrive%: 系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器。
  • %SystemRoot%: 系统 返回 Windows XP 根目录的位置。
  • %Temp%: 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。 {当前用户临时文件夹 – C:\DOCUME1\wy\LOCALS1\Temp}
  • %Time%: 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。9:16:25.05
  • %UserDomain%: 局部 返回包含用户帐户的域的名称。
  • %UserName%: 局部 返回当前登录的用户的名称。
  • %UserProfile%: 局部 返回当前用户的配置文件的位置。
  • %WinDir%: 系统 返回操作系统目录的位置。

image

打印信息(echo)

echo是BAT脚本中常用的命令,可以用来打印信息,也可以用来修改文件中的内容。

  • 运行时不显示命令本身
@echo xxx

例如:

@echo off
  • 查看命令帮助
echo /?

image

  • 关闭DOS命令提示符,在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。
echo OFF

image

  • 显示当前ECHO设置状态
echo

image

  • 输出提示信息
echo $targetTipMessage

例如:

echo HelloWorld

image

  • 输出空行,等效于回车
echo.

紧跟一个.可以输出一个空行

image

例如:

echo.|time

image

ECHO.加在自动批处理文件中,使原本在屏幕下方显示的提示画面,出现在屏幕上方。

  • 作为后面指定的输入,相当于在调用的命令出现人机对话时输入“Y”回车
echo Y|CHKDSK/F
  • 建立新文件或增加文件内容
echo 文本内容 > 文件名

例如:

echo @echo off > 2.bat

image

还可以追加

echo 追加文本内容 >> 文件名

例如:

echo echo 123 >> 2.bat

image

执行其他文件(call)

call命令用于调用另一条批处理文件。

call 1.bat

image

image

注释标记(rem)

rem表示此命令后的字符为解释行,不执行,也就是起到注释作用。

@REM 执行开始
echo ...
@REM 执行结束

image

image

参数符号(%)

%表示参数,参数是指在运行批处理文件时在文件名后加的字符串。

  • 使用两个%包裹一个名称就代表一个变量参数
%EnvParam%

image

  • %0代表文件名本身

比如我们在2.bat中写上

%0

这时候执行2.bat会进入死循环,因为它在2.bat里面继续执行2.bat

  • 字符串输入按%1%9的顺序表示

比如我要给2.bat执行时传参,那么我要获取到第一个参数和第二个参数

2.bat Param1 Param2
echo %1
echo %2

执行之后就会:

image

我们来看一个有意思的案例,我们一共传两个参数进入,第一个是/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

image

我们看到,当传了两个参数,满足了if条件,它最终打印出来的AppVersion的值是我输入的1.0.0.1,当我没有传入参数的时候,它就走的是else的逻辑,走的环境变量值是2.0.0.0

  • 显示当前目录完整路径: %CD%
echo %CD%

image

条件判断(if)

  • 判断参数是否等于字符串
if 参数 == 字符串(

)
if 参数 == 字符串(

) else(

)

例如:

if "%1" == "/v" (
  echo %1
) else (
  echo default
)

image

  • 文件是否存在
if exist $targetFileName

例如:

if exist 1.bat(

)

参考

posted @ 2022-05-23 15:39  TaylorShi  阅读(198)  评论(0编辑  收藏  举报