Как найти букву диска в bat-файле

Обновлено: 25.06.2024

При использовании внешнего диска в Windows не гарантируется, что ему будет присвоена та же буква диска, что и при последнем использовании. Это делает неудобным, если вы запускаете пакетный файл, который зависит от подключенного определенного диска, например, при создании резервных копий, без необходимости изменять букву диска, используемую в пакетном файле.

К счастью, есть несколько служебных команд, которые возвращают имя тома для диска, среди них Vol и более сложная командная строка инструментария управления Windows (WMIC).

Простой пакетный файл

Vol возвращает информацию о томе с заданной буквой диска. Подключив к компьютеру мой резервный внешний диск с меткой тома «Backup1», я вижу в проводнике, что буква диска — H:. Использование

в командной строке возвращается

Том на диске H — Backup1
Серийный номер тома — C070-804B

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

@echo off
для %%a in (abcdefghijklmnopqrstu vwxyz) do (vol %%a: | найти «Backup1»
если не уровень ошибки 1, установить myDrive=%%a:)
if "%myDrive%"=="" (echo Не удается найти том
) else (
echo Буква диска: %myDrive%)
)
пауза

Вышеприведенный пакетный файл выполняет циклический просмотр каждой буквы, а затем использует Find для проверки текста, возвращенного из Vol, на наличие имени тома. Если он находит его, он устанавливает переменную с именем MyDrive на найденную букву диска, совпадающую с именем тома.

Вывод этого файла

Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Устройство не готово.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Системе не удается найти указанный путь.
Буква диска - h:
Нажмите любую клавишу, чтобы продолжить. . .

Давайте посмотрим, сможем ли мы избавиться от системных сообщений. 0 — стандартный ввод, 1 — стандартный вывод и 2 — стандартный вывод. Мы можем отправить много системных сообщений и ошибок на нулевое устройство, используя >nul

@echo off
для %%a in (abcdefghijklmnopqrstu vwxyz) do (vol %%a: 2>nul | find «Backup1» >nul
если нет уровня ошибки 1, установите myDrive=%%a :)
if "%myDrive%"=="" (echo Не удается найти том
) else (
echo Буква диска: %myDrive%)
)
pause

Выход из пакетного файла теперь

Буква диска - h:
Нажмите любую клавишу, чтобы продолжить. . .

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

@echo off
для %%a 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 vol %%a: 2>nul | find "Backup1" >nul && set myDrive=%%a:
if "%myDrive%"=="" (echo Не удается найти том
) else (
echo Буква диска: %myDrive %)
)
пауза

Выход из пакетного файла по-прежнему

Буква диска - h:
Нажмите любую клавишу, чтобы продолжить. . .

Список подключенных дисков

Было бы неплохо, если бы мы могли просто протестировать подключенные диски, не просматривая весь алфавит? В Windows есть несколько утилит, которые могут это сделать. Один использует подмножество Fsinfo Fsutil. На моем компьютере команда

диски fsutil fsinfo

Диски: C:\ D:\ E:\ F:\ H:\

Проблема в том, что Fsutil требует запуска от имени администратора, что подходит не на все случаи жизни. Дополнительные сведения о Fsutil см. в Microsoft Technet или SS64. Для получения более подробной информации о Fsutil Fsinfo см. Microsoft Technet.

Еще одна команда, которая может получить буквы дисков компьютера, — Mountvol. Mountvol используется для создания, удаления или отображения точки подключения тома. При использовании без каких-либо параметров будут перечислены диски компьютеров.

дает этот вывод

Создает, удаляет или перечисляет точку подключения тома.

MOUNTVOL [диск:]путь VolumeName
MOUNTVOL [диск:]путь /D
MOUNTVOL [диск:]путь /L
MOUNTVOL [диск:]путь /P
MOUNTVOL /R
MOUNTVOL /N
MOUNTVOL /E

путь Указывает существующий каталог NTFS, в котором будет находиться точка монтирования.
VolumeName Указывает имя тома, который является целью точки подключения.
/D Удаляет точку подключения тома из указанного каталога.
/L Выводит имя смонтированного тома для указанного каталога.
/P Удаляет точку подключения тома из указанного каталога, отключает том и делает его недоступным для подключения.
Вы можете сделать том снова монтируемым, создав точку монтирования тома.
/R Удаляет каталоги точек подключения томов и параметры реестра для томов, которых больше нет в системе.
/N Отключает автоматическое монтирование новых томов.
/E Повторно включает автоматическое монтирование новых томов.

