要在 Windows 11 上编写一个自定义关机的 CMD 脚本文件,你可以创建一个扩展名为 .bat
或 .cmd
的文本文件,并在其中编写脚本。
一、常用语法
-
rem
:注释 -
pause
:暂停正在执行的批处理文件,并提示用户按键之后继续执行rem cmd脚本文件代码 pause
-
echo
:打印文本echo %os%
:显示操作系统名字;echo off
:防止将批处理文件中的具体命令输出,只输出执行结果@echo off
:在echo off
的基础上将命令本身的隐藏
-
set
:设置用户定义或命名的环境变量。暂时存储在内存中,命令执行完就销毁。set THE_KING=Elvis echo %THE_KING% pause
-
label
:使用冒号设置标签,可以作为goto
的跳转位置echo Start goto end echo I can guarantee this line will not be executed :end echo End pause pause
可以看到 echo I can guarantee this line will not be executed
直接被跳过。
-
if
:条件语句exist
:测试文件是否存在%
接收参数:通过%
来传递参数%1
表示第一个参数,%2
表示第二个参数;
if %1 == start goto start if %1 == stop goto stop goto invalid :start echo Starting appincation goto end :stop echo Stopping application goto end :invalid echo Invalid parameter :end pause
这里的
%1
是接收的执行脚本文件时,后面跟的第一个参数。可以看到上面的案例中,%1
其实就是start
。 -
shift
:将接收参数向后移动一位,如%2
的值给%1
,%3
的值给%2
,这时候可以用%0
获取第一个参数。//还是上面的代码,改成如下代码,效果是一样的: shift if %0 == start goto start if %0 == stop goto stop ...后面代码不变
-
call
:调用其他脚本文件
同目录下创建cmd2.cmd
,代码如下:
echo 这里是cmd2.cmd中的内容
再创建cmdScript.cmd
,代码如下:
chcp 65001
call cmd2.cmd
pause
双击执行cmdScript.cmd
,效果如下:
-
setLocal
:批处理脚本中使用,对环境变量的修改只在当前批处理脚本中有效,遇到endLocal
命令则在批处理文件末尾的环境变量的值会恢复成原来的值。上面我们使用setlocal enabledelayedexpansion
开启变量延迟。 -
start
:新开启Windows一个控制台,并指定名字。start "My Title" echo hello pause
双击打开脚本文件,脚本会自动打开一个名为My Title
的窗口2,并打印hello
。
-
==
:判断字符串是否相同@echo off chcp 65001 set str1=Hello set str2=World if "%str1%" == "%str2%" ( echo 字符串相同 ) else ( echo 字符串不同 ) REM 不要关闭窗口 pause
-
equ、gtr、lss
:判断数字大小
二、实战案例
1、接收输入
创建cmd
脚本文件,代码如下,并双击运行:
@echo off
setlocal enabledelayedexpansion
REM 提示用户输入内容
set /p userInput=please input:
REM 打印用户输入的内容
echo you input is: !userInput!
endlocal
REM 不要关闭窗口
pause
运行后效果如下:
:
需要注意的是,界面上的提示文字you input is:
不能使用中文,否则会导致报错:XXX: is not recognized as an internal or external command,operable program or batch file.
。如果想要使用中文,echo
后面跟的变量必须使用%变量名%
,不能使用!变量名!
。
2、自动关机
创建文件 定时关机.cmd
,输入以下内容:
@echo off
chcp 65001
setlocal enabledelayedexpansion
:start
set /p second=请输入倒计时时长(秒):
set S=!second!
if %S% lss 30 (
echo 您设定的时间太短,请重新设置(请务必超过30s)
goto start
) else (
echo.
echo 将在 【%S%秒】 后为您关机,请检查以下事项:
echo - 文件+代码是否都已保存和提交?
echo - 任务和周报是否都已填报?
echo.
goto sure
)
:sure
set /p sure=确定关机[y/n]:
echo !sure!
if "!sure!"=="y" (
goto launch
)
goto end
:launch
timeout /t %S%
shutdown /s /f /t 0
goto end
:end
endlocal
REM 不要关闭窗口
pause
这个脚本首先关闭命令行窗口的回显(@echo off
),然后显示一条消息,等待 30 秒(可以根据需要调整等待时间),最后执行关机命令。
-
chcp 65001
:设置中文字符编码(防止出现中文乱码) -
shutdown
:shutdown
命令用于执行关机操作。 -
/s
: 这个参数告诉shutdown
命令执行关机操作。 -
/f
: 这个参数强制关闭所有应用程序,不等待它们的响应。 -
/t 0
: 这个参数表示不要等待,立即执行关机操作。 -
pause
:等待用户按任意键后再关闭 -
setlocal enabledelayedexpansion
:开启变量延迟 -
endlocal
:关闭变量延迟,与setlocal enabledelayedexpansion
成对出现 -
echo.
:打印空行
执行后自动弹窗cmd窗口(空格键可以终端倒计时):
3、接收数字输入,比较大小
脚本代码如下:
@echo off
chcp 65001
setlocal enabledelayedexpansion
set /p n1=num1:
set /p n2=num2:
set num1=!n1!
set num2=!n2!
if %num1% equ %num2% (
echo num1和num2相同
) else if %num1% gtr %num2% (
echo num1大于num2
) else if %num1% lss %num2% (
echo num1小于num2
)
endlocal
REM 不要关闭窗口
pause
4、启动前端项目脚本
@echo off
chcp 65001
setlocal enabledelayedexpansion
REM 提示用户输入内容
set /p env=即将启动【产品中心】,请指定环境[test/prod]:
REM 打印用户输入的内容
echo Running...:Product-Center[!env!]
set ENV=!env!
cd /d D:\Codes\Product-Center
if (%ENV%)==() (
goto empty
) else if "%ENV%"=="test" (
goto env
) else (
goto env
)
:empty
echo 正在启动dev环境...
pnpm start
goto end
:env
echo 正在启动%ENV%环境...
pnpm start:%ENV%
goto end
:end
endlocal
REM 不要关闭窗口
pause
set /p env=即将启动【产品中心】,请指定环境[test/prod]:
:接收一个输入,定义接收变量envset ENV=!env!
:将输入赋值给ENV
变量cd /d D:\Codes\Product-Center
:切换到D盘,并进入指定项目目录if... else... if else...
:判断要启动哪个环境goto
:跳转到指定代码位。if (%ENV%)==()
:判断输入文字是否为空,必须要这种方式,==
实测无效。
执行效果如下: