我正在使用 Windows 7 批处理命令文件 (drv.bat),该文件尝试映射已被占用的驱动器。Net use
会将其列为驱动器映射,因此errorlevel
在本例中提升为 2。因此,下面显示了当前可用的网络驱动器列表。
@echo off
setlocal
net use A: \\computername\sharename /persistent:No
ECHO.%ERRORLEVEL%
IF %ERRORLEVEL% NEQ 0 for %%p 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 not exist %%p:\nul echo Drive: %%p
...
endlocal
这给了我如下列表:
Drive: F
Drive: G
Drive: J
Drive: M
Drive: R
Drive: S
Drive: T
Drive: X
Drive: Y
Drive: Z
我的目标是获取第一个可用的驱动器号。驱动器号的可用性可能因连接到此工作组的 PC 数量而异。因此,该批次应始终分配该列表中的第一个出现项。正是在这一点上,我迷失了方向。不用担心其余的,直到没有更多驱动器可用。
希望有人能帮助我更进一步。
非常感谢您的反馈。
经过几个小时,我终于让这段非常坎坷的代码运行起来了。我更喜欢并接受@JosefZ 的回答,因为我发现他的版本是一个非常优雅的解决方案,完全满足我的所有需求 - 谢谢。
@echo off
net use B: \\OQO-PC\OQO-SYSTEM /persistent:No
IF %ERRORLEVEL% EQU 0 goto end
::rem info: Drive G: for CD-ROM removed in list
setlocal enabledelayedexpansion
SET DRVLSTV=
echo [\\OQO-PC\OQO-SYSTEM]
ECHO -------------------------------------------
FOR %%f IN (A B C D E F H I J K L M N O P Q R S T U V W X Y Z) DO IF not exist %%f:\nul @set DRVLSTV=!DRVLSTV! %%f:
FOR /F "tokens=1 delims= " %%d IN ("%DRVLSTV%") DO IF %%d NEQ " " (net use %%d \\OQO-PC\OQO-SYSTEM /persistent:No)
echo Drive got remapped to the first available drive
endlocal
:end
::net use
::pause
答案1
这是另一种方法:
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
rem get list of disk letters in use
set "_inUseDisks="
for /f "tokens=2 delims==" %%D in ('
wmic logicaldisk get caption /value
') do (
for /F "delims=:" %%d in ("%%D") do (
set "_inUseDisks=!_inUseDisks! %%d"
)
)
echo Disk letters in use %_inUseDisks%
rem get first available disk letter
set "_available="
for %%p in (C D E F G H I J K L M N O P Q R S T U V W X Y Z A B) do (
set "_test=!_inUseDisks:%%p=!"
if "!_test!"=="%_inUseDisks%" (
if not defined _available set "_available=%%p"
rem goto :gotletter
)
)
:gotletter
if "%_available%"=="" (
echo No available disk letter
) else (
rem echo First available disk letter: %_available%:
echo net use %_available%: \\computername\sharename /persistent:No
)
在上面的脚本中,有for
循环
%%D
检索caption
值;%%d
删除结尾回车在返回的值中:wmic
行为:每个输出行以0x0D0D0A
(<CR><CR><LF>
)结尾,而不是常见的0x0D0A
(<CR><LF>
)。
查看 Dave Benham 的WMIC
和FOR /F
:修复尾随<CR>
问题
%%p
循环中字母的顺序发生了改变;- 操作
net use
仅显示用于调试目的;echo
调试完成后立即删除。
下一个资源(必读,未完成):
- (命令参考)Windows CMD 命令行的 AZ 索引
- (其他细节)Windows CMD Shell 命令行语法
- (
%~D
等%~d
专题页面)命令行参数(参数) - (
set "_REPLWITH=%_ALLOWED:~-1%"
ETC。)提取变量的一部分(子字符串) - (
%variable:StrToFind=NewStr%
ETC。)变量编辑/替换
答案2
@echo off
setlocal EnableDelayedExpansion
pushd \\computername\sharename
for /f "delims=" %%u in ('cd') do set av_unit=%%u && echo !av_unit:\ =!
popd
EnableDelayedExpansion
允许语句内的变量操作for
,它仅从驱动器根目录中删除反斜杠和空格。