2014-06-05 3 views
1

Je fais un programme pour améliorer les performances du PC et l'une de ses fonctions est la défragmentation. Mais si ce script est lancé, un SSD ne sera pas bon. Est-ce que quelqu'un sait comment je peux détecter si elles utilisent un SSD ou un disque dur pour que je puisse le programmer pour passer cette étape si nécessaire. Je pensais peut-être à un test de vitesse mais je ne sais pas si cela serait fiable. Est-ce que quelqu'un sait comment je pourrais le faire. MerciVérification par lots si quelqu'un utilise un disque dur ou un disque SSD

+0

Je vous recommande de demander cela sur SuperUser. –

Répondre

1

Cette information peut être obtenue à partir de la commande wmic; par exemple:

C:\> wmic logicaldisk get Description,DeviceID 
Description   DeviceID 
Local Fixed Disk C: 
Local Fixed Disk D: 
CD-ROM Disk   E: 
Removable Disk  G: 

Le fichier batch ci-dessous utilisent cette méthode pour identifier les lecteurs qui sont HDD:

@echo off 

for /F "tokens=1-4" %%a in ('wmic logicaldisk get Description^,DeviceID') do (
    if "%%a %%b %%c" equ "Local Fixed Disk" (
     echo Drive %%d is a HDD 
    ) 
) 

Par exemple:

C:\> test.bat 
Drive C: is a HDD 
Drive D: is a HDD 

EDIT: Deux nouveau disque méthodes d'identification ajoutées

Il semble que la méthode précédente ne soit pas fiable dans tous les cas.Ci-dessous, il y a deux nouvelles méthodes plus précises: une positive qui vérifie si un disque dur est un disque dur basé sur LogicalDisk/DriveType = 3, et une négative qui vérifie si un disque donné est pas un un disque dur basé sur le nombre de partitions que les disques IDE ont (diskdrive/InterfaceType = IDE):

@echo off 

echo Drive type identification using LogicalDisk/DriveType=3: 
for /F "tokens=1-2" %%a in ('wmic LogicalDisk get DeviceID^,DriveType') do (
    if "%%b" equ "3" (
     echo Drive %%a is a HDD 
    ) 
) 

echo/ 
echo Drive type identification using DiskDrive/InterfaceType=IDE: 
set partitions=0 
for /F "tokens=1-2" %%a in ('wmic DiskDrive get InterfaceType^,Partitions') do (
    if "%%a" equ "IDE" set /A partitions+=%%b 
) 
set drives=BCDEFGHIJKLMNOPQRSTUVWXYZ 
call set lastIDEdrive=%%drives:~%partitions%,1%%: 
echo Last IDE interface logical drive (B:=none): %lastIDEdrive% 
for /F %%a in ('wmic LogicalDisk get DeviceID') do (
    if "%%a" gtr "%lastIDEdrive%" (
     echo Drive %%a is NOT a HDD 
    ) 
) 

Par exemple:

C:\> test.bat 
Drive type identification using LogicalDisk/DriveType=3: 
Drive C: is a HDD 
Drive D: is a HDD 

Drive type identification using DiskDrive/InterfaceType=IDE: 
Last IDE interface logical drive (B:=none): F: 
Drive G: is NOT a HDD 
+1

Cela fait-il la différence entre un disque dur et un disque SSD? Je ne pense pas qu'il soit réellement possible de dire de façon fiable de la lecture que j'ai faite. – foxidrive

+0

@foxidrive: Comme je comprends la demande, l'OP veut faire quelque chose _seulement si le disque est HDD_, donc il n'est pas nécessaire d'identifier si le disque est un SSD (ou un CD-ROM, etc.). Bien sûr, seul le PO peut effacer ce point, mais même dans ce cas, je pense que le seul cas où 'wmic' rapporte un" Disque amovible "est quand il s'agit d'un SSD. – Aacini

+0

L'OP veut défragmenter les disques, sauf les modèles SSD. Il a donc besoin d'identifier si la lettre de lecteur est un SSD. – foxidrive

4

Réponse courte: il n'y a pas de manière fiable.

Réponse longue:

La question "Is there any way of detecting if a drive is a SSD" propose quelques heuristiques, mais aucun d'entre eux semble fiable.

Cette question a également été posée on Lockergnome, mais sur mon système, je ne peux pas dire à mon SSD à partir d'un disque dur en exécutant MSInfo32. La réponse est de rechercher le modèle de disque et de google pour cela. Ce n'est probablement pas ce que vous voulez faire à partir d'un fichier batch.

Ce post on the OCZ forum suggère de rechercher une rotation de 0. Mais comme Flimm commented, il ment parfois.

