Используя WAIK столкнулся со следующей задачей — определить букву CD/DVD с которого, собственно, Win PE и загрузился. Немногочисленные рекомендации в блогах и форумах сводились к созданию коротенькой программки на Си и последующим анализом кода её завершения — вполне разумный проверенный способ.
Одно «но»: в задачах администрирования предпочитаю использовать скриптовые решения — так я не привязан к компилятору, могу адаптировать скрипт под другие задачи буквально на коленках, не имея под рукой дополнительного инструментария. Поэтому потратив немного времени на эксперименты, в итоге получил необходимый результат встроенными средствами:
Diskpart по своей сути является командным интерпретатором, чтобы передать ему последовательность команд из файла необходимо воспользоваться ключом /s. И в реальном проекте у меня были созданы отдельные файлы команд для разбивки диска; получения буквы локального HDD и, собственно, получения буквы для загрузочного DVD. Но отдельную команду вполне можно выполнить без дополнительных файлов:
echo list volume | 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
Одно «но»: в задачах администрирования предпочитаю использовать скриптовые решения — так я не привязан к компилятору, могу адаптировать скрипт под другие задачи буквально на коленках, не имея под рукой дополнительного инструментария. Поэтому потратив немного времени на эксперименты, в итоге получил необходимый результат встроенными средствами:
- получаем данные о томах в системе из утилиты diskpart
- отфильтровываем лишнее оформление
- находим в списке необходимый том по признаку метки или файловой системы
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