gpt4 book ai didi

powershell - Powershell-检测驱动器号是否已安装在SSD固态磁盘上

转载 作者:行者123 更新时间:2023-12-03 01:16:22 25 4
gpt4 key购买 nike

我正在编写一个Hyper-V VM构建脚本,并希望添加一个功能来选择SSD,以便在可能时对较小且最常用的VM进行优先级排序。我首先从这里的脚本专家那里找到了方法:http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/17/powertip-use-powershell-to-identify-ssd.aspx,但是我找不到所有的方法,因此我使用WBEMTEST查找查询所需的类以建立SSD磁盘和驱动器之间的连接。有问题的信。

单击开始->运行->键入WBEMTEST->检查 namespace 是否设置为root \ cimv2,然后单击连接->枚举类->递归->确定。大约5秒钟后,列表将完全填充,您可以单击列表项。单击一个列表项,然后按字母W跳到Win32并找到要查看的字母,然后单击“添加”。然后显示了可用的属性和方法。

假设制造商在设备名称中插入了SSD字母,则下面的IsSSDDrive函数将根据给定的驱动器字母(包括冒号-例如C :)是否安装在固态硬盘(SSD)上,返回$ True或$ False。这种假设最终使该方法不可靠,因此明智的做法是包含一些代码以使用以下方法进行交叉检查:

$DiskScore = (Get-WmiObject -Class Win32_WinSAT).DiskScore
If ($DiskScore -gt 6.9) { $SystemHasSSDDrive=$True } Else { $SystemHasSSDDrive=$False }
Write-Host "System Has SSD Drive: $SystemHasSSDDrive"