Вывод этого может быть проанализирован с помощью Find только для букв дисков и тех, которые переданы команде Vol, чтобы найти и сопоставить метки томов. Это означает, что пакетный файл должен быть более эффективным, поскольку ему не нужно проверять каждую букву диска, а только те, которые Mountvol сообщает как присоединенные.

@echo off
for /f "tokens=1 delims=\" %%a in ('mountvol^|find ":\"') do vol %%a 2>nul | find /i "Backup1" >nul 2>&1 && set myDrive=%%a
if "%myDrive%"=="" (echo Не удается найти том
) else (
echo Drive буква %myDrive%)
)
пауза

Вывод этого пакетного файла

Буква диска H:
Нажмите любую клавишу, чтобы продолжить. . .

Есть несколько вещей, которые необходимо объяснить об этом пакетном файле

/f означает, что будет обрабатываться текст или текстовый файл.
tokens=1 — это первый элемент в списке элементов, разделенных символом \
^ искомый текст. По сути, он сообщает командному процессору, что символ вертикальной черты (|) является символом вертикальной черты, а не обычным текстом.

Дополнительную информацию о Mountvol можно найти в Microsoft Technet или SS64.

Командная строка инструментария управления Windows (WMIC)

Есть ли способ без разбора одной утилиты и передачи вывода в Find, а затем передачи результата в Vol?

Я не думаю, что мы можем обойтись без части синтаксического анализа с помощью find, потому что я не знаю утилиты, которая возвращает букву диска при вводе метки тома. Если бы это было так, мы бы не писали этот командный файл. Есть способ получить информацию без использования Vol, а именно с помощью утилиты командной строки Windows Management Instrumentation (WMIC).

Вот одна из форм команды

том wmic получить букву диска, метку

Буквенная метка диска
C: SQ004466V01
F: Работает
H: Backup1
D:
E:

Вот еще одна форма команды

wmic logicaldisk получить заголовок,имя тома

Caption VolumeName
C: SQ004466V0
D:
E:
F: Работает
H: Backup1
Z:

Обратите внимание, что во второй форме диски перечислены в алфавитном порядке и включают диск Z:, который является сетевым диском в моей системе. Дополнительную информацию о WMIC можно найти на Microsoft Technet и SS64.

Используя эту информацию, можно сформировать новый пакетный файл:

@echo off
for /f %%a in ('wmic logicaldisk get caption^,volumename^| find "Backup1"') do set myDrive=%%a
if "%myDrive% "=="" (echo Не удается найти том
) else (
echo Буква диска: %myDrive%)
пауза

Вывод:

Буква диска H:
Нажмите любую клавишу, чтобы продолжить. . .

Несколько дисков

Для некоторых задач может потребоваться несколько внешних дисков. Следующий пакетный файл использует цикл For для проверки дисков в списке и выдает сообщение об ошибке, если они отсутствуют.

@echo off
Для %%a в (Working Backup1 Backup2) вызовите :fnddrv %%a
goto EOF:

:fnddrv
set ltr=
for /f %%b in ('wmic logicaldisk get caption^,volumename^| find "%1"') do set ltr=%%b

if "%ltr%"=="" goto ERROR
if %1==Working (
set workdrv=%ltr%
goto :EOF)
if % 1==Резервная копия1 (
set bkp1drv=%ltr%
goto :EOF)
if %1==Backup2 (
set bkp2drv=%ltr%
goto : Процесс)

:Ошибка
echo Не удается найти %1
echo.
echo Подключите правильный диск и повторите попытку
echo.
пауза
выход

:Процесс
echo Рабочий диск — %workdrv%
echo Резервный диск 1 — %bkp1drv%
echo Резервный диск 2 — %bkp2drv%
echo.
пауза

Вывод этого файла, если присутствуют все три диска:

Рабочий диск — F:
Резервный диск 1 — H:
Резервный диск 2 — G:

Нажмите любую клавишу, чтобы продолжить. . .

Несколько слов предупреждения

Утилита Find используется во многих из этих пакетных файлов для поиска текста в выходных данных других программ, таких как Vol и Mountvol.Необходимо следить за тем, чтобы метка тома диска, который вы ищете, не содержала ни одного слова в выводе этих программ.

Имена томов должны быть уникальными. Например, если поиск используется для поиска «назад», он также найдет «резервную копию».

Как получить список букв дисков и связанных с ними меток в системе Windows через файл bat?

14 ответов 14

Это даст большую часть:

Если у вас есть какие-либо диски, подключенные через subst, вам также необходимо получить их:

Для полноты вы можете сделать это в Powershell следующим образом (если вы используете Windows 7 или установили ее):

Вы также можете сделать это из командной строки или пакетного файла с помощью WMI следующим образом:


