Обнаружение несмонтированных томов на выбранном диске с помощью PowerShell WMI или Diskpart - PullRequest
1 голос
/ 22 января 2012

Как связать несмонтированные тома с физическими дисками?

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

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

Ответы [ 2 ]

2 голосов
/ 22 января 2012

Попробуйте, это будет:

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

Использование метода GetRelated - это знание того, что вам нужно связать. Это помогает узнать, какой класс WMI представляет то, что вы ищете Win32_DiskPartition. В вашем случае вы хотите найти разделы, которые не связаны с логическим диском (размонтированы), поэтому мы ищем экземпляры 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 голосов
/ 19 июля 2016

Интегрируйте этот код в приведенный выше ответ:

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 вместо его DriveLetter и связывая Volume с диском 3, как показано в ответе выше.Аналогичный подход (AddMountPoint или Mount) можно использовать, как указано выше, но без использования Diskpart.

...