我有一个关于检查输入的磁盘字母是否存在的问题。 我想显示可用磁盘列表,然后要求用户输入磁盘字母,检查该磁盘名称是否存在并执行一些命令,例如 echo 等... 我有这段代码,但它不能正常工作..
:Start
echo List of avaible disks:
wmic logicaldisk get deviceid
set /p image=Enter disk:
for %%D in (A B C 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 exist "%%D:\" ( if %image% EQU %%D (
echo This disk exists: %%D:\...
goto Next)
) else (echo Entered disk does not exist, please enter again
goto Zacatek)
)
:Next
这里有一个类似的想法,也使用
choice.exe
,但使用 mountvol.exe
进行驱动器盘符枚举,(而不是速度较慢且现已弃用的 WMIC.exe
)。
@Echo Off & SetLocal EnableExtensions DisableDelayedExpansion
Set "DrvList=" & For /F "Delims=: " %%G In ('%SystemRoot%\System32\mountvol.exe
^| %SystemRoot%\System32\findstr.exe /RC:"^ *[A-Z]:\\$"'
) Do Call Set "DrvList=%%DrvList%%%%G"
If Not Defined DrvList (Exit /B 1) Else Set "Selection="
If "%DrvList:~,1%" == "%DrvList%" Set "Selection=%DrvList%:"
If Defined Selection GoTo Selected
Echo Enter your drive letter here [%DrvList%]:
For /F "Tokens=2 Delims=?" %%G In ('
%SystemRoot%\System32\choice.exe /C %DrvList%') Do Set "Selection=%%G:"
:Selected
@Rem Place your commands below here, [%Selection% will be the drive letter].
Echo Your selected drive letter is %Selection%
Pause
上面的代码应该自动选择驱动器号,应该只枚举一个。
作为旁注,根据
mountvol.exe
输出的看似随机的驱动器顺序,如果您希望保证提示顺序按字母顺序排列,则可以使用 sort.exe
进行排序。
@Echo Off & SetLocal EnableExtensions DisableDelayedExpansion
Set "DrvList=" & For /F "Delims=: " %%G In ('%SystemRoot%\System32\mountvol.exe
^| %SystemRoot%\System32\findstr.exe /RC:"^ *[A-Z]:\\$"
^| %SystemRoot%\System32\sort.exe') Do Call Set "DrvList=%%DrvList%%%%G"
If Not Defined DrvList (Exit /B 1) Else Set "Selection="
If "%DrvList:~,1%" == "%DrvList%" Set "Selection=%DrvList%:"
If Defined Selection GoTo Selected
Echo Enter your drive letter here [%DrvList%]:
For /F "Tokens=2 Delims=?" %%G In ('
%SystemRoot%\System32\choice.exe /C %DrvList%') Do Set "Selection=%%G:"
:Selected
@Rem Place your commands below here, [%Selection% will be the drive letter].
Echo Your selected drive letter is %Selection%
Pause
我建议使用此代码,让用户没有机会选择不存在的驱动器或输入对于选择驱动器根本无效的字符串。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
setlocal EnableDelayedExpansion
:ListDisks
cls
echo List of avaible disks:
echo(
set "DriveLetters="
for /F "skip=1 tokens=1* delims==: " %%I in ('%SystemRoot%\System32\wbem\wmic.exe LOGICALDISK GET DeviceID^,VolumeName 2^>nul') do if not "%%J" == "" (
echo Drive %%I: ... %%J
set "DriveLetters=!DriveLetters!%%I"
)
echo(
%SystemRoot%\System32\choice.exe /C %DriveLetters% /N /M "Please select a drive:"
if not errorlevel 1 goto ListDisks
set /A SelectedDrive=%ERRORLEVEL%-1
set "SelectedDrive=!DriveLetters:~%SelectedDrive%,1!"
endlocal & set "SelectedDrive=%SelectedDrive%"
rem Enter here the code using the variable SelectedDrive.
echo Drive selected: %SelectedDrive%:
endlocal
批处理文件输出现有逻辑驱动器及其卷名,同时根据现有驱动器的驱动器盘符创建用户可以在以下选择提示中按下的按键列表。
where
子句也可用于排除某些驱动器,例如 CD/DVD 驱动器。
命令CHOICE用于提示用户选择所提供的驱动器之一,用户只需根据驱动器号按键即可。所有其他键都会被忽略并导致错误蜂鸣声,但 Ctrl+C 除外,IF 条件存在于
choice
命令行下方。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
cls /?
echo /?
endlocal /?
for /?
goto /?
if /?
rem /?
set /?
setlocal /?
wmic /?
wmic logicaldisk /?
wmic logicaldisk get /?
阅读有关 使用命令重定向运算符的 Microsoft 文档,了解
2>nul
的说明。重定向运算符 >
必须在 FOR命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行命令 FOR(执行嵌入的 wmic
命令行)之前处理此命令行时将其解释为文字字符使用在后台启动的单独命令进程。逗号也必须用 ^
转义,否则它会被空格字符替换,从而使 wmic
命令行无效。
另请参阅:
也许这会起作用。它检查 USB、CD 或 DVD 是否存在。
for %%d in (A: B: C: 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 EXIST %%d\nul (
ECHO drive is inserted
) ELSE (
ECHO no drive inserted
)
)
所有驱动器号末尾都必须包含冒号。