如何根据提示验证 DOS 批处理用户输入
How to Validate DOS Batch User Input From Prompt
我正在尝试编写一个脚本,提示用户输入驱动器盘符,然后验证输入是否为单个字符且是否在有效范围内: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.
”任何想法或建议都将不胜感激。
你为什么不试试这个:
@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
编辑:我这样做是为了将字符也转换为大写。
这是一个骇人听闻的替代方案。您可以使用 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
我正在尝试编写一个脚本,提示用户输入驱动器盘符,然后验证输入是否为单个字符且是否在有效范围内: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.
”任何想法或建议都将不胜感激。
你为什么不试试这个:
@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
编辑:我这样做是为了将字符也转换为大写。
这是一个骇人听闻的替代方案。您可以使用 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
:
wmic logicaldisk get deviceid /value | find "="
如果要创建网络驱动器映射并希望允许 Windows 确定自动分配哪个驱动器号,请使用 pushd
。
net use \server /user:domain\username password
pushd \server\share
...然后删除映射:
popd
net use \server /delete