PDA

View Full Version : [batch] Comando per distinguere HDD da SSD


23Andrea
08-12-2023, 10:57
Ciao.
Comoscete un comando da prompt (cmd.exe) per distinguere il tipo di disco installato sul PC: HDD o SSD?
Ho provato con

WMIC logicaldisk get DriveType

che restituisce il valore 3 in entrambi i casi, e

WMIC DISKDRIVE get MediaType

che restituisce il valore "Fixed hard disk media" in entrambi i casi.
Qualche idea?
Grazie.

P.S.
Il comando da PowerShell Get-PhysicalDisk restituisce un messaggio di errore:

Termine 'Get-PhysicalDisk' non riconosciuto come nome di cmdlet, funzione, programma eseguibile o file script. Controll
are l'ortografia del nome o verificare che il percorso sia incluso e corretto, quindi riprovare.
In riga:1 car:17
+ Get-PhysicalDisk <<<<
+ CategoryInfo : ObjectNotFound: (Get-PhysicalDisk:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

:muro:

x_Master_x
10-12-2023, 08:12
Che OS usi? Get-PhysicalDisk è per Windows 8 e superiori

23Andrea
26-12-2023, 13:48
Che OS usi? Get-PhysicalDisk è per Windows 8 e superiori

Infatti...Windows 7 ha Powershell 2.0 :doh:
Ho installato Microsoft .NET Framework 3.0 (KB2506143) e ora la mia Powershell è alla versione

Name Value
---- -----
PSVersion 3.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.18034
BuildVersion 6.2.9200.16398
PSCompatibleVersions {1.0, 2.0, 3.0}
PSRemotingProtocolVersion 2.2


Però il comando non funziona lo stesso :cry:
C'è da attivare/configurare/smanettare qualcosa?
Grazie.

x_Master_x
26-12-2023, 15:54
Ripeto, non è disponibile per Windows 7, solo Windows 8 e superiori.
Puoi provare una cosa del genere:

Get-WmiObject Win32_DiskDrive | Where-Object { $_.model -match "SSD" }

23Andrea
27-12-2023, 14:26
Ripeto, non è disponibile per Windows 7, solo Windows 8 e superiori.

Quindi, anche installando una versione superiore, per esempio 4.0
https://devblogs.microsoft.com/scripting/weekend-scripter-install-powershell-4-0-in-windows-7/
non c'è speranza?


Puoi provare una cosa del genere:

Get-WmiObject Win32_DiskDrive | Where-Object { $_.model -match "SSD" }


PS> Get-WmiObject Win32_DiskDrive

Partitions : 4
DeviceID : \\.\PHYSICALDRIVE0
Model : WD WD10JPCX-24UE4T0 SCSI Disk Device
Size : 1000202273280
Caption : WD WD10JPCX-24UE4T0 SCSI Disk Device

Questo è il mio PC, che ha un HDD.
Purtroppo, non sempre il modello contiene la stringa "SSD", anche se il PC monta una memoria a stato solido.

23Andrea
27-12-2023, 14:51
Credo che il comando che cerco (Get-PhysicalDisk) sia compreso nel modulo "Storage"
https://learn.microsoft.com/en-us/powershell/module/storage/?view=windowsserver2022-ps
che non c'è sul mio PC
PS > Get-Module -ListAvailable


Directory: C:\Windows\system32\WindowsPowerShell\v1.0\Modules


ModuleType Name ExportedCommands
---------- ---- ----------------
Manifest AppLocker {Set-AppLockerPolicy, Get-AppLockerPolicy, Test-AppLockerPolicy, Get-...
Manifest BitsTransfer {Add-BitsFile, Remove-BitsTransfer, Complete-BitsTransfer, Get-BitsTr...
Manifest CimCmdlets {Get-CimAssociatedInstance, Get-CimClass, Get-CimInstance, Get-CimSes...
Script ISE {New-IseSnippet, Import-IseSnippet, Get-IseSnippet}
Manifest Microsoft.PowerShell.Diagnostics {Get-WinEvent, Get-Counter, Import-Counter, Export-Counter...}
Manifest Microsoft.PowerShell.Host {Start-Transcript, Stop-Transcript}
Manifest Microsoft.PowerShell.Management {Add-Content, Clear-Content, Clear-ItemProperty, Join-Path...}
Manifest Microsoft.PowerShell.Security {Get-Acl, Set-Acl, Get-PfxCertificate, Get-Credential...}
Manifest Microsoft.PowerShell.Utility {Format-List, Format-Custom, Format-Table, Format-Wide...}
Manifest Microsoft.WSMan.Management {Disable-WSManCredSSP, Enable-WSManCredSSP, Get-WSManCredSSP, Set-WSM...
Script PSDiagnostics {Disable-PSTrace, Disable-PSWSManCombinedTrace, Disable-WSManTrace, E...
Binary PSScheduledJob {New-JobTrigger, Add-JobTrigger, Remove-JobTrigger, Get-JobTrigger...}
Manifest PSWorkflow {New-PSWorkflowExecutionOption, New-PSWorkflowSession, nwsn}
Manifest PSWorkflowUtility Invoke-AsWorkflow
Manifest TroubleshootingPack {Get-TroubleshootingPack, Invoke-TroubleshootingPack}

x_Master_x
28-12-2023, 09:39
Ti va bene anche un eseguibile a cui passi l'unità e ti risponde se è SSD o HDD?

23Andrea
28-12-2023, 14:27
Può darsi ...:confused:

x_Master_x
06-01-2024, 20:14
isSSD (https://www.sendspace.com/file/ddegr5)

Password:
hwupgrade.it

Utilizzo da CMD:
isSSD.exe C:\

Ti restituisce 1 se l'unità indicata è SSD, 0 se è HDD, non restituisce nulla in caso di errore. Compilato e testato su Windows 7

Schilo
08-01-2024, 18:10
Sono metodi non infallibili, anche per Windows 8 e superiori.
Ad es. il mio PC ha un SSD interno e 2 dischi meccanici USB +chiavetta USB:
PS C:\> Get-PhysicalDisk | select DeviceId,FriendlyName,BusType,MediaType

DeviceId FriendlyName BusType MediaType
-------- ------------ ------- ---------
3 TOSHIBA External USB 3.0 USB Unspecified
0 Samsung SSD 850 PRO 256GB SATA SSD
1 WD My Book 25EE USB HDD
2 Samsung Flash Drive USB UnspecifiedIl disco Toshiba è un normalissimo HDD da 2,5" eppure Get-PhysicalDisk di PowerShell sbaglia.
Idem l'eseguibile isSSD qua sopra, che non restituisce nulla ("errore") per il Toshiba
(mostra il tipo corretto solo per gli altri due, ovvio non la chiavetta flash).

Tuttavia il deframmentatore di Windows 10, per esempio, non sbaglia ad identificare il tipo di disco:

https://i.ibb.co/x2kHLny/2024-01-08-1834.jpg (https://imgbb.com/)

x_Master_x
08-01-2024, 22:05
isSSD non ti restituisce nulla perché è un'unità esterna USB e non l'ho previsto, è un codice fatto in 5 minuti e non si parlava di dischi esterni :asd:

Schilo
16-01-2024, 14:22
Si può comunque provare a fare meglio, pur rimanendo in ambito AutoIt con cui è stato scritto isSSD.
Non ci sono troppe preclusioni in AutoIt tra dischi interni ed esterni (funzione DriveGetType (https://www.autoitscript.com/autoit3/docs/functions/DriveGetType.htm)).
Perciò propongo anche il mio script:
; MyIsSsd.au3
; Compilare con: Aut2exe /in MyIsSsd.au3

#include <AutoItConstants.au3>

; Check command line params
If $CmdLine[0] <> 1 Then
Exit 3
EndIf

; Drive letter to check is the first parameter
$DriveLetter = $CmdLine[1]

; Get drive type and verify it exists
$type = DriveGetType($DriveLetter, $DT_DRIVETYPE)
If @error Then
Exit 2
Else
; Get SSD status (blank return is non-SSD)
$ssd = DriveGetType($DriveLetter, $DT_SSDSTATUS)
EndIf

; Return 1 if it is an SSD, otherwise 0
If $ssd = "SSD" Then
Exit 1
Else
Exit 0
EndIfIl codice è preso in larga parte dallo script di esempio pubblicato qui:
https://www.autoitconsulting.com/site/scripting/detect-an-ssd-disk-using-a-script/
Una volta ottenuto MyIsSsd.exe ho preparato un batch di test (TestMyIsSsd.cmd):
@echo off
MyIsSsd %1 %2
if errorlevel 3 (
echo Numero errato di parametri della linea di comando.
) else if errorlevel 2 (
echo Errore nel rilevamento del disco %1
) else if errorlevel 1 (
echo Disco %1 rilevato come SSD.
) else (
echo Disco %1 rilevato come non-SSD.
)Non sono stato a rifinirlo con fronzoli, tutto si può ovviamente migliorare.
Ho quindi fatto un test su un mio PC con 6 dischi disponibili, tra interni ed esterni:
c:\TEMP>for %d in (C: D: E: F: H: J: K:) do TestMyIsSsd %d

c:\TEMP>TestMyIsSsd C:
Disco C: rilevato come SSD.

c:\TEMP>TestMyIsSsd D:
Disco D: rilevato come non-SSD.

c:\TEMP>TestMyIsSsd E:
Disco E: rilevato come non-SSD.

c:\TEMP>TestMyIsSsd F:
Disco F: rilevato come SSD.

c:\TEMP>TestMyIsSsd H:
Disco H: rilevato come non-SSD.

c:\TEMP>TestMyIsSsd J:
Errore nel rilevamento del disco J:

c:\TEMP>TestMyIsSsd K:
Disco K: rilevato come non-SSD.Risultato per me più che soddisfacente, tenuto conto che:
C: è un SSD Samsung montato internamente su bus SATA;
D: è una pendrive USB;
E: è un masterizzatore CD/DVD/BD esterno USB;
F: è un SSD esterno USB (Samsung T7 Shield);
H: è un disco meccanico da 3.5" esterno USB (WD My Book);
J: non esiste proprio.... :D
K: è un disco meccanico da 2.5" esterno USB (Toshiba).

Non posso certo dire che sia universale o infallibile ma, almeno per i dischi che ho a disposizione al momento, sembra rispondere ai requisiti richiesti compresi quelli iniziali dell'OP. Da qui si può eventualmente prendere spunto per ampliare, migliorare e quant'altro di proprio gusto.