Компьютерный форум 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=280229)

SharkyEXE 02-04-2014 19:14 2332191

Получить номер диска в переменную
 
Здравствуйте.
Нужно, чем проще, тем лучше, реализовать такое: при запуске файла надо вывести в переменную номер диска, в корне которого лежит файл 1
Типа как сделать diskpart -> list volume

Должно быть как-то так:
Код:

FOR %%d 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 %%d:\1 SET CDROM=%%d:
Для диска, у которого CDROM=%%d:, нужно в переменную вывести номер диска

Спасибо.

exo 02-04-2014 19:54 2332224

Цитата:

Цитата SharkyEXE
Нужно, чем проще, тем лучше, реализовать такое: »

обязательно cmd? poweshell проще:
Код:

PS C:\Users\Alex> Get-WmiObject Win32_logicaldisk


DeviceID    : C:
DriveType    : 3
ProviderName :
FreeSpace    : 49174024192
Size        : 141008302080
VolumeName  :

DeviceID    : D:
DriveType    : 3
ProviderName :
FreeSpace    : 2002513920
Size        : 2146430976
VolumeName  : Volume

DeviceID    : E:
DriveType    : 5
ProviderName :
FreeSpace    : 0
Size        : 0
VolumeName  : Audio CD


Foreigner 02-04-2014 20:23 2332242

Код:

@echo off
setlocal

for /f "tokens=2 delims==" %%i in ('wmic cdrom get id /value') do call:set %%i
set cdrom_
goto:eof

:set
set /a cnt+=1
set cdrom_%cnt%=%1


SharkyEXE 03-04-2014 06:27 2332413

Цитата:

Цитата Foreigner
@echo off
setlocal
for /f "tokens=2 delims==" %%i in ('wmic cdrom get id /value') do call:set %%i
set cdrom_
goto:eof
:set
set /a cnt+=1
set cdrom_%cnt%=%1 »

Здравствуйте. У меня Ваш код не работает. Создал файл 1.cmd, вставил туда целиком Ваш код, запустил файл 1.cmd и тишина
Кстати, а где в Вашем коде строка, для поиска в корне диска файла 1 и узнать букву этого диска?

Foreigner 03-04-2014 07:38 2332416

Цитата:

Цитата SharkyEXE
не работает. »

Какая версия ОС?
SharkyEXE, Нужно именно с файлом в корне CD/DVD?
Код:

@echo off
setlocal

for /f "tokens=2 delims==" %%i in ('wmic cdrom get id') do if exist "%%i\1" set "cdrom=%%i"
echo %cdrom%


SharkyEXE 03-04-2014 19:37 2332706

Цитата:

Какая версия ОС?
microsoft windows xp home sp3
Цитата:

Нужно именно с файлом в корне CD/DVD?
В принципе, путь любой, как Вам удобно
Только если у меня вставлено 3 100%но одинаковые флешки:
1) с одинаковыми именами (например, Вася)
2) с одинаковыми размерами (например, 32 гигабайта каждая)
то только по нужному файлу-метке 1 найдется нужная мне флешка и для нее надо определить номер
Даже фиксированная буква флешки не пойдет - на разных пк буква может меняться
Вот поэтому мне и надо найти файл-маркер 1 и где находится этот файл-маркер 1 для этого диска узнать номер

1) На диске C:\ я создал файл 1.cmd с кодом
Код:

setlocal

for /f "tokens=2 delims==" %%i in ('wmic cdrom get id') do if exist "%%i\1" set "cdrom=%%i"
echo %cdrom%

pause

2) Запустил файл C:\1.cmd
3) Вот такое окно получил: http://yadi.sk/d/zKgpg8XlLk6w7

Спасибо

Iska 03-04-2014 20:03 2332719

Цитата:

Цитата SharkyEXE
Только если у меня вставлено 3 100%но одинаковые флешки »

Гмм… SharkyEXE, флэшка у Вас определяется именно как CD-ROM?

SharkyEXE 03-04-2014 20:11 2332724

Цитата:

Цитата Iska
Гмм… SharkyEXE, флэшка у Вас определяется именно как CD-ROM? »

Извините меня, пожалуйста, а кто Вам такое сказал?
Если Вы по поводу кода:
Код:

FOR %%d 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 %%d:\1 SET CDROM=%%d:
в котором указано название переменной CDROM, то вместо названия переменной CDROM может быть любое название, хоть Вася, хоть Петя...
Флешка у меня новая, купил в магазине, принес домой, раздербанил новую коробочку, в которую была упакована флешка, вставил флешку в комп и все.
Метка флешки - TRANSCEND
В плане никакими сторонними утилитами я не разбивал флешку, никаких виртуальных сиди-ромов я не делал на флешке
Спасибо.

Iska 03-04-2014 20:56 2332751

Цитата:

