用户输入.bat脚本的问题

时间:2010-12-18 19:38:27

标签: scripting batch-file cmd

我写了以下.bat脚本

@echo off
@rem set variables
set CURRENT_DIR=%cd%
set SCRIPT_DIR=%~dp0%
set Program Files=%Program Files:Program Files=Progra~1%

:input
set INPUT=
echo Following are the installation choices you have:
echo        1. Choice1
echo        2. Choice2
echo        3. Choice3

set /P INPUT=Please select any of the above choice (1to 3) : %=%
echo input is %INPUT%
if "%INPUT%"=="" goto input

if "%INPUT%"=="1" (
    echo Choice 1 selected
    goto QUITNOW
)

if "%INPUT%"=="2" (
echo Choice 2 selected
set /p INPUT_1=Please enter input 1: %=%
echo input_1 is  %INPUT_1%
goto QUITNOW
)

if "%INPUT%"=="3" (
echo Choice 3 selected
set /p input_3= Please enter input_3: %=%
echo %input_3%
)

:QUITNOW
cd %CURRENT_DIR%
@echo on

首先,当它要求我选择选项并且我输入2时,它将INPUT变量设置为2,如果阻止则将其设置为秒。如果再次阻止它要求输入(INPUT_1),我确实输入输入字但看起来这次没有设置INPUT_1变量。有人知道我在哪里做错了。使用我的输入

输出脚本
C:\Documents and Settings\Administrator\Desktop>scriptA.bat
Following are the installation choices you have:
        1. Choice1
        2. Choice2
        3. Choice3
Please select any of the above choice (1to 3) : 2
input is 2
Choice 2 selected
Please enter input 1: failingHere
input_1 is

C:\Documents and Settings\Administrator\Desktop>

因此,如果您观察到它没有打印“failingHere”输入。如果您需要任何进一步的信息,请帮助并告诉我。

3 个答案:

答案 0 :(得分:4)

你的问题在于:

if "%INPUT%"=="2" (
    echo Choice 2 selected
    set /p INPUT_1=Please enter input 1: %=%
    echo input_1 is  %INPUT_1%
    goto QUITNOW
)

在运行任何之前,对整个块进行评估(对于环境变量)。这意味着%INPUT_1%在被设置之前被评估。

你需要做的是:

setlocal enableextensions enabledelayedexpansion

位于脚本的顶部(并在退出前endlocal)并使用延迟扩展符号:

if "%INPUT%"=="2" (
    echo Choice 2 selected
    set /p INPUT_1=Please enter input 1: %=%
    echo input_1 is  !INPUT_1!
    goto QUITNOW
)

您可以使用以下脚本查看此操作:

@setlocal enableextensions enabledelayedexpansion
@echo off
set xx=1
if %xx%==1 (
    set xx=2
    echo %xx%
    echo !xx!
)
endlocal

输出:

1
2

因为在读取整个%xx% 语句时评估if,而当时评估!xx!时评估{{1}}执行。

答案 1 :(得分:0)

您使用了ms-dos / dos-batch标记,但我认为在MS-DOS中已经没有set / p。我以为它会被添加到Windows命令提示符(cmd)中。 如果没有,如果我当时知道它,它会使我基于批处理的文本冒险更容易。 :)

答案 2 :(得分:0)

你正在使用/ p而不是/ P.改变它并且会起作用。

if "%INPUT%"=="2" (
echo Choice 2 selected
set /P INPUT_1=Please enter input 1: %=%
echo input_1 is  %INPUT_1%
goto QUITNOW
)