Непредвиденное поведение командного файла для запроса - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующий пакетный файл:

echo off
CD \
:Begin
set /p UserInputPath= "What Directory would you like to make?" 
 if not exist C:\%UserInputPath% (
mkdir %UserInputPath%
) else (
set /p confirm= "Do you want choose another directory?"
echo %confirm%
if "%confirm%"=="y" goto Begin
)

ВЫХОД:

C:\>echo off
What Directory would you like to make?ff
Do you want choose another directory?n
y
What Directory would you like to make?

Посмотрите на вывод, каталог ff уже существует, как вы видите, если яответьте на Вы хотите выбрать другой каталог?Переменная "% verify% показывает как y.

Есть идеи?

1 Ответ

0 голосов
/ 27 сентября 2018

Обработчик команд Windows заменяет все ссылки на переменные среды с использованием синтаксиса %variable% в пределах блока команд, начинающегося с ( и заканчивающегося соответствием ), перед выполнением команды, использующей блок команд.

Это означает, чтоздесь %confirm% заменяется дважды ничем при первом запуске пакетного файла до того, как команда IF будет выполнена вообще.Такое поведение наблюдается при запуске пакетного файла без echo off из окна командной строки, см. отладка пакетного файла .

Одно из решений - отложенное расширение как объясняется с помощью команды SET вывод при запуске в окне командной строки set /? на примере IF и FOR .

Но гораздо лучше избегать блоков команд там, где это действительно не нужно.
В этом случае использование команды CHOICE для приглашения да / нет также лучше, чем set /P.

@echo off
cd \
goto Begin

:PromptUser
%SystemRoot%\System32\choice.exe /C YN /N /M "Do you want to choose another directory (Y/N)? "
if errorlevel 2 goto :EOF

:Begin
set "UserInputPath="
set /P "UserInputPath=What Directory would you like to make? "

rem Has the user not input any string?
if not defined UserInputPath goto Begin

rem Remove all double quotes from user path.
set "UserInputPath=%UserInputPath:"=%"

rem Is there no string left anymore?
if not defined UserInputPath goto Begin

rem Does the directory already exist?
if exist "%UserInputPath%" goto PromptUser

rem Create the directory and verify if that was really successful.
rem Otherwise the entered string was invalid for a folder path or
rem the user does not have the necessary permissions to create it.
rem An error message is output by command MKDIR on an error.
mkdir "%UserInputPath%"
if errorlevel 1 goto Begin

rem Other commands executed after creation of the directory.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и очень внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • cd /?
  • choice /?
  • echo /?
  • goto /?
  • if /?
  • mkdir /?
  • rem /?
  • set /?

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...