Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Составление списка существуюих дисков + отсев дисков не имеющих ФС (http://forum.oszone.net/showthread.php?t=174368)

komix 28-04-2010 23:02 1402926

Составление списка существуюих дисков + отсев дисков не имеющих ФС
 
Здравствуйте, столкнулся с такой проблемой: раньше я использовал вот такой вот скрипт для поиска файла с именем 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
но если в компьютере присутствует картридер, то скрипт после обращения к букве диска картридера выдает окно ошибки:

В связи с этим я решил немного поправить скрипт. Суть такая: вместо перебора букв дисков, я хотел использовать только те диски, где существует ФС. Для этого я воспользовался командой:
Код:

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 1403007

Решил я эту задачу. Все оказалось намного проще, чем я предполагал и весь текст скрипта уместился в одну строку:
Код:

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 1403043

тогда еще пара вариантов:

Код:

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 1403078

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

Morpheus 28-01-2011 16:52 1599305

Действительно проблема есть, 2 машины с кардридерами и на обеих вылез косяк
amel27, спасибо, супер!

Busla 28-01-2011 22:42 1599509

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

conty9 02-02-2011 21:23 1603091

Код:

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 1612041

Помогите побороть непонятную ситуацию, пробЫвал все коды для батника на этой странице и все у меня не срабатывают, запускаю код сценария в 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 1645827

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

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

Busla 29-03-2011 10:50 1646251

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

Scratch56 28-05-2011 10:57 1684050

Не понял который пост является решением и как его применить. Попробовал в 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 1684118

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 1684158

Scratch56, есть ли уверенность в работоспособности «wmic.exe» на этапе установки?

Dmitry_K 21-09-2011 23:01 1757730

Цитата:

Цитата Iska
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 1862028

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

iChip 19-09-2012 14:51 1991483

Вот еще вариант с отключение и последующим включением уведомления об ошибке.
Код:

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 2051407

Foreigner, А как Ваш многострочный вариант вставить в файл ответов?


Время: 04:26.

Время: 04:26.
© OSzone.net 2001-