如何从提示符验证DOS批处理用户输入

时间:2015-08-06 19:34:46

标签: batch-file windows-7 dos

我正在尝试编写一个脚本,提示用户输入驱动器号,然后验证该条目是否为单个字符且属于有效范围:D-Z

这是我到目前为止所做的:

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.”任何想法或建议都会非常感激。

2 个答案:

答案 0 :(得分:2)

这是一个讨厌的选择。您可以使用choice命令强制输入有效的响应,而不是让用户自由搞砸然后惩罚他的傲慢。然后,为了避免将if errorlevel条件的长列表转换回其alpha值,可以使用将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%

目前尚不清楚您的目标是什么,您要选择的驱动器号是现有字母还是未使用的驱动器映射字母。根据您的意图,您可能会对以下一个或两个提示感兴趣。 *耸肩*

您可以使用wmic以编程方式确定当前使用WMI查询分配的驱动器号:

wmic logicaldisk get deviceid /value | find "="

如果要创建网络驱动器映射并希望允许Windows确定要自动分配的驱动器号,请使用pushd

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

...然后删除映射:

popd
net use \\server /delete

答案 1 :(得分: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

编辑:我这样做是为了将字符转换为大写字母。