Показать полную графическую версию : [решено] Составление списка существуюих дисков + отсев дисков не имеющих ФС
Здравствуйте, столкнулся с такой проблемой: раньше я использовал вот такой вот скрипт для поиска файла с именем usbroot.dsk на дисках и создания переменной %usbroot% с присвоением диска содержащего этот файл:
for %i in (C D E F G H I J K L N M O P Q R S T U V W X Y Z) do if exist %i:\usbroot.dsk setx usbroot %i: -m
но если в компьютере присутствует картридер, то скрипт после обращения к букве диска картридера выдает окно ошибки:
http://savepic.org/540850.jpg
В связи с этим я решил немного поправить скрипт. Суть такая: вместо перебора букв дисков, я хотел использовать только те диски, где существует ФС. Для этого я воспользовался командой:
for /f "skip=1 tokens=1,2,*" %%i in ('wmic logicaldisk get caption^,filesystem') do ...
но отсеять диски по ФС у меня так и не получилось. Прошу, помогите разобраться в следующих вопросах:
1) Что, собственно, нужно дописать в скрипт, чтобы отсеять эти диски?
2) Каким способом передать список дисков (с ФС) в функцию поиска файла?
Возможно есть более рациональный способ нежели использование "wmic logicaldisk get caption,filesystem" или возможность отсеять диски не по ФС. Если у вас есть идеи по этому поводу, поделитесь ими.
Решил я эту задачу. Все оказалось намного проще, чем я предполагал и весь текст скрипта уместился в одну строку:
for /f "skip=1 tokens=1" %%i in ('wmic.exe logicaldisk get caption^,filesystem ^| find /v /i " "') do if exist %%i\diskroot.txt setx diskroot %%i -m
тогда еще пара вариантов:
For /F "UseBackQ Skip=1" %%i In (
`WMIC LogicalDisk Where "FileSystem LIKE '_%%'" Get Caption^|Find ":"`
) Do If Exist %%i\diskroot.txt SetX diskroot %%i -m
For /F "Tokens=3 Delims=:=" %%i In (
'WMIC Path Win32_LogicalDiskRootDirectory Get GroupComponent'
) Do If Exist "%%i:\diskroot.txt" SetX diskroot %%i:" -m
Да… Скобки при наборе «for /…», оказывается, могут использоваться одновременно и как операторные… Не знал :(. Спасибо!
Morpheus
28-01-2011, 16:52
Действительно проблема есть, 2 машины с кардридерами и на обеих вылез косяк
amel27, спасибо, супер!
Я для подобной задачи использовал
echo list volume | diskpart
его вывод подавал на for и проверял значение столбца файловой системы для поиска оптических приводов, или метки диска для поиска конкретной флешки
for %i in (C D E F G H I J K L N M O P Q R S T U V W X Y Z) do if exist %i:\ (if exist "%%i:\usbroot.dsk setx usbroot %i: -m)
или проверка наличия файла с помощью команды Dir@echo off
for %%i in (C D E F G H I J K L M N O P Q R S T U V W) do @Call:Search %%i
exit
:Search
set var=1
for /f "tokens=1" %%a in ('dir /d %1:\usbroot.dsk') do set var=%%a
if %var% EQU 0 setx usbroot %1 & exit
FreshMen85
13-02-2011, 19:48
Помогите побороть непонятную ситуацию, пробывал все коды для батника на этой странице и все у меня не срабатывают, запускаю код сценария в windows 7 с правами админа.
@ECHO OFF
For /F "Tokens=3 Delims=:=" %%i In (
'WMIC Path Win32_LogicalDiskRootDirectory Get GroupComponent'
) Do If Exist "%%i:\diskroot.txt" SetX diskroot %%i:" -m
pause
start %DiskRoot%\install\FirstLogonCommands.cmd
exit
- появляется сообщение об каком-то успехе, буква диска определяется правильно, но файл так и не запускается, при чем в ошибке пишется правильный путь до файла, но программа его не видит по этому пути, что делать то с этим подскажите.
Хотя вот с такой командой проблем не возникает:
@ECHO OFF
SET DiskRoot=NULL
:SearchDiskRoot
FOR %%i 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) DO IF EXIST %%i:\DiskRoot.txt SET DiskRoot=%%i:
IF NOT "%DiskRoot%"=="NULL" GOTO StartSetup
GOTO SearchDiskRoot
:StartSetup
ECHO DiskRoot=%DiskRoot%
start %DiskRoot%\install\FirstLogonCommands.cmd
exit
Но как я понял со вторым кодом будут проблемы при установленно кардридере.
Несколько слов по поводу скриптов товарища amel27:
1) двойные проценты %% вызывают ошибку
2) первый скрипт без них заработал нормально и то только в готовой системе, во время же автоматической установки не срабатывает, а вот второй вместо двоеточия в переменную diskroot к букве DVD-ROM добавляет -m, вместо Х: получается Х -m
Господа скриптописатели, объясните в чём дело
"не работает" потому, что setx инициализирует глобальную переменную, которая в уже существующей сессии недоступна
для обычного скрипта надо использовать обычный set
Scratch56
28-05-2011, 10:57
Не понял который пост является решением и как его применить. Попробовал в AutoUnattend.xml pass="specialize" заменить первую строку второй.FOR %i IN (C D E F G H I J K L N M O P Q R S T U V W X Y Z) DO IF EXIST %i:\rootmark SETX DVD %i: -m
FOR /f "skip=1 tokens=1" %%i in ('wmic.exe logicaldisk get caption^,filesystem ^| find /v /i " "') do if exist %%i\rootmark setx DVD %%i -m
Результат: Вместо буквы диска получил "C:\Windiws\system32\". Устанавливаю Windows 7 из USB CardReader "Kingston MobileLite G2" из SDHC карточки, а microSD - пустая, то есть на любом компьютере имею пустой кардридер.
Foreigner
28-05-2011, 15:11
Scratch56,
@echo off
setlocal
set "wmic=wmic logicaldisk get name,filesystem"
for /f "skip=1 tokens=1,2" %%i in (' "%wmic%" ') do call:set %%j %%i
for /f "tokens=2 delims=_=" %%i in (' set disk_ ') do echo %%i
goto:eof
:set
set "disk_%1=%2"
Scratch56, есть ли уверенность в работоспособности «wmic.exe» на этапе установки?
Dmitry_K
21-09-2011, 23:01
Scratch56, есть ли уверенность в работоспособности «wmic.exe» на этапе установки? »
ни один скрипт из этой темы на основе "wmic.exe" не работает на этапе Прохода 4 specialize... Проверено лично... Так что не мучайтесь... :durak:
Нашел 2 решения:
1. отбор дисков с файловой системой CDFS
For /F "tokens=3-5 delims= " %%i In ('cmd /c echo list volume ^| diskpart') Do If %%k==CDFS If Exist %%i:\DISKROOT.TXT SETX CDROM %%i: /M
2. отбор дисков с меткой WIN7-X86-32
For /F "tokens=3,4 delims= " %%i In ('cmd /c echo list volume ^| diskpart') Do If %%j==WIN7-X86-32 If Exist %%i:\DISKROOT.TXT SETX CDROM %%i: /M
Все 2 варианта работают на этапе Прохода 4 specialize... только в этом случае двойной процент %% необходимо заменить одинарным %
Dmitry_K,
Добрый день, а допустим если мне нужно выполнять установку и СД и с ФЛЕШ носителей, при условии что метки дисков могут быть разные. И файловая система тоже соответственно.
Вот еще вариант с отключение и последующим включением уведомления об ошибке.
Reg Add "HKLM\SYSTEM\CurrentControlSet\Control\Windows" /v "ErrorMode" /t REG_DWORD /d "0x00000002" /f
for %%i 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) do if exist %%i:\Diskroot.txt set Diskroot=%%i:
Reg Add "HKLM\SYSTEM\CurrentControlSet\Control\Windows" /v "ErrorMode" /t REG_DWORD /d "0x00000000" /f
Foreigner, А как Ваш многострочный вариант вставить в файл ответов?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.