Цитата SharkyEXE
Извините меня, пожалуйста, а кто Вам такое сказал?
Если Вы по поводу кода: »

Именно. И последующего кода (за исключением #2). Было бы странно, если бы он у Вас заработал, будучи ориентирован на CD-ROM.

Лучше ориентироваться на серийный номер, наподобие:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq skip=1 delims=" %%i in (
        `wmic.exe LogicalDisk where "VolumeSerialNumber='533E46DF'" get Name 2^>nul`
) do for %%j in (%%i) do set sName=%%j

if defined sName echo [%sName%]

endlocal
exit /b 0

Здесь не номер, а буква логического диска. Дайте пояснения по поводу номера.

SharkyEXE 03-04-2014 21:36 2332779

Например, файл маркер 1 находится в корне флешки, флешка имеет букву Е
Делаю Пуск -> Выполнить -> CMD
Появляется окно консоли, пишу diskpart, нажимаю Enter
Пишу list volume, нажимаю Enter
Появляется таблица, нахожу строку, где написано буква диска Е
И смотрю, какой Том 1 или Том 2 или Том 3 или другая цифра соответствует диску который имеет букву Е, в корне которого лежит файл-маркер 1
Вот цифра Том мне и нужна
Спасибо

Foreigner 03-04-2014 22:50 2332804

Цитата SharkyEXE:
Цитата:

microsoft windows xp home sp3
Там нет wmic, увы

Цитата:

И смотрю, какой Том 1 или Том 2 или Том 3 или другая цифра соответствует диску который имеет букву Е, в корне которого лежит файл-маркер 1
Вот цифра Том мне и нужна
Код:

@echo off
setlocal

for /f "tokens=2,3" %%i in (' "echo list volume | diskpart" ') do (

        if exist "%%j:\1" set "num=%%i"
       
)

echo %num%


SharkyEXE 04-04-2014 06:27 2332859

Цитата:

Цитата Foreigner
@echo off
setlocal
for /f "tokens=2,3" %%i in (' "echo list volume | diskpart" ') do (
if exist "%%j:\1" set "num=%%i"
)
echo %num% »

Огромное Вам спасибо, код 100% рабочий.

Только вот, извините меня, пожалуйста, я про это не знал, я думал, что diskpart -> list volume и Управление дисками это одно и тоже
Файл-маркер 1 лежит в корне флешки с буквой E и меткой TRANSCEND
В diskpart -> list volume у меня такой скриншот: http://yadi.sk/d/CdMOWYcNLmAfS
В Управление дисками у меня такой скриншот: http://yadi.sk/d/nh3jr3CILmAfU
То есть в diskpart -> list volume для флешки (Файл-маркер 1 лежит в корне флешки с буквой E и меткой TRANSCEND) номер тома 2
А в Управление дисками для флешки (Файл-маркер 1 лежит в корне флешки с буквой E и меткой TRANSCEND) номер тома 1
Выделено красными прямоугольниками на скриншотах про разные цифры томов для одной и той же флешки (Файл-маркер 1 лежит в корне флешки с буквой E и меткой TRANSCEND)

Ваш код
Цитата:

Цитата Foreigner
@echo off
setlocal
for /f "tokens=2,3" %%i in (' "echo list volume | diskpart" ') do (
if exist "%%j:\1" set "num=%%i"
)
echo %num% »

выдает цифру 2 для моей флешки (Файл-маркер 1 лежит в корне флешки с буквой E и меткой TRANSCEND): http://yadi.sk/d/9dAgMcKnLmAmz
Это все правильно.

Однако, пожалуйста, если у Вас есть время, возможность, желание - сделайте так, чтобы номер флешки (Файл-маркер 1 лежит в корне флешки с буквой E и меткой TRANSCEND) искался не для diskpart -> list volume, а для Управление дисками

То есть чтобы Ваш код выдавал не 2, а 1.

Спасибо.

Еще раз извините меня, пожалуйста, век живи, век учись, теперь я буду знать, что diskpart -> list volume и Управление дисками выдают разные цифры тома для одной и той же флешки

Iska 04-04-2014 06:35 2332860

SharkyEXE, может, Вы ещё скажете, для чего Вам нужен «номер диска»?

SharkyEXE 04-04-2014 06:44 2332861

Цитата:

Цитата Iska
SharkyEXE, может, Вы ещё скажете, для чего Вам нужен «номер диска»? »

Вот для этого: http://www.nearthebridge.com/gruzims...-v-virtualbox/
С пункта 1 до пункта 2 прочитайте, пожалуйста.
Спасибо.

Iska 04-04-2014 07:12 2332864

SharkyEXE, спасибо, ясно.

Читать, правда, надо вообще-то п.2:


Поскольку у Вас нет «wmic.exe», то WSH (с учётом соответствия «логический диск» → «раздел» → «физический диск»):
Код:

Option Explicit

Dim objSWbemObjectEx

