2015-08-06 2 views
0

Я пытаюсь написать сценарий, который запрашивает у пользователя букву диска, а затем проверяет запись в том случае, если она является единственным символом и находится в допустимом диапазоне: DZКак проверить членский ввод DOS пользователя из запроса

Это то, что у меня до сих пор:

setlocal enableextensions enabledelayedexpansion 
set MIN_DRIVE_LOWER=d 
set MAX_DRIVE_LOWER=z 
set /P RELEASE_DRIVE="What is the assigned network drive letter on this workstation? " 
echo Release drive is %RELEASE_DRIVE% 
if /I !RELEASE_DRIVE! GEQ %MIN_DRIVE_LOWER% (
    if /I !RELEASE_DRIVE! LEQ %MAX_DRIVE_LOWER% (
    echo Release drive is lower-case. 
) 
) 

Независимо от того, что я ввожу в командной строке мой сценарий достигает «echo Release drive is lower-case.» Любые мысли или предложения будут оценены.

+0

Вы уверены, что вы хотите, что '/ I'? – Stephan

+0

@Stephan Я не знаю, как это исправить. Вот почему я публикую здесь. –

+0

, когда я интерпретирую ваш код правильно, вы хотите протестировать, если пользователь вводил букву верхнего или нижнего регистра. '/ i' говорит' if' игнорировать заглавные буквы. – Stephan

ответ

2

Вот альтернатива харки. Вместо того, чтобы дать пользователю свободу испортить, а затем наказать его за его наглость, вы можете принудительно ввести действительный ответ с помощью команды choice. Затем, чтобы избежать длинного списка if errorlevel условий для преобразования выбора обратно в его альфа-значение, существует трюк с использованием специальной переменной среды, которая преобразует ERRORLEVEL в буквенно-цифровой символ, %=ExitCodeAscii%. More details are here.

@echo off 
setlocal 

choice /c defghijklmnopqrstuvwxyz /n /m "What is the assigned network drive letter on this workstation? " 
set /a ascii = %ERRORLEVEL% + 67 
cmd /c exit /b %ascii% 
set "letter=%=ExitCodeAscii%" 

echo You chose %letter% 

Это не ясно, что ваша цель состоит в том, является ли буква диска вы хотите выбрали это существующее письмо или неиспользуемое письмо для отображения диска. В зависимости от ваших намерений вас может заинтересовать один или оба из следующих советов. * Пожала плечами *

Вы можете программно определить, какие буквы дисков в настоящее время назначены с запросом WMI с помощью wmic:

wmic logicaldisk get deviceid /value | find "=" 

Если вы хотите создать отображение сетевого диска и хотели бы, чтобы Windows, чтобы выяснить, какие букву диска для автоматического назначения, используйте pushd.

net use \\server /user:domain\username password 
pushd \\server\share 

... затем, чтобы удалить отображение:

popd 
net use \\server /delete 
+0

Удивительный! Спасибо за подсказку ниндзя! –

1

Почему бы вам не попробовать это:

@echo off 
setlocal enableextensions enabledelayedexpansion 
set /P rd="What is the assigned network drive letter on this workstation? " 
echo Release drive is %rd% 

:: Variable valid will be either 0 or 1 
set valid=0 
for %%a in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if /i "%rd%"=="%%a" (
    set valid=1 
    if "%rd%" neq "%%a" set rd=%%a 
) 
) 
Echo. 

if "%valid%"=="1" (
Echo Valid Input Detected: %rd% 
) else (
Echo Invalid Input: %rd% 
) 
pause 

Edit: Я сделал это так, что он преобразовал символ в верхний регистр тоже.

+1

Каким образом строка 'if '% rd%" neq "%% a" set rd = %% a' имеет какую-либо разницу, так как она находится в области выражения 'if' над двумя строками над ней? –

+1

@JimFell: для преобразования в верхний регистр. Он анализируется (например) как: 'if 'd" neq "D" set rd = D'. Немного избыточно, просто «set rd = %% A». – Stephan

 Смежные вопросы

  • Нет связанных вопросов^_^