L'uso di Diskpart in uno script di PowerShell non consente allo script di riutilizzare la lettera di unità


8

Ho creato uno script che monta (allega) un disco rigido virtuale usando Diskpart , pulisce alcuni file di sistema e quindi smonta (stacca). Utilizza un ciclo foreach e si suppone che pulisca più dischi rigidi virtuali usando la stessa lettera di unità. Tuttavia, dopo il 1 ° VHD non riesce. Ho anche notato che quando provo a collegare manualmente un disco rigido virtuale con diskpart, diskpart ha esito positivo, Disk Manager mostra il disco con la lettera di unità corretta, ma all'interno della stessa istanza PoSH non riesco a collegarmi (set-location) a quell'unità. Se eseguo un diskpart manuale quando apro PoSH per la prima volta, posso allegare e staccare tutto ciò che desidero e ottenere sempre la lettera dell'unità. C'è qualcosa che devo fare per ripristinare diskpart nello script? Ecco uno snippet dello script che sto usando.

function Mount-VHD {
         [CmdletBinding()]
         param (
                 [Parameter(Position=0,Mandatory=$true,ValueFromPipeline=$false)]
                         [string]$Path,
                 [Parameter(Position=1,Mandatory=$false,ValueFromPipeline=$false)]
                         [string]$DL,
                 [string]$DiskpartScript = "$env:SystemDrive\DiskpartScript.txt",
                 [switch]$Rescan
         )

         begin {
                 function InvokeDiskpart {
                         Diskpart.exe /s $DiskpartScript
                 }
                 ## Validate Operating System Version ##
                 if (Get-WmiObject win32_OperatingSystem -Filter "Version < '6.1'") {throw "The script operation requires at least Windows 7 or Windows Server 2008 R2."}
         }
         process{
                 ## Diskpart Script Content ## Here-String statement purposefully not indented ##
 @"
 $(if ($Rescan) {'Rescan'})
 Select VDisk File="$Path" `nAttach VDisk
 Exit
 "@ | Out-File -FilePath $DiskpartScript -Encoding ASCII -Force
                 InvokeDiskpart
 Start-Sleep -Seconds 3
 @"
 Select VDisk File="$Path"`nSelect partition 1 `nAssign Letter="$DL"
 Exit
 "@ | Out-File -FilePath $DiskpartScript -Encoding ASCII -Force
                 InvokeDiskpart
                         }
         end {
                 Remove-Item -Path $DiskpartScript -Force ; ""
                 Write-Host "The VHD ""$Path"" has been successfully mounted." ; ""
         }
 }
 function Dismount-VHD {
         [CmdletBinding()]
         param (
                 [Parameter(Position=0,Mandatory=$true,ValueFromPipeline=$false)]
                         [string]$Path,
                 [switch]$Remove,
                 [switch]$NoConfirm,
                 [string]$DiskpartScript = "$env:SystemDrive\DiskpartScript.txt",
                 [switch]$Rescan
         )

         begin {
                 function InvokeDiskpart {
                         Diskpart.exe /s $DiskpartScript
                 }

                 function RemoveVHD {
                         switch ($NoConfirm) {
                                 $false {
                                         ## Prompt for confirmation to delete the VHD file ##
                                         "" ; Write-Warning "Are you sure you want to delete the file ""$Path""?"
                                         $Prompt = Read-Host "Type ""YES"" to continue or anything else to break"
                                         if ($Prompt -ceq 'YES') {
                                                 Remove-Item -Path $Path -Force
                                                 "" ; Write-Host "VHD ""$Path"" deleted!" ; ""
                                         } else {
                                                 "" ; Write-Host "Script terminated without deleting the VHD file." ; ""
                                         }
                                 }
                                 $true {
                                         ## Confirmation prompt suppressed ##
                                         Remove-Item -Path $Path -Force
                                         "" ; Write-Host "VHD ""$Path"" deleted!" ; ""
                                 }
                         }
                 }
                 ## Validate Operating System Version ##
                 if (Get-WmiObject win32_OperatingSystem -Filter "Version < '6.1'") {throw "The script operation requires at least Windows 7 or Windows Server 2008 R2."}
         }
         process{
         ## DiskPart Script Content ## Here-String statement purposefully not indented ##
 @"
 $(if ($Rescan) {'Rescan'})
 Select VDisk File="$Path"`nDetach VDisk
 Exit
 "@ | Out-File -FilePath $DiskpartScript -Encoding ASCII -Force
                 InvokeDiskpart
                 Start-Sleep -Seconds 10
         }
         end {
                 if ($Remove) {RemoveVHD}
                 Remove-Item -Path $DiskpartScript -Force ; ""
         }
 }

Tre giorni e ancora nessuna risposta. Qualcuno ha qualche idea? Questo sta creando un grande ritardo in un progetto che ho
Kyle

Su quale sistema operativo stai eseguendo questo script? Lo chiedo principalmente perché l'8/2012 ha i cmdlet di montaggio / smontaggio VHD integrati. È necessario un assegno per richiedere 7 / 2008R2 ma non un massimo.
MikeBaz - MSFT,

Risposte:


1

Non riesco a vedere il punto esatto in cui il tuo script non riesce, tuttavia il test Set-Location che menzioni mi ricorda un problema che ho avuto in PoSH quando ho provato a mappare / annullare la mappa / mappare ripetutamente le posizioni in uno script.

/programming/10994979/net-use-only-works-once-in-powershell

In breve uso FILESYSTEM::X:\

invece di X:\

EDIT: Ok, quindi ho effettivamente trascorso 30 secondi a leggere la tua sceneggiatura. metterei

$Path = FILESYSTEM::$Path

Al di ogni funzione.


0

So che questa non è direttamente una risposta ma hai provato a non montarla su una lettera di unità? Usa assign mount=<PATH>invece l' opzione e rig il tuo script più pulito per lavorare in quella sottodirectory.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.