1

Я работаю над командным файлом 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

Моя цель - получить первую доступную букву диска. Доступность буквы диска зависит от того, сколько компьютеров подключено к этой рабочей группе. Таким образом, эта партия должна всегда назначать первое вхождение в этом списке. Именно в этот момент я потерялся. Не беспокойтесь об остальном, пока не будет доступно больше дисков.

Надеюсь, кто-то может помочь мне сделать еще один шаг.

Обратная связь высоко ценится.


Через несколько часов я получил этот очень ухабистый код, несколько работающий. Я очень предпочитаю и принимаю ответ @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

2 ответа2

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>).

См. WMIC и FOR /F Дейва Бенхэма : исправление проблемы с трейлингом <CR>

  • изменен порядок букв в цикле %%p ;
  • оперативное net use просто отображается в целях отладки; удалить echo не раньше, чем отладить.

Следующие ресурсы (требуется чтение, неполное):

0
@echo off
setlocal EnableDelayedExpansion
pushd \\computername\sharename
for /f "delims=" %%u in ('cd') do set av_unit=%%u && echo !av_unit:\ =!
popd

EnableDelayedExpansion позволяет переменной манипуляции внутри for утверждения, которое только устраняет обратную косую черту и пространство от привода корневого каталога.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .