Что нового

Количество дисков SSD/HDD

Scampy

Новичок
Сообщения
50
Репутация
0
Всем доброго времени суток!
Есть стандартный скрипт по определению SSD/HDD дисков в системе:
Код:
#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>

$typedisk = DriveGetType(0, 2)
$typedisk1 = DriveGetType(1, 2)
$typedisk2 = DriveGetType(2, 2)
If $typedisk = "" Then typedisk = "HDD"
If $typedisk1 = "" Then $typedisk1 = "HDD"
If $typedisk2 = "" Then $typedisk2 = "HDD"
MsgBox(4096, "Диски", $typedisk & @CRLF & $typedisk1 & @CRLF & $typedisk2)

Вопрос в чем... сколько бы "$typedisk" не добавлялось, все равно идет их определение и соответственно результат. Как сделать, чтоб определялось только реальное число дисков?
 
A

Alofa

Гость
Scampy сказал(а):
... Есть стандартный скрипт ...
А где такой взяли?

Код:
#include <Array.au3>

Local $aArray = DriveGetDrive('FIXED')

For $i = 1 To 3
	_ArrayColInsert($aArray, $i)
	For $j = 1 To $aArray[0][0]
		$aArray[$j][$i] = DriveGetType($aArray[$j][0], $i)
	Next
Next
_ArrayDisplay($aArray)
 
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Alofa сказал(а):
Scampy сказал(а):
... Есть стандартный скрипт ...
А где такой взяли?

Код:
#include <Array.au3>

Local $aArray = DriveGetDrive('FIXED')

For $i = 1 To 3
	_ArrayColInsert($aArray, $i)
	For $j = 1 To $aArray[0][0]
		$aArray[$j][$i] = DriveGetType($aArray[$j][0], $i)
	Next
Next
_ArrayDisplay($aArray)
Не совсем правильно выразился... команда имелась ввиду, а не весь код. В вашем примере отображаются все диски всех дисков... а нужно только диски как девайс.
 
A

Alofa

Гость
Scampy сказал(а):
... по определению SSD/HDD дисков в системе:
...
... Как сделать, чтоб определялось только реальное число дисков?
В Операционной системе или на компьютере?

Scampy сказал(а):
... Не совсем правильно выразился...
Это очевидно.

Scampy сказал(а):
... команда имелась ввиду, а не весь код.
Что вы называете командой?
Если нижеследующее для вас "команда", тогда смотрите ее описание и пример в Справке.
Код:
_WinAPI_GetDriveNumber()
 
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Alofa сказал(а):
В Операционной системе или на компьютере?
В операционной системе. Реально работающих в данный момент. За ссылку спасибо.
А что подразумевалось в фразе "на компьютере"?
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
В операционной системе. Реально работающих в данный момент. За ссылку спасибо.
[/quote]
Справку не читаете?
Вот пример из неё:
Код:
$aArray = DriveGetDrive("ALL")
If @error Then
    MsgBox(4096, "Ошибка", "Произошла ошибка при запросе дисков.")
Else
    For $i = 1 To $aArray[0]
        ; Показывает все найденные диски и переводит букву в верхний регистр.
        MsgBox(4096, "Диск " & $i & "/" & $aArray[0], StringUpper($aArray[$i]))
    Next
EndIf
А дальше, используя код Alofa и функцию DriveGetType (Возвращает тип устройства: "Unknown", "Removable", "Fixed", "Network", "CDROM", "RAMDisk"), ищем тип дисков.
 
A

Alofa

Гость
Scampy сказал(а):
... А что подразумевалось в фразе "на компьютере"?
А что подразумевалось во фразе?
Scampy сказал(а):
... Реально работающих в данный момент.
Я так подразумеваю вы хотите вычислить физические диски, а не логические.
Что такое физический диск и что такое логический диск?
 
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Alofa сказал(а):
Я так подразумеваю вы хотите вычислить физические диски, а не логические.
Да, именно физические диски. Железо. Недопоняли мы друг друга. Хотел написать понятней, а вышло наоборот. Извиняюсь.
 

Aleksandr Prilutskiy

Знающий
Сообщения
29
Репутация
9
Немного сложновато, но я делаю всегда именно так:
Код:
$ObjService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
$ObjItems = $ObjService.ExecQuery("SELECT * FROM Win32_DiskDrive", "WQL", 0x30)
$n = 0
If IsObj($ObjItems) Then
 Local $ObjItem, $i = 0
 For $ObjItem In $ObjItems
  ConsoleWrite($ObjItem.Model & @CRLF)
  $n += 1
 Next
EndIf
ConsoleWrite("Всего HDD: " & $n & @CRLF)

- работает 100% + в $ObjItem можно получить кучу полезной (и бесполезной) информации.
Перечень свойств объекта можно смотреть тут: https://msdn.microsoft.com/en-us/library/aa394132(v=vs.85).aspx
 
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Aleksandr Prilutskiy сказал(а):
Немного сложновато, но я делаю всегда именно так
А если в компе внутренний картридер? Он ведь в Вашем скрипте тоже определяется как HDD диск.

Вообщем в итоге у меня получилось как то так...
Код:
#include <WinAPIFiles.au3>

Local $aData, $aDrive = DriveGetDrive('FIXED')
Local $aList[10]

For $i = 0 To UBound($aDrive) - 1
    $aList[$i] = ''
Next
If IsArray($aDrive) Then
    For $i = 1 To $aDrive[0]
        $aData = _WinAPI_GetDriveNumber($aDrive[$i])
        If IsArray($aData) Then
            $aList[$aData[1]] &= StringUpper($aDrive[$i]) & ' '
        EndIf
    Next
EndIf
For $i = 0 To UBound($aDrive) - 1
   If $aList[$i] Then
	  $ssd = DriveGetType($i, $DT_SSDSTATUS)
	  If $ssd = "" Then $ssd = "HDD"
	  ConsoleWrite("Диск " & $i & @TAB & $ssd & @CRLF)
    EndIf
 Next
 
Верх