Windows 批处理:获取变量列表中的第一个匹配项

Windows 批处理:获取变量列表中的第一个匹配项

我正在使用 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 的WMICFOR /F:修复尾随<CR>问题

  • %%p循环中字母的顺序发生了改变;
  • 操作net use仅显示用于调试目的;echo调试完成后立即删除。

下一个资源(必读,未完成):

答案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,它仅从驱动器根目录中删除反斜杠和空格。

相关内容