Как роботизировать виртуальные жесткие диски, пропуская те, которые используются? - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь скопировать набор виртуальных жестких дисков, пропуская те, которые используются.

С этой целью я пытаюсь создать список всех виртуальных жестких дисков, которые не используются. Если виртуальный жесткий диск не используется, я смогу запустить Get-VHD и проверить, что свойство .Attached имеет значение false. Если VHD используется, я получаю следующую ошибку:

Get-VHD Getting the mounted storage instance for the path <VHD-Path> failed.
The operation cannot be performed while the object is in use.
CategoryInfo: ResourceBusy: (:) [Get-VHD], VirtualizationException
FullyQualifiedErrorID: ObjectInUse,Microsoft.Vhd.PowerShell.Cmdlets.GetVHD

Я планирую использовать try-catch, чтобы определить, какие VHD используются, создать список их имен файлов, а затем передать его до опции robocopy /xf. Для этого следующий код должен выводить имена всех используемых виртуальных жестких дисков на консоль:

$VHDLocation = "\\server\share"
$VHDs = Get-Children -Path $VHDLocation -Include "*.vhd" -Recurse

$VHDs | ForEach-Object {
try { Get-VHD ($VHDLocation + "\" + $_)).Attached }
catch { Write-Output $_ }}

Однако, когда я запускаю его, Powershell выводит «False» для виртуальных жестких дисков, которые не используются, и ошибка "объект в использовании" для используемых виртуальных жестких дисков. Кажется, что try-catch игнорируется в пользу просто запуска команды Get-VHD.

Что-то не так с приведенным выше кодом, или я не в курсе, как выполнить sh это задача в целом?

1 Ответ

1 голос
/ 25 апреля 2020

Не проверено, но я думаю, что ваш код отсутствует -ErrorAction Stop в блоке try. Без этого при Get-VHD успешных вызовах будет выведено значение свойства Attached, которое равно либо $true, либо $false.
. Также, внутри блока catch, $_ automati c переменная больше не представляет элемент из ForEach-Object l oop, а скорее выбрасывает исключение .

Попробуйте:

$VHDLocation = "\\server\share"
$VHDs = Get-Children -Path $VHDLocation -Include "*.vhd" -Recurse

# try and get an array of unattached VHD full file names
$unAttached = foreach($vhd in $VHDs) {
    try { 
        # ErrorAction Stop ensures exceptions are being handled in the catch block
        $disk = $vhd | Get-VHD -ErrorAction Stop
        # if you get here, the Get-VHD succeeded, output if Attached is False
        if (!($disk.Attached)) { $vhd.FullName }
    }
    catch {
        # exception is thrown, so VHD must be in use; output this VHD object
        # inside a catch block, the '$_' automatic variable represents the exception
        $vhd.FullName
    }
}

Надеюсь, что поможет

...