前言
接过上一章节,sc.exe
进行Windows
中,进行系统程序服务化的操作方式不难发现,直接进行基础工具服务化操作,一个是人狠话不多,出错不好说
,一个就是不太优雅,每回都需要自己手动去输入配置信息,例如:sc [Service name]
程序路径,服务方式等内容,啥也别说,改成脚本引导,交互式输入,以下是脚本的几个需求:
- 启动脚本出现输入引导信息
- 输入相关服务配置
- 完成对目标程序服务操作(注册、启动、停止和删除)
准备作业
脚本是啥?在系统中又叫批处理脚本,用于实现系统使用过程中,通过系统Dos
指令实现部分功能需求的可执行文件,相关交互指令被称之为批处理脚本,此处简称脚本,在Windows
系统中,脚本文件常见以.bat
和.cmd
作为文件后缀
要写当然啥不会肯定不行,先简单学一学指令,笔者整理了相关的基本语法,如下:
变量
变量的主要目的是为了接受在批处理文件外部接受输入值和处理文件内部对变量的设置和使用
系统变量
%CD% 获取当前路径 %PATH% 获取命令搜索路径/全局环境变量中的PATH %DATE% 获取当前日期 %TIME% 获取当前时间 %ERRORLEVEL% 获取上一个命令的执行结果码
输出内容echo
>echo %DATE% 2021/07/16 周五
设置变量(局部)set
set 变量名称=变量值
>set test=12 >echo %test% 12
基本指令
以下介绍仅仅包含当前需要实现的批处理文件需要用到的指令,并不是完整指令细化,具体参考可以阅读对应的微软文档参考链接
注释
::注释内容
输入
参考链接:https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/set_1
set
显示、设置或删除 cmd.exe
环境变量。 如果不使用参数,则 set 将 显示当前环境变量设置
set [<variable>=[<string>]] set [/p] <variable>=[<promptString>] set /a <variable>=<expression>
<variable>
指定要修改或设置的环境变量名称
<string>
实际需要给变量设置的变量值
>set test=aaa >echo %test% aaa
/p
将用户输入行作为对应需要设置的变量的值
创建一个setcase.bat
,CHCP 65001
目的是为了设置当前cmd
窗口的当前代码页
设置为utf-8
,同时把bat
脚本编码设置为utf-8
内容如下:
@echo off CHCP 65001 set /p uname=请输入用户名称: echo 用户名:%uname%
执行sctest.bat
>sctest.bat Active code page: 65001 请输入用户名称:张珊 用户名:张珊
需要注意的是,如果执行后输出内容为中文乱码,那么极为可能是,当前bat
的文件编码和cmd
窗口编码不一致造成,可通过CHCP 编码
进行编码统一,上述案例设置的是65001
表示输出脚本当前窗口编码为utf-8
,和bat
的编码保持一致
输出
echo
参考链接:https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/echo
显示消息或打开或关闭命令回显功能。 如果不使用参数, echo 将显示当前的回显设置,默认为on
echo [<message>] echo [on | off]
显示信息(输出信息)
>echo Hello World echo Hello World
控制是否显示命令提示符,在dos
环境下直接执行该指令有效,为防止在bat
文件中显示
echo [on | off]
执行echo
用于显示当前回显状态
>echo ECHO 处于打开状态。
创建一个echo.bat
文件内容如下:
echo hellw world pause
保存后,双击执行,输出结果如下:
bat文件路径>echo hellw world hellw world bat文件路径>pause
关闭回显,防止批处理文件中的所有命令 (包括 echo off
命令) 在屏幕上显示在批处理文件类型的第一行,echo.bat
修改如下:
@echo off echo hellw world pause
保存后,直接双击bat
执行效果如下:
hellw world 请按任意键继续. . .
暂停
pause
参考链接:https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/pause
暂停批处理程序的执行,并显示提示, Press any key to continue . . .
,按任意键继续执行后续的执行
>pause 请按任意键继续. . .
退出
exit
参考链接:https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/exit
退出命令解释器或当前批处理脚本
exit [/b] [<exitcode>]
/b
为退出当前批处理脚本,而不是退出cmd.exe
,如果从批处理脚本外部执行或直接执行批处理脚本,则退出 cmd.exe
<exitcode>
指定数值, 如果指定了 /b
,则 ERRORLEVEL
环境变量设置为该数字; 如果要退出命令解释器,则进程退出代码将设置为该数字
批处理脚本exit.bat
内容如下:
@echo off echo hellw world exit /b
直接双击运行bat
,看似无反应,实际是脚本执行结束后,退出了了
通过命令提示符切换到改exit.bat
所在目录下,执行exit.bat
,结果输出如下:
>sctest.bat hellw world >
命令提示符cmd.exe
并未退出
判定
if
参考链接:https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/if
在批处理程序中执行条件处理
if [not] ERRORLEVEL <number> <command> [else <expression>] if [not] <string1>==<string2> <command> [else <expression>] if [not] exist <filename> <command> [else <expression>]
启用了命令扩展,语法如下:
if [/i] <string1> <compareop> <string2> <command> [else <expression>] if cmdextversion <number> <command> [else <expression>] if defined <variable> <command> [else <expression>]
not
当条件为false
,对应判定语句才能够执行内部的相关操作
>if not false==true echo the condition is false the condition is false
errorlevel
表示cmd.exe
上一个执行程序的返回的退出代码对应的数字
>echo %errorlevel% 0 >if not %errorlevel%==1 echo the condition is false the condition is false
exist
判定特定路径文件是否存在,存在则返回true
,命令提示符工作目录下存在文件sctest.bat
>if exist sctest.bat echo the condition is true the condition is true
else <express>
不符合if
条件判定时的其他情况,执行对应的相关操作语句,执行语句需要用()
进行囊括在一个块中,否则else
将执行无效
>if exist echo.bat (echo the condition is true) else (echo the condition is false) the condition is false