3

論理ドライブが USB か iSCSI ターゲットかをチェックするスクリプトをまとめています。関連付けられているドライブ文字を無視する場合。

Get-WmiObject win32_logicaldisk -Filter "DriveType='3'" |
where-object{$_.DeviceID -ne $usbletters -and $_.DeviceID -ne $iSCSIletters} | %
{$_.Name} | out-file $kreports\avail.txt

私の問題は、同じタイプの複数のドライブが検出された場合、それらが等しくないオプションによって単純に無視されることです。なんらかの形式の foreach ループを実行する必要があると思いますか?

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです!

これが完全なスクリプトです。

#Variables and Arguments
$kreports = "C:\Kworking\reports"


# Create kworking Reports folder
if (!(Test-Path -path $kreports))
{New-Item $kreports -type directory}


# USB Drive check
$diskdrive = gwmi win32_diskdrive | ?{$_.interfacetype -eq "USB"}
$usbletters = $diskdrive | %{gwmi -Query "ASSOCIATORS OF 
{Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE

AssocClass = Win32_DiskDriveToDiskPartition"} | %{gwmi -Query "ASSOCIATORS

OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass =

Win32_LogicalDiskToPartition"} | %{$_.DeviceID}

# iSCSI Drive check
$iSCSIdrive = gwmi win32_diskdrive | ?{$_.model -match "iSCSI"}
$iSCSIletters = $iSCSIdrive | %{gwmi -Query "ASSOCIATORS OF 
{Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE

AssocClass = Win32_DiskDriveToDiskPartition"} | %{gwmi -Query "ASSOCIATORS

OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass =

Win32_LogicalDiskToPartition"} | %{$_.DeviceID}


# Disk Information
Get-WmiObject win32_logicaldisk -Filter "DriveType='3'" | where-object{$_.DeviceID -ne
$usbletters -and $_.DeviceID -ne $iSCSIletters} | %{$_.Name} | out-file
$kreports\avail.txt


# Fix Output Line Spacing
$InputFile = "$kreports\avail.txt"
$OutputFile = "$kreports\availdisks.txt"

$Writer = New-Object IO.StreamWriter "$OutputFile"
$Writer.Write( [String]::Join("`r`n", $(Get-Content $InputFile)) )
$Writer.Close()
4

1 に答える 1

3

問題は、Win32_LogicalDiskのメンバーDeviceIDにドライブ文字とコロンが含まれていることです。たとえば、値が で、C:に対して等しいかどうかをテストするとCwhere-objectは何も検出しません。

ドライブ文字にコロンを含めるか、Powershell の方法で正規表現を使用します。

$disks = gwmi win32_logicaldisk -Filter "DriveType='3'"
# Select all devices that do not have deviceids a,b,c,k or l, followed by colon
$avail = $disks | ? { $_.DeviceID -notmatch "[abckl]:"}
# Do something with filtered results
于 2012-11-21T06:51:15.620 に答える