...如果您的环境使用此类驱动器。
Function IsSSDDrive($Drive)
# Returns $True or $False depending on whether the given drive letter (including colon - e.g. C:) is mounted on a Solid State Disk (SSD) - assuming that the manufacturer inserted the letters SSD into the device name - which ultimately makes this method unreliable so beware to cross check using something like $DiskScore = (Get-WmiObject -Class Win32_WinSAT).DiskScore # Thanks to Rens Hollanders for this! http://renshollanders.nl/2013/01/sccm-mdt-identifying-ssds-from-your-task-sequence-by-windows-performance-index/
{
[array] $SSDDeviceIDList = $Null
[array] $SSDDeviceIDListF = $Null
[array] $DDListF = $Null
[array] $SSDDriveLetters = $Null

# Build a list of DeviceIDs of disk drives that contain the string SSD. Example output: \\.\PHYSICALDRIVE0, \\.\PHYSICALDRIVE1 etc
$SSDDeviceIDList = Get-WmiObject Win32_DiskDrive | where { $_.model -match 'SSD'} | Select 'DeviceID'
#$SSDDeviceIDList

# Fix the list by removing the \\.\ from each of the obtained \\.\PHYSICALDRIVEx values
ForEach ($SSDDeviceID in $SSDDeviceIDList) {
$SSDDeviceIDListF += $SSDDeviceID.DeviceID.ToString().Replace("\\.\","")
}
#$SSDDeviceIDListF

# Obtain disk drive to disk partition mapping information. Section of sample output for a single partition:
#Antecedent : \\MyComputerName\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE1"
#Dependent : \\MyComputerName\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #2"
$DDList1 = $null ; $DDList1 = Get-WmiObject Win32_DiskDriveToDiskPartition
# Look at each partition
ForEach ($Disk in $DDList1) {
# Iterate through the previously collected list of filtered (SSD in the name) hard drives
ForEach ($SSDDeviceID in $SSDDeviceIDListF) {
# If the partition is found with a property that matches the deviceID of the known-SSD list, then add the partition dependent information to the filtered (SSD) list of disk drives (DDListF)
If ($Disk.Antecedent.Contains($SSDDeviceID)) { $DDListF += $Disk.Dependent.Split([Char]34)[1] }
}
}
#$DDListF

# Obtain disk drive to disk partition mapping information. We need to do this because the drive letter attribute is not present in Win32_DiskDriveToDiskPartition and the physical disk is not present in Win32_LogicalDiskToPartition.
# Section of sample output for a single partition:
# Antecedent : \\MyComputerName\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #2"
# Dependent : \\MyComputerName\root\cimv2:Win32_LogicalDisk.DeviceID="I:"
$LDPList = Get-WmiObject Win32_LogicalDiskToPartition
# Look at each existing partition (on all drives)
ForEach ($Partition in $LDPList) {
# Iterate through the list of filtered SSD partitions
ForEach ($DDL in $DDListF) {
# If the disk-partition information from the SSD filtered list is found in the current partition then add the current partition's drive letter to the list of SSD drive letters
If ($Partition.Antecedent.Contains($DDL)) { $SSDDriveLetters += $Partition.Dependent.Split([Char]34)[1] }
}
}
$IsSSD = $False
If (!($SSDDriveLetters -eq $Null)) {
ForEach ($Item in $SSDDriveLetters) {
If ($Drive.ToUpper() -eq $Item.ToUpper()) {
$IsSSD = $True
break
}
}
}
Return $IsSSD
}

$d = IsSSDDrive "D:" # Returns True if the given drive letter resides on a disk with a name containing the letters SSD.
$d

$c = IsSSDDrive "C:"
$c

最佳答案

这是主题的一种转折,以防您需要它。
此函数返回一个SSD驱动器号数组-如果找到的话

Function GetSSDDriveLetters()
# Returns an array of SSD drive letters - if any are found - assuming that the manufacturer inserted the letters SSD into the device name - which ultimately makes this method unreliable so beware to cross check using something like $DiskScore = (Get-WmiObject -Class Win32_WinSAT).DiskScore # Thanks to Rens Hollanders for this! http://renshollanders.nl/2013/01/sccm-mdt-identifying-ssds-from-your-task-sequence-by-windows-performance-index/
# http://stackoverflow.com/questions/28731401/powershell-detect-if-drive-letter-is-mounted-on-a-ssd-solid-state-disk/28731402#28731402
{
[array] $SSDDeviceIDList = $Null
[array] $SSDDeviceIDListF = $Null
[array] $DDListF = $Null
[array] $SSDDriveLetters = $Null

# Build a list of DeviceIDs of disk drives that contain the string SSD. Example output: \\.\PHYSICALDRIVE0, \\.\PHYSICALDRIVE1 etc
$SSDDeviceIDList = Get-WmiObject Win32_DiskDrive | where { $_.model -match 'SSD'} | Select 'DeviceID'
#$SSDDeviceIDList

# Fix the list by removing the \\.\ from each of the obtained \\.\PHYSICALDRIVEx values
ForEach ($SSDDeviceID in $SSDDeviceIDList) {
$SSDDeviceIDListF += $SSDDeviceID.DeviceID.ToString().Replace("\\.\","")
}
#$SSDDeviceIDListF

# Obtain disk drive to disk partition mapping information. Section of sample output for a single partition:
#Antecedent : \\MyComputerName\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE1"
#Dependent : \\MyComputerName\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #2"
$DDList1 = $null ; $DDList1 = Get-WmiObject Win32_DiskDriveToDiskPartition
# Look at each partition
ForEach ($Disk in $DDList1) {
# Iterate through the previously collected list of filtered (SSD in the name) hard drives
ForEach ($SSDDeviceID in $SSDDeviceIDListF) {
# If the partition is found with a property that matches the deviceID of the known-SSD list, then add the partition dependent information to the filtered (SSD) list of disk drives (DDListF)
If ($Disk.Antecedent.Contains($SSDDeviceID)) { $DDListF += $Disk.Dependent.Split([Char]34)[1] }
}
}
#$DDListF

# Obtain disk drive to disk partition mapping information. We need to do this because the drive letter attribute is not present in Win32_DiskDriveToDiskPartition and the physical disk is not present in Win32_LogicalDiskToPartition.
# Section of sample output for a single partition:
# Antecedent : \\MyComputerName\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #2"
# Dependent : \\MyComputerName\root\cimv2:Win32_LogicalDisk.DeviceID="I:"
$LDPList = Get-WmiObject Win32_LogicalDiskToPartition
# Look at each existing partition (on all drives)
ForEach ($Partition in $LDPList) {
# Iterate through the list of filtered SSD partitions
ForEach ($DDL in $DDListF) {
# If the disk-partition information from the SSD filtered list is found in the current partition then add the current partition's drive letter to the list of SSD drive letters
If ($Partition.Antecedent.Contains($DDL)) { $SSDDriveLetters += $Partition.Dependent.Split([Char]34)[1] }
}
}
Return $SSDDriveLetters
}

GetSSDDriveLetters

关于powershell - Powershell-检测驱动器号是否已安装在SSD固态磁盘上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28731401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com