我编写了此代码来计算磁盘容量,但是当我仅在笔记本电脑中使用SSD来运行它时,我会得到0GB。当我插入USB /外部空间后,它会计算ssd + USB。
$disk = Get-WmiObject Win32_DiskDrive
$capacity = 0;
for($i = 0;$i -lt $disk.Count; $i++){
$capacity = $capacity + [math]::round(($disk[$i].Size/1GB),2)
}
Write-Host $capacity "GB"
这很好-> $disk.Size
为什么我的for循环中不使用第一个[0]?
答案 0 :(得分:2)
我无法回答为什么for
循环在不观察环境的情况下失败的原因,但是几乎没有用例。您应该改为选择foreach
循环:
$capacity = foreach ($disk in Get-WmiObject -Class Win32_DiskDrive)
{
[Math]::Round(($disk.Size / 1GB), 2)
}
"$(($capacity | Measure-Object -Sum).Sum)GB"
答案 1 :(得分:0)
假设您没有提到Windows 10,因为Windows 10中的OS和CMDLETS更好。 *请参阅底部的Windows 7版本。
对于磁盘信息,我更喜欢使用Get-PhysicalDisk,例如:
$DiskInfo = foreach ($disk in Get-PhysicalDisk) {
[string]$name = $disk.FriendlyName
[string]$type = $disk.MediaType
[int]$capacity = $disk.size / 1GB
[pscustomobject]@{
"Type"=$type;
"Name"=$name;
"Capacity (GB)"=$capacity;
}
}
$DiskInfo
在我有一个SSD和一个机械HDD的环境中,它将返回:
Name Type Capacity (GB)
---- ---- -------------
SAMSUNG MZ7TY256HDHP-000L7 SSD 238
ST500LX025-1U717D HDD 466
例如,如果您想要有关SSD的信息,则可以执行以下操作:
$DiskInfo = foreach ($disk in Get-PhysicalDisk | Where-Object {$_.MediaType -eq "SSD"} ) {
[string]$name = $disk.FriendlyName
[string]$type = $disk.MediaType
[int]$capacity = $disk.size / 1GB
[pscustomobject]@{
"Type"=$type;
"Name"=$name;
"Capacity (GB)"=$capacity;
}
}
$DiskInfo
仅返回SSD:
Type Name Capacity (GB)
---- ---- -------------
SSD SAMSUNG MZ7TY256HDHP-000L7 238
说明:Foreach已连接磁盘,存储名称,介质类型和容量(以变量表示)。 *将字节容量除以1GB,以获得更好的数字。 仍在Foreach中,在每次迭代中创建一个包含3个变量的自定义对象。
将所有内容放在一起,然后可以输出包含所有对象的变量DiskInfo。
如果在Windows 7上无法使用媒体类型,则无法使用它。相反,您可以这样做:
$DiskInfo = foreach ($disk in Get-WmiObject -Class Win32_DiskDrive) {
[string]$name = $disk.model
[int]$capacity = $disk.size / 1GB
[pscustomobject]@{
"Name"=$name;
"Capacity (GB)"=$capacity;
}
}
$DiskInfo
这将返回类似的内容:
Name Capacity (GB)
---- -------------
SAMSUNG MZ7TY256HDHP-000L7 238
ST500LX025-1U717D 466