您好,我目前正在尝试制作一个小程序来练习,目前遇到了这个小问题。 其他一切都工作正常,但如果用户做出错误的选择,程序会给出错误消息,但无论如何它仍然会打开其中一个程序 这是代码:
@echo off
echo Hola podrias decirme cual es tu nombre?
SET /p USERNAME=Entra tu nombre:
echo Hola %username% que programa te gustaria usar?:
echo.
echo 1. Disk Cleanup Manager
echo 2. Microsoft Paint
echo.
echo Autor:
echo.`your text`
set /p choice=Escribe el numero para abrir la aplicacion:
if %choice%== set choice=%choice:~0,1%
if %choice%==1 goto diskclean
if %choice%==2 goto paint
echo %choice% selecion no validad trata de nuevo
pause
:diskclean
start cleanmgr
goto end
:paint
start mspaint
goto end
在网上搜索但没有找到帮助
此任务的故障安全且安全的批处理文件将是:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
cls
echo Hola podrias decirme cual es tu nombre?
set "NameUser="
:UserNamePrompt
set /P "NameUser=Entra tu nombre: " || goto UserNamePrompt
set "NameUser=%NameUser:"=%"
if not defined NameUser goto UserNamePrompt
setlocal EnableDelayedExpansion & echo Hola !NameUser! que programa te gustaria usar?& endlocal
echo(
echo 1. Disk Cleanup Manager
echo 2. Microsoft Paint
echo(
if not exist %SystemRoot%\System32\choice.exe goto UseSetPrompt
:ChoicePrompt
%SystemRoot%\System32\choice.exe /C 12 /N /M "Escribe el numero para abrir la aplicacion:"
if errorlevel 2 goto Paint
if errorlevel 1 goto DiskCleanup
goto ChoicePrompt
:UseSetPrompt
set "UserChoice="
set /P "UserChoice=Escribe el numero para abrir la aplicacion: " || goto UseSetPrompt
set "UserChoice=%UserChoice:"=%"
if not defined UserChoice goto UseSetPrompt
if "%UserChoice%" == "2" goto Paint
if "%UserChoice%" == "1" goto DiskCleanup
goto UseSetPrompt
:DiskCleanup
start "" %SystemRoot%\System32\cleanmgr.exe
goto End
:Paint
start "" %SystemRoot%\System32\mspaint.exe
:End
endlocal
应首先阅读此答案中的以下章节:
首先使用前两个命令行完全定义所需的执行环境,就像每个编写供他人使用的批处理文件应该做的那样。
如果用户从命令提示符窗口中运行此批处理文件,而不是在 Windows 文件资源管理器中双击批处理文件,接下来会清除屏幕。
请阅读 如何阻止 Windows 命令解释器在用户输入不正确时退出批处理文件执行? 它解释了如何安全可靠地编写
set /P
用户提示符以及如何使用
Windows 命令 CHOICE 用于在 Windows Server 2003 和 Windows Vista 以及所有较新的 Windows 版本(以及我的 Windows XP 计算机)上可用的选择提示。上面的代码还包含使用 set /P
完成选择提示的代码,以防此批处理文件由 Windows XP 上的用户运行,默认情况下没有可执行文件 choice.exe
。
批处理文件的用户可以输入名称
Asterix & Obelix
,该名称应完全按照用户输入的方式输出,并且不应导致将 &
解释为 无条件命令运算符,这就是使用 延迟变量扩展 的原因只是输出带有用户输入名称的文本。 usar?
和无条件命令运算符 &
之间没有空格,否则该空格也会被 ECHO 输出为尾随空格。
USERNAME
是预定义的 Windows 环境变量,不应在批处理文件中重新定义。
choice
是 Windows 命令的名称。因此,不应将字符串 choice
用作环境变量或标签的名称,尽管这是可能的。
请阅读Windows命令解释器(CMD.EXE)如何解析脚本?
batch一词表示一个接一个的命令行或命令块。
Windows 命令处理器
cmd.exe
因此通过 处理批处理文件
有
cmd
内部命令 CALL、EXIT、FOR、GOTO 和 IF,可将执行顺序从一个命令行改为另一个命令行。带标签的行不会停止逐行处理批处理文件。
在处理批处理文件期间由
cmd.exe
调用的每个可执行文件均以其完全限定文件名进行引用。这使得批处理文件执行速度更快,因为 cmd.exe
不需要使用 local 环境变量 PATH
和 PATHEXT
在文件系统中搜索可执行文件。这使得批处理文件也更加安全,因为 Windows 用户有时会损坏其 system 和/或 user 环境变量 Path
,从而导致依赖于 PATH
的批处理文件无法正确运行。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
choice /?
cls /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
start /?