PDA

Показать полную графическую версию : [решено] Составление списка существуюих дисков + отсев дисков не имеющих ФС


komix
28-04-2010, 23:02
Здравствуйте, столкнулся с такой проблемой: раньше я использовал вот такой вот скрипт для поиска файла с именем 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" или возможность отсеять диски не по ФС. Если у вас есть идеи по этому поводу, поделитесь ими.

komix
29-04-2010, 01:36
Решил я эту задачу. Все оказалось намного проще, чем я предполагал и весь текст скрипта уместился в одну строку:
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

amel27
29-04-2010, 05:57
тогда еще пара вариантов:

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

Iska
29-04-2010, 08:43
Да… Скобки при наборе «for /…», оказывается, могут использоваться одновременно и как операторные… Не знал :(. Спасибо!

Morpheus
28-01-2011, 16:52
Действительно проблема есть, 2 машины с кардридерами и на обеих вылез косяк
amel27, спасибо, супер!

Busla
28-01-2011, 22:42
Я для подобной задачи использовал
echo list volume | diskpart
его вывод подавал на for и проверял значение столбца файловой системы для поиска оптических приводов, или метки диска для поиска конкретной флешки

conty9
02-02-2011, 21:23
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


Но как я понял со вторым кодом будут проблемы при установленно кардридере.

nemoi
28-03-2011, 18:35
Несколько слов по поводу скриптов товарища amel27:
1) двойные проценты %% вызывают ошибку
2) первый скрипт без них заработал нормально и то только в готовой системе, во время же автоматической установки не срабатывает, а вот второй вместо двоеточия в переменную diskroot к букве DVD-ROM добавляет -m, вместо Х: получается Х -m

Господа скриптописатели, объясните в чём дело

Busla
29-03-2011, 10:50
"не работает" потому, что 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"

Iska
28-05-2011, 17:19
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... только в этом случае двойной процент %% необходимо заменить одинарным %

noyhay
19-02-2012, 15:09
Dmitry_K,
Добрый день, а допустим если мне нужно выполнять установку и СД и с ФЛЕШ носителей, при условии что метки дисков могут быть разные. И файловая система тоже соответственно.

iChip
19-09-2012, 14:51
Вот еще вариант с отключение и последующим включением уведомления об ошибке.
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

biork
23-12-2012, 07:31
Foreigner, А как Ваш многострочный вариант вставить в файл ответов?




© OSzone.net 2001-2012