Pull to refresh

HOWTO: Как определить букву CD/DVD в WinPE

Reading time2 min
Views1.5K
Используя WAIK столкнулся со следующей задачей — определить букву CD/DVD с которого, собственно, Win PE и загрузился. Немногочисленные рекомендации в блогах и форумах сводились к созданию коротенькой программки на Си и последующим анализом кода её завершения — вполне разумный проверенный способ.

Одно «но»: в задачах администрирования предпочитаю использовать скриптовые решения — так я не привязан к компилятору, могу адаптировать скрипт под другие задачи буквально на коленках, не имея под рукой дополнительного инструментария. Поэтому потратив немного времени на эксперименты, в итоге получил необходимый результат встроенными средствами:
  1. получаем данные о томах в системе из утилиты diskpart
  2. отфильтровываем лишнее оформление
  3. находим в списке необходимый том по признаку метки или файловой системы
Несмотря на кажущуюся сложность, код получился коротким и универсальным: легко адаптируется, скажем, для определения буквы диска у флешки.

Diskpart по своей сути является командным интерпретатором, чтобы передать ему последовательность команд из файла необходимо воспользоваться ключом /s. И в реальном проекте у меня были созданы отдельные файлы команд для разбивки диска; получения буквы локального HDD и, собственно, получения буквы для загрузочного DVD. Но отдельную команду вполне можно выполнить без дополнительных файлов:

echo list volume | diskpart

Результат вывода будет примерно следующим:

Microsoft DiskPart, версия 6.0.6001
(С) Корпорация Майкрософт, 1999-2007.
На компьютере: test

DISKPART>
    Том    ###  Имя  Метка        ФС     Тип         Размер   Состояние  Сведения
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
     Том 0     E                       DVD-ROM         0 б  Нет носит          
     Том 1     F   LRMCFRE_RU_  UDF    DVD-ROM     2389 Mб  Исправен           
     Том 2     C                NTFS   Раздел       373 Gб  Исправен   
     Том 3     D   Data         NTFS   Раздел       373 Gб  Исправен
DISKPART>


На первый взгляд, поля «Тип» нам вполне достаточно, на самом же деле приводов может быть несколько – лучше ориентировать на файловую систему, либо метку диска. Метка более однозначна, но скрипт получается менее универсальным. Т.к. в метке я обычно использую номер сборки либо дату, проще оказалось ориентироваться на файловую систему. Минус – забытый во втором приводе диск может привести к непредсказуемым результатам.

Обратите внимание: формат вывода зависти от способа передачи команды в интерпретатор – при использовании внешнего файла команд, строки
DISKPART>
в выдаче отсутствуют.

Чтобы отфильтровать список томов от ненужного оформления и лишних данных, применим расширенный синтаксис команды for. Здесь мы тоже имеем возможность выбора: передавать результат через файл, либо усложнив синтаксис команды. Использование дополнительных файлов даст относительно простой для чтения код:

diskpart /s getvolumes.dp > volumes.txt
for /F «skip=7 tokens=3,5» %%i in (volumes.txt) do if %%j==UDF SET CDDRIVE=%%i


Надо только позаботиться, чтобы текущий каталог позволял запись, возможно, указать полные пути для файлов. Зато усложнение синтаксиса позволит избежать мороки с путями и доступом на запись:

for /F «skip=8 tokens=3,5» %%i in ('echo list volume ^| diskpart') do if %%j==UDF SET CDDRIVE=%%i

Собственно и всё – единственная строка кода вернёт нам букву нашего загрузочного диска. Только не стоит пренебрегать обработкой ошибок, перед использованием переменной её стоит проверить:

if -%CDDRIVE% == - goto error
Tags:
Hubs:
+2
Comments0

Articles