2012-01-22 6 views
1

Как связать unmounted томов с физическими дисками?Обнаружение несмонтированных томов на выбранном диске с помощью PowerShell WMI или Diskpart

Скажем, мне нужно найти и смонтировать размонтированные тома на диске 3 с нумерацией Diskpart или WMIC или PowerWhell WMI. Как узнать, с помощью скрипта, какие объемы диска 3 не установлены? Или, альтернативно, на каком физическом диске находится данный размонтированный том (без DriveLetter)?

Когда громкость размонтирована, для нее не существует логического диска или точки монтирования. Я полагаю, что отношение можно найти с помощью метода GetRelated, но я не могу найти такой пример кода, подходящий для задачи.

ответ

0

интегрировать этот код в ответ выше:

strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 

Set colItems = objWMIService.ExecQuery _ 
    ("Select * From Win32_Volume Where Name = 'D:\\'") 

For Each objItem in colItems 
    objItem.AddMountPoint("W:\\Scripts\\") 
Next 

Он выглядит в Windows 7 PowerShell с помощью Volume DeviceID вместо его Буква_диска и связывающего объем на диск 3, как показано выше ответ. Аналогичный подход (AddMountPoint или Mount) можно использовать, как указано выше, но без использования Diskpart.

+0

[Переполнение стека не форум] (http://meta.stackexchange.com/a/92115). Я думаю, что лучше дать свой собственный полный ответ и подтвердить другой ответ в комментариях. –

2

Дайте этому попытку, это будет:

  • Получить все несмонтированные разделы для данного индекса диска $targetDisk с помощью WMI
  • Mount обнаруженных разделы на целевой диск на следующую свободную букву диска, используя DiskPart скрипт.

Использование метода GetRelated предназначено для того, чтобы узнать, что вам нужно с этим делать. Это помогает узнать, что класс WMI представляет то, что вы ищете Win32_DiskPartition. В вашем случае вы хотите найти разделы, которые не связаны с логическим диском (unmounted), поэтому мы ищем экземпляры Win32_DiskPartition, у которых нет связанных Win32_LogicalDisk.

Поскольку вам нужны только тома, которые не монтируются на конкретном физическом диске, нам необходимо дополнительно связать классы. Для этого нам нужно получить Win32_DiskPartition, связанный с экземпляром Win32_DiskDrive.

$targetDisk = 3 

$unmounted = gwmi -class win32_DiskPartition | ? { 
    ($_.GetRelated('Win32_LogicalDisk')).Count -eq 0 
} 

if ($unmounted) { 
    $commands = @() 
    $unmounted | ? { $_.GetRelated('Win32_DiskDrive') | ? { $_.Index -eq $targetDisk} } | % { 
     $commands += "select disk {0}" -f $_.DiskIndex 
     $commands += "select partition {0}" -f ($_.Index + 1) 
     $commands += "assign" 
    } 

    $tempFile = [io.path]::GetTempFileName() 
    $commands | out-file $tempFile -Encoding ASCII 

    $output = & diskpart.exe /s $tempFile 2>&1 
    if ($LASTEXITCODE -ne 0) { 
     Write-Error $output 
    } 
} 
+0

Спасибо, Энди! Ясный и полезный. Почему вы предпочитаете использовать Diskpart для монтирования несмонтированных томов? Можно ли использовать WMI для этого (например, Add Mount) - если да, можете ли вы дать пример сценария? – sambul35

+0

@ sambul35 Я немного поработал над тем, как это сделать, и не нашел то, что искал, поэтому решил уладить диск. Вероятно, это просто не собирался тратить весь день. –

+0

@ sambul35 Также я использовал XP, поэтому некоторые классы WMI были недоступны, например Win32_Volume. –