L'utilisation de Diskpart dans un script PowerShell ne permettra pas au script de réutiliser la lettre de lecteur

8

J'ai construit un script qui monte (attache) un disque dur virtuel à l' aide de Diskpart , nettoie certains fichiers système, puis le démonte (détache). Il utilise une boucle foreach et est supposé nettoyer plusieurs VHD en utilisant la même lettre de lecteur. Cependant, après le 1er VHD, il échoue. J'ai également remarqué que lorsque j'essaie d'attacher manuellement un disque dur virtuel avec diskpart, diskpart réussit, le gestionnaire de disques affiche le disque avec la lettre de lecteur correcte, mais dans la même instance PoSH, je ne peux pas me connecter (set-location) à ce lecteur. Si je fais un diskpart manuel lorsque j'ouvre PoSH pour la première fois, je peux attacher et détacher tout ce que je veux et je reçois la lettre de lecteur à chaque fois. Dois-je faire quelque chose pour réinitialiser diskpart dans le script? Voici un extrait du script que j'utilise.

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 ; ""
         }
 }
Kyle
la source
Trois jours et toujours pas de réponse. Quelqu'un a des idées? Ceci crée un retard majeur dans un projet que j'ai
Kyle
Sur quel système d'exploitation exécutez-vous ce script? Je demande principalement parce que 8/2012 ont des applets de commande de montage / démontage VHD intégrées. Vous avez un chèque pour exiger le 7 / 2008R2 mais pas un maximum.
MikeBaz - MSFT

Réponses:

1

Je ne peux pas voir le point exact où votre script échoue, mais le test Set-Location que vous mentionnez me rappelle un problème que j'ai eu dans PoSH lorsque j'essayais de mapper / dé-mapper / localiser à plusieurs reprises des emplacements dans un script.

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

En bref FILESYSTEM::X:\

au lieu de X:\

EDIT: Ok, donc j'ai réellement passé 30 secondes à lire votre script. je mettrais

$Path = FILESYSTEM::$Path

Au bout de chaque fonction.

Patrick
la source
0

Je sais que ce n'est pas directement une réponse, mais avez-vous essayé de ne pas le monter sur une lettre de lecteur? Utilisez assign mount=<PATH>plutôt cette option et configurez votre script de nettoyage pour travailler dans ce sous-répertoire.

marque
la source