Un Wordpress blog post suggère d'utiliser le taux de transfert de lecture aléatoire, mais encore une fois, c'est heuristique. Un système RAID peut échapper à cette détection.

-

Mise à jour concernant la réponse de @Aacini, ce qui prouve que cela ne fonctionne pas:

Les rapports de script:

D:\>test-hdd.bat 
Drive type identification using LogicalDisk/DriveType=3: 
Drive C: is a HDD 
Drive D: is a HDD 
Drive E: is a HDD 
Drive F: is a HDD 

Drive type identification using DiskDrive/InterfaceType=IDE: 
Last IDE interface logical drive (B:=none): F: 
Drive G: is NOT a HDD 

Situation réelle:

Drive C: is a SSD (logical partition 1 of SSD 1) 
Drive D: is a SSD (logical partition 2 of SSD 1) 
Drive E: is a SSD (only partition of SSD 2) 
Drive F: is a HDD 
Drive G: is NOT a HDD (it's a USB stick) 
2

smartmontools est un outil puissant de ligne de commande, vous pouvez utiliser sur lot

http://sourceforge.net/projects/smartmontools/?source=directory

c:\>smartctl -i sda 
smartctl 6.4 2015-06-04 r4109 [x86_64-w64-mingw32-win7-sp1] (sf-6.4-1) 
Copyright (C) 2002-15, Bruce Allen, Christian Franke, www.smartmontools.org 

=== START OF INFORMATION SECTION === 
Model Family:  HGST Travelstar 5K1000 


User Capacity: 1,000,204,886,016 bytes [1.00 TB] 
Sector Sizes:  512 bytes logical, 4096 bytes physical 
Rotation Rate: 5400 rpm 
Form Factor:  2.5 inches 
Device is:  In smartctl database [for details use: -P show] 
ATA Version is: ATA8-ACS T13/1699-D revision 6 
SATA Version is: SATA 2.6, 6.0 Gb/s (current: 3.0 Gb/s) 
Local Time is: Thu Oct 22 20:27:40 2015 
SMART support is: Available - device has SMART capability. 
SMART support is: Enabled 

c:\>smartctl -i sdb 
smartctl 6.4 2015-06-04 r4109 [x86_64-w64-mingw32-win7-sp1] (sf-6.4-1) 
Copyright (C) 2002-15, Bruce Allen, Christian Franke, www.smartmontools.org 

=== START OF INFORMATION SECTION === 

Sector Size:  512 bytes logical/physical 
Rotation Rate: Solid State Device 
Device is:  In smartctl database [for details use: -P show] 

SATA Version is: SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s) 
Local Time is: Thu Oct 22 20:28:01 2015 
SMART support is: Available - device has SMART capability. 
SMART support is: Enabled 

→ _ → SSD:

c:\>smartctl -a c: 
smartctl 6.4 2015-06-04 r4109 [i686-w64-mingw32-win7(64)-sp1] (sf-6.4-1) 
Copyright (C) 2002-15, Bruce Allen, Christian Franke, www.smartmontools.org 

=== START OF INFORMATION SECTION === 
Model Family:  SandForce Driven SSDs 
Device Model:  KINGSTON SV300S37A120G 

User Capacity: 120,034,123,776 bytes [120 GB] 
Sector Size:  512 bytes logical/physical 
Rotation Rate: Solid State Device 
2

j'ai écrit le code javascript suivant. J'avais besoin de savoir si j'avais un disque SSD et si c'était le disque de démarrage.

function main() 
{ 
    var retval= false; 
    // MediaType - 0 Unknown, 3 HDD, 4 SSD 
    // SpindleSpeed - -1 has rotational speed, 0 has no rotational speed (SSD) 
    // DeviceID - 0 boot device 
    var objWMIService = GetObject("winmgmts:\\\\.\\root\\Microsoft\\Windows\\Storage"); 
    var colItems = objWMIService.ExecQuery("select * from MSFT_PhysicalDisk"); 
    var enumItems = new Enumerator(colItems); 
    for (; !enumItems.atEnd(); enumItems.moveNext()) 
    { 
     var objItem = enumItems.item(); 
     if (objItem.MediaType == 4 && objItem.SpindleSpeed == 0) 
     { 
      if (objItem.DeviceID == 0) 
      { 
       retval=true; 
      } 
     } 
    } 
    if (retval) 
    { 
     WScript.Echo("You have SSD Drive and it is your boot drive."); 
    } 
    else 
    { 
     WScript.Echo("You do not have SSD Drive"); 
    } 
    return retval; 
} 

main(); 
Questions connexes