With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
        For Each objSWbemObjectEx In .ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE VolumeSerialNumber = '533E46DF'")
                Exit For
        Next
       
        For Each objSWbemObjectEx In objSWbemObjectEx.Associators_(,"Win32_DiskPartition")
                Exit For
        Next
       
        For Each objSWbemObjectEx In objSWbemObjectEx.Associators_(,"Win32_DiskDrive")
                Exit For
        Next
       
        WScript.Echo objSWbemObjectEx.DeviceID
End With

WScript.Quit 0

Для использования внутри пакетного файла использовать в качестве хоста WSH «cscript.exe» в виде:
Код:

cscript.exe //nologo <Путь\имя.vbs>

SharkyEXE 04-04-2014 16:54 2333057

Iska
Извините меня, пожалуйста, за, возможно, мою наглость, а нельзя ли попроще код, например как здесь http://forum.oszone.net/post-2332804-11.html но только, чтобы было для Управление дисками, чтобы цифра 1 в переменной была, а не 2?
Спасибо.

Iska 04-04-2014 17:56 2333101

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq" %%i in (
        `cscript.exe //nologo "%~dp0GetPhysycalDriveBySerialNumber.vbs"`
) do set sPhysycalDrive=%%i

if defined sPhysycalDrive echo [%sPhysycalDrive%]

endlocal
exit /b 0

Файл «GetPhysycalDriveBySerialNumber.vbs», содержащий код из предыдущего поста, предполагается расположенным в том же каталоге, что и пакетный файл («%~dp0»).

SharkyEXE 04-04-2014 18:06 2333107

Iska
Извините меня, пожалуйста, а возможно сделать отвязку от серийного номера и сделать привязку к поиску файла-маркера 1 в корне диска?
Просто лень заморачиваться с серийным номером, привычнее как-то файл-маркер...

Iska 04-04-2014 18:20 2333119

Можно. Но не нужно. Ибо «заморачиваться» с серийным номером не придётся. Достаточно однократно выполнить команду «dir» для Вашей флэшки и использовать полученную информацию:
Код:

Серийный номер тома: 533E-46DF
без дефиса. Вплоть до её переформатирования.

SharkyEXE 04-04-2014 19:25 2333145

Цитата:

Цитата Iska
Можно. Но не нужно. Ибо «заморачиваться» с серийным номером не придётся. Достаточно однократно выполнить команду «dir» для Вашей флэшки и использовать полученную информацию: »

Все таки можно, пожалуйста, оочень хочется, чтобы без серийного номера, чтобы по файлу-маркеру 1 в корне флешки работало?
Спасибо.

Iska 04-04-2014 20:00 2333156

Напрасно.

Код:

Option Explicit

Dim objSWbemObjectEx
Dim objFSO

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
        For Each objSWbemObjectEx In .ExecQuery("SELECT * FROM Win32_LogicalDisk")
                If objFSO.FileExists(objSWbemObjectEx.Name & "\1") Then
                        Exit For
                End If
        Next
       
        For Each objSWbemObjectEx In objSWbemObjectEx.Associators_(,"Win32_DiskPartition")
                Exit For
        Next
       
        For Each objSWbemObjectEx In objSWbemObjectEx.Associators_(,"Win32_DiskDrive")
                Exit For
        Next
       
        WScript.Echo objSWbemObjectEx.DeviceID
End With

Set objFSO = Nothing

WScript.Quit 0

Если файл не будет найден — будет ошибка.

SharkyEXE 04-04-2014 21:47 2333204

Почему напрасно?
Ведь мне надо чем проще тем лучше, так сказать файл-маркер это для меня классика, а серийный номер это уже очень научно
Хотя может быть с серийным номером чем то лучше, чем с файлом-маркером

Iska 04-04-2014 22:25 2333223

SharkyEXE, во всяком случае, поменяйте имя маркерного файла с «1» (которых внезапно может оказаться x штук на логических дисках, а не только на Вашей флэшке) на какой-нибудь более уникальный маркер. Например, на какой-нибудь сгенерированный GUID. И мы закономерно придём к тем же яйцам, только в профиль тому же a-la серийному номеру, ;).

mwz 05-04-2014 00:53 2333295

Iska, как вариант -- метку тома делать уникальной, чтобы маркер под руками не болтался.

SharkyEXE, Правда, полностью стандартный GUID туда вроде не влезает -- но можно сгенерить и вставить первые 32 символа.
И обрабатывать затем эту метку тома.

Или читать тот идентификатор, с которым диск сидит в системе.

Iska 05-04-2014 14:06 2333401

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

mwz 05-04-2014 19:08 2333552

Iska, ну я просто показать, что вариантов не один: выбор есть. :)

SharkyEXE 05-04-2014 22:08 2333634

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


Время: 00:46.

Время: 00:46.
© OSzone.net 2001-