2014-11-23 2 views
0

В PowerShell я хочу написать дискеты (deviceid) из drivetype (здесь тип 2) в массив (переменная $letters). В driveletters должны быть отсортированы так:
$ букв = @ («а:», «б:») и т.д.Написание аппаратных средств диска на массив

В строке ниже я нашел отлично работает с win32_diskdrive, но я не могу добавить DriveType.

$letters = Get-WmiObject win32_diskdrive | 
    Where {$_.interfacetype -Like "USB"} | 
    ForEach {Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"} | 
    ForEach {Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition"} | 
    ForEach {$_.deviceid} 

Следующая строка ниже содержит Win32_LogicalDisk вместо win32_diskdrive, но я не могу получить чистый массив-вывода, как $letters = @("a:", "b:")

$letters = Get-WMIObject Win32_LogicalDisk -filter DriveType=2 | Select ($_.deviceid) 

дает

\\WIN7\root\cimv2:Win32_LogicalDisk.DeviceID="H:" 

Как я могу объединить drivetype с win32_diskdrive или как я могу получить только «H:» с Win32_LogicalDisk?

ответ

0

Вы не должны использовать $_ в своем Select-Object способом, которым он у вас есть. Вы просто поместите свойства, которые хотите вернуть. В вашем случае: DeviceID. Если вы просто хотите, чтобы строки с USB-устройств были близки.

$letters = Get-WMIObject Win32_LogicalDisk -filter DriveType=2 | Where-Object {$_.Size -gt 0} | Select -ExpandProperty deviceid 

-ExpandProperty deviceid просто возвращает массив строк вместо объекта со свойством DeviceID

Обновление от комментариев и другой ответ

Мы можем легко сделать небольшое обновление, чтобы убедиться, что вы получите диски с измеряемым размером. Мы учтем это, обращаясь к вашим другим ответам от -replace, которые не требуются, если вы переместите предложение where и обратите внимание на -ExpandProperty deviceid, я пытался показать вас раньше.

+0

Спасибо, он работает с вашей подсказкой хорошо с $ letters = Get-WMIObject Win32_LogicalDisk -filter DriveType = 2 | Select -Property deviceid Теперь я узнал, что он показывает также выталкиваемые, но все еще подключенные диски. Как показать только устройства с размером раздела (раздела)? – scriptinghomer

+0

Хорошо, найдите ответ byselfe: Get-WMIObject Win32_LogicalDisk -filter DriveType = 2 | Выберите -Интерфейс устройства, размер | где {$ _. size} – scriptinghomer

+0

@scriptinghomer см. мое обновление. – Matt

0

Это мое решение. Работает отлично.

$letters = Get-WMIObject Win32_LogicalDisk -filter DriveType=2 | Select -Property deviceid, size | where {$_.size -gt 0} 
$letters = $letters -replace '@{deviceid=' 
$letters = $letters -replace "size=" 
$letters = $letters -replace "}" 
$letters = $letters -replace "" 
$letters = $letters -replace '@{size=' 
$letters = $letters -replace '}' 
$letters = $letters -replace '@{size=' 
$letters = $letters -replace ';' 
$letters = $letters -replace '0' 
$letters = $letters -replace '1' 
$letters = $letters -replace '2' 
$letters = $letters -replace '3' 
$letters = $letters -replace '4' 
$letters = $letters -replace '5' 
$letters = $letters -replace '6' 
$letters = $letters -replace '7' 
$letters = $letters -replace '8' 
$letters = $letters -replace '9' 
$letters = $letters -replace ':' 
$letters = $letters -replace ' ' 

Возможно, это более простой способ заменить все эти вещи. Но это отлично работает для меня :-)

Смежные вопросы