Проблема с пользовательским вводом в скрипт .bat - PullRequest
1 голос
/ 18 декабря 2010

Я написал следующий скрипт .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 ]

4 голосов
/ 18 декабря 2010

Ваша проблема заключается в следующем:

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! вычисляется при выполнении этой строки .

0 голосов
/ 18 декабря 2010

Вы используете / 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
)
0 голосов
/ 18 декабря 2010

Вы использовали теги ms-dos / dos-batch, но я не думаю, что set / p уже доступен в MS-DOS. Я думал, что это будет добавлено в командную строку Windows (CMD). В противном случае это сделало бы мое текстовое приключение намного проще, если бы я знал его тогда. :)

...