即使选择错误,批处理文件也会打开程序

问题描述 投票:0回答:1

您好,我目前正在尝试制作一个小程序来练习,目前遇到了这个小问题。 其他一切都工作正常,但如果用户做出错误的选择,程序会给出错误消息,但无论如何它仍然会打开其中一个程序 这是代码:

@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

在网上搜索但没有找到帮助

windows batch-file
1个回答
0
投票

此任务的故障安全且安全的批处理文件将是:

@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

应首先阅读此答案中的以下章节:

  • 问题 3:ECHO。可能会导致不良行为
  • 问题6:批处理文件依赖于外部定义的环境

首先使用前两个命令行完全定义所需的执行环境,就像每个编写供他人使用的批处理文件应该做的那样。

如果用户从命令提示符窗口中运行此批处理文件,而不是在 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
内部命令 CALLEXITFORGOTOIF,可将执行顺序从一个命令行改为另一个命令行。带标签的行不会停止逐行处理批处理文件。

在处理批处理文件期间由

cmd.exe
调用的每个可执行文件均以其完全限定文件名进行引用。这使得批处理文件执行速度更快,因为
cmd.exe
不需要使用 local 环境变量
PATH
PATHEXT
在文件系统中搜索可执行文件。这使得批处理文件也更加安全,因为 Windows 用户有时会损坏其 system 和/或 user 环境变量
Path
,从而导致依赖于
PATH
的批处理文件无法正确运行。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • choice /?
  • cls /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?
  • start /?
© www.soinside.com 2019 - 2024. All rights reserved.