Вам нужно удалить кавычки из wmic logicaldisk get "caption,providername,drivetype", чтобы это было wmic logicaldisk get caption,providername,drivetype, в противном случае это выдает ошибку. EBGreen, вы в одиночку взорвали мой мозг за день, я никогда не видел wmic, хотя я несколько недель писал сценарии для различных сборок сервера, и я очень взволнован, увидев, что еще я могу с ним сделать. Отличная работа!

wmic logicaldisk get caption,providername,drivetype,volumename Имя тома было тем, чего мне не хватало, если вы обновите его, я приму его как ответ. Спасибо

Для использования diskpart нет необходимости создавать промежуточный файл. Попробуйте:

Быстро, гибко и эффективно. Хотя и немного сложно.

Я не знаю, на каких версиях Windows это работает, но я только что протестировал его на своих машинах с Win 7 и XP и получил следующий результат от обоих: s):БЕСПЛАТНО: "!TMP_FREE_DRIVE_LETTERS!"`

по мотивам Скотта

также показывает буквы дисководов компакт-дисков и букв сетевых дисков. Нет необходимости иметь права администратора.


@BeritLarsen вам нужно удвоить символы %, если вы запускаете его как пакетный файл, а не в командной строке.

Если кому-то повезло, что он использует Vista (в моем случае Vista Ultimate SP2 b6002) и приведенные здесь фрагменты кода gwmi и wmic не работают, вот что я сделал, чтобы это работает.

Для gwmi: если вы не получаете никаких выходных данных, попробуйте изменить DriveType на 3. Если проблемы все еще возникают, полностью удалите параметр -filter и проанализируйте выходные данные.

Для wmic, если вы получаете сообщение "Invalid GET Expression", попробуйте поместить выражение get в кавычки:

На этом сайте намного проще набор вызовов:

Показать локальные диски:

wmic logicaldisk получить идентификатор устройства, имя тома, описание

Если вы хотите отобразить только диски определенного типа, команду wmic можно расширить, включив в нее предложение where.

Существует как минимум два способа получить список букв дисков при работе в командной строке.

<р>1. Самый простой — использовать WMIC, например:

wmic logicaldisk получить описание, имя

который на моем ПК производит:

Если бы я хотел только перечислить свои локальные фиксированные диски, я бы вместо этого использовал:

wmic logicaldisk, где drivetype=3 получить описание, имя

и это даст:

ЗначениеЗначение
0Неизвестно
1Нет корневого каталога
2 Съемный диск
3Локальный диск
4 Сетевой диск
5Компакт-диск
6ОЗУ диск
<р>2. Альтернативой является использование fsutil :

диски fsutil fsinfo

который на моем ПК производит:

Как видите, вывод отличается, fsutil не возвращает ни один из подключенных сетевых дисков. Еще одна вещь, которую следует отметить в отношении fsutil, заключается в том, что он требует прав администратора, поэтому для его использования вы должны «запускать от имени администратора».

Дополнительную информацию о fsutil см. в этой статье Microsoft Technet.

В пакетном файле

Для пакетного файла я предпочитаю использовать wmic просто потому, что он не требует повышенных привилегий. Следующее при копировании в пакетный/командный файл будет просто отображать буквы дисков:

@echo off
for /f "tokens=2 delims==" %%d in ('wmic logicaldisk, где "drivetype=3" получает имя /format:value') do echo %%d

Обратите внимание, что вся строка "для" должна быть на одной строке, независимо от того, как она может быть заключена в окне браузера.

При использовании этого в реальности вы, вероятно, захотите заменить эхо вызовом, чтобы что-то сделать на диске.

Эти примечания были протестированы с Windows Vista и могут также применяться к другим версиям Windows.

Об авторе: Брайан Крайер — профессиональный разработчик программного обеспечения и веб-мастер. В качестве основной работы он разрабатывает веб-сайты и настольные приложения, а также предоставляет ИТ-услуги. Он подрабатывает техническим автором и консультантом.

Я видел несколько тем по этому поводу, но все они, похоже, связаны с изменением буквы диска, которая указана ВНУТРИ пакетного файла. Я давно решил эту проблему, но если я пытаюсь запустить .bat из командной строки и не хочу запускать diskpart, чтобы найти букву диска, как мне это сделать?

Например: у меня есть программа, которая является предзагрузочной средой и позволяет мне получить доступ к командной строке. Я хочу запустить файл .bat, хранящийся на подключенном внешнем диске, без запуска diskpart, чтобы найти букву диска. Есть ли команда, которую я могу ввести, которая выполнит поиск на всех доступных дисках для определенного имени файла и запустит его?

В своих пакетных файлах я обычно выполняю это с помощью %~dp0, но это не работает как команда.

Любая помощь приветствуется, так как я уверен, что ответ прост, но я не могу его понять.

Этот человек является проверенным специалистом

Шон Болдуин

Участвуйте, чтобы выиграть еженедельные подарочные карты (от 100 евро), Oculus и наушники/колонки

Конкурс завершается 27 марта 2022 г. Конкурсы Каждую неделю узнайте больше о том, как Red Hat может помочь вам добиться простоты и цифровых инноваций, и ответьте на вопрос. Детали конкурса Просмотреть все конкурсы

16 ответов

Fessor

Вам нужен эквивалент команды 'what' в Windows? Попробуйте ввести команду «где».

Этот человек является проверенным специалистом

OP Шон Болдуин

'where' отображает только путь к каталогу, верно? как мне заставить его запускать пакетный файл без необходимости определения точного пути к файлу. Это можно сделать в пакетном файле, что наводит меня на мысль, что я смогу сделать это с помощью командной строки. Может быть, не потому, что вы не всегда можете делать одни и те же действия в bat и в командной строке.

jrp78

Этот человек является проверенным специалистом

jrp78

  • отметить 69 лучших ответов
  • thumb_up – 247 благодарных отзывов
  • format_list_bulleted 1 Инструкции

Вы можете сделать это в powershell, чтобы перебрать все найденные буквы дисков и найти вашу программу. Как только он найдет его, вы можете запустить свою команду.

Этот человек является проверенным специалистом

OP Шон Болдуин

Powershell не подходит для имеющегося у меня предзагрузочного носителя.

jrp78

Этот человек является проверенным специалистом

jrp78

  • отметить 69 лучших ответов
  • thumb_up – 247 благодарных отзывов
  • format_list_bulleted 1 Инструкции

Вы можете запустить этот очень уродливый, но функциональный пакетный файл, чтобы просмотреть каждую букву диска для вашего приложения, и как только она будет найдена, запустить нужную команду.

Fessor

SeanBaldwin написал:

'where' отображает только путь к каталогу, верно? как мне заставить его запускать пакетный файл без необходимости определения точного пути к файлу. Это можно сделать в пакетном файле, что наводит меня на мысль, что я смогу сделать это с помощью командной строки. Может быть, не потому, что вы не всегда можете делать одни и те же действия в bat и в командной строке.

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

Этот человек является проверенным специалистом

OP Шон Болдуин

да, я думаю, что мое намерение теряется. Я опишу свой текущий процесс более подробно.

У меня есть внешний диск, который я подключаю перед включением компьютера, затем нажимаю F12 в режиме предварительной загрузки и принудительно загружаюсь на внешний диск с загрузочным разделом. Как только программа, которую я загружаю, загружается, я могу войти в командную строку в программе (это не Windows, с этой Windows никогда не загружается). Затем я набираю «diskpart» один раз в diskpart, я набираю «list volume» и обратите внимание на букву диска для раздела на внешнем жестком диске, на котором хранится мой пакетный файл. Затем я набираю «выход», чтобы вернуться в обычную командную строку. Допустим, буква раздела на внешнем диске отображается как Z в diskpart. Затем я набрал Z:diskpart1000.bat (diskpart1000.bat — это имя пакетного файла, который я пытаюсь запустить).

Что я пытаюсь сделать, так это избавиться от необходимости набирать "diskpart" "list volume" "exit" . и вместо этого используйте команду, которая будет искать на всех доступных дисках и разделах файл, который я указываю (в данном случае это пакетный файл), и запускать его. все в одной командной строке.

Если бы я был в Windows, я бы даже не использовал командную строку для этого, я бы просто запустил пакетный файл, но .bat — это способ стереть все разделы на внутреннем жестком диске и применить файл .wim, чтобы он в предзагрузочной среде.

jrp78

Этот человек является проверенным специалистом

jrp78

  • отметить 69 лучших ответов
  • thumb_up – 247 благодарных отзывов
  • format_list_bulleted 1 Инструкции

Затем вы должны создать пакетный файл с чем-то вроде второй команды, которую я опубликовал. Затем скопируйте этот пакетный файл в корень вашего загрузочного USB-накопителя (или на любой другой путь, по которому вы попадете при загрузке USB-накопителя). Затем запустите пакет, и он найдет ваш диск и выполнит команду.

Не уверен, что это будет работать в вашей предзагрузочной среде, но в пакетных файлах Windows:

Переменная, означающая "каталог, из которого запускается скрипт, включая букву диска"

Я использую его при запуске скриптов со съемного носителя.

Jim6795

Этот человек является проверенным специалистом

Джим6795

Читайте также: