1 (изменено: Rumata, 2018-11-20 11:50:54)

Тема: CMD/BAT/WMIC: проверка доступности определенного диска

Проверку доступности диска/ФС/определенного диска делаю так:


for /f "skip=1 tokens=1,2" %%d in ( 'wmic LogicalDisk GET Caption^,Size' ) do for %%s in ( %%~e ) do if exist "%%~d\somefile" (
	rem диск существует (размер ненулевой)
	rem на диске есть некоторый флаговый файл (в примере somefile)
	rem можно что-то сделать с этим диском
)

Пояснение:
-- wmic LogicalDisk GET Caption,Size
получаю список всех дисков (встроенные, подключаемые, usb и прочие) и их общие размеры

-- for %%s in ( %%~e ) do
проверяю размер диска: если диск действительно вставлен (а не просто пустой usb-слот), то размер - непустое значение, и данный цикл выполняется

Некоторые устройства (например, usb-модемы, эл.книжки) имеют пустой слот для дополнительной флешки. По умолчанию ОС этот диск отображает в списке устройств, но доступа к нему, естественно, нет. При обращении к такому "устройству" происходит ошибка и выскакивает диалоговое окно (даже при работе из батника).

Данное решение обходит этот недостаток. Но выглядит немного "топорно". А есть ли еще другие варианты?

( 2 * b ) || ! ( 2 * b )

2

Re: CMD/BAT/WMIC: проверка доступности определенного диска

Что для таких псевдодисков говорит:

wmic.exe LogicalDisk get Caption, Description, DriveType, MediaType

?

Если такой диск «спросить» напрямую:

if exist "Диск:\."

— будет:

Rumata пишет:

При обращении к такому "устройству" происходит ошибка и выскакивает диалоговое окно (даже при работе из батника).

(мне не на чем проверить)?

3

Re: CMD/BAT/WMIC: проверка доступности определенного диска

Спасибо, alexii, за подсказки. Проверю -- отпишусь.

( 2 * b ) || ! ( 2 * b )

4 (изменено: Rumata, 2018-11-24 15:34:10)

Re: CMD/BAT/WMIC: проверка доступности определенного диска

alexii пишет:

Что для таких псевдодисков говорит

Это малоинформативно. Вот пример:


wmic.exe LogicalDisk get Caption, Description, DriveType, MediaType, Size, VolumeName
Caption  Description       DriveType  MediaType  Size          VolumeName
...
D:       Removable Disk    2                     31092375552   BACKUP
E:       Removable Disk    2                     3754930176    Digma r63S
G:       Removable Disk    2
...

Здесь я добавил в вывод еще одно поле VolumeName. Убрал из вывода фиксированные диски и subst-диски (во всех случаях они возвращают Description=Local Fixed Disk, DriveType=3, MediaType=12).
D - это флешка, вставлена постоянно
E - внутренее хранилище эл. книжки
G - пустой слот в ней же, флешки там нет.

Видно, что DriveType отображается, MediaType - пусто во всех случаях. VolumeName - видимо не является надежным индикатором. Видимо, только Size (и другие поля из этого семейства данных) самые надежные индикаторы доступности диска.

Следующий тест:


for /f "skip=1" %d in ( 'wmic LogicalDisk GET Caption' ) do @if exist %~d\. echo:%d - OK
C: - OK
D: - OK
E: - OK
U: - OK
Z: - OK

В примере выше проверка вызывает обращение к несуществующему диску и выводит диалоговое окно, при этом работа скрипта приостанавливается (в прикрепленной картинке пример работы данной команды):


---------------------------
cmd.exe - No Disk
---------------------------
There is no disk in the drive. Please insert a disk into drive \Device\Harddisk4\DR4. 
---------------------------
Cancel   Try Again   Continue   
---------------------------

Видимо проверка на непустое значение размера диска - наиболее надежно (код из первого сообщения):


for /f "skip=1 tokens=1,2" %%d in ( 'wmic LogicalDisk GET Caption^,Size' ) do for %%s in ( %%~e ) do if exist "%%~d\somefile" (
	rem диск существует (размер ненулевой)
	rem на диске есть некоторый флаговый файл (в примере somefile)
	rem можно что-то сделать с этим диском
)

Правда, приходится второй цикл организовывать, потому что вывод WMIC содержит лишние символы (нестандартный конец строки: CR CR LF) и в параметр %e попадает первый символ CR. Здесь возможны два варианта: либо второй цикл, либо еще одна промежуточная переменная. Я выбрал цикл (здесь возможны варианты исполнения).

Post's attachments

1.jpg 79.3 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.
( 2 * b ) || ! ( 2 * b )

5

Re: CMD/BAT/WMIC: проверка доступности определенного диска

Rumata, похоже, что так.

Rumata пишет:

Правда, приходится второй цикл организовывать, потому что вывод WMIC содержит лишние символы (нестандартный конец строки: CR CR LF)

Это нормально. Я так же делаю.