Durch die Verwendung von Diskpart in einem PowerShell-Skript kann das Skript den Laufwerksbuchstaben nicht wiederverwenden

8

Ich baute ein Skript , dass Halterungen (Anfügen) eine VHD mit Diskpart , einige Systemdateien reinigt und dann Aushänge (detach) es. Es verwendet eine foreach-Schleife und soll mehrere VHD mit demselben Laufwerksbuchstaben bereinigen. Nach der 1. VHD schlägt dies jedoch fehl. Ich habe auch festgestellt, dass beim Versuch, eine virtuelle Festplatte manuell mit diskpart zu verbinden, diskpart erfolgreich ist. Der Disk Manager zeigt die Festplatte mit dem richtigen Laufwerksbuchstaben an, aber innerhalb derselben PoSH-Instanz kann ich keine Verbindung (Set-Location) zu diesem Laufwerk herstellen. Wenn ich beim ersten Öffnen von PoSH ein manuelles Diskpart mache, kann ich alles anhängen und entfernen, was ich will, und ich erhalte jedes Mal den Laufwerksbuchstaben. Muss ich etwas tun, um das Diskpart im Skript zurückzusetzen? Hier ist ein Ausschnitt des Skripts, das ich verwende.

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
quelle
Drei Tage und immer noch keine Antwort. Hat jemand irgendwelche Ideen? Dies ist eine große Verzögerung in einem Projekt, das ich habe
Kyle
Auf welchem ​​Betriebssystem führen Sie dieses Skript aus? Ich frage hauptsächlich, weil 8/2012 eingebaute VHD-Cmdlets zum Ein- und Aushängen hat. Sie müssen 7 / 2008R2 prüfen, aber nicht maximal.
MikeBaz - MSFT

Antworten:

1

Ich kann den genauen Punkt, an dem Ihr Skript fehlschlägt, nicht sehen. Der von Ihnen erwähnte Set-Location-Test erinnert mich jedoch an ein Problem, das ich in PoSH hatte, als ich versuchte, Standorte in einem Skript wiederholt zuzuordnen / zu entfernen / zuzuordnen.

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

Im kurzen Gebrauch FILESYSTEM::X:\

anstatt X:\

EDIT: Ok, also habe ich 30 Sekunden damit verbracht, dein Skript zu lesen. ich würde setzen

$Path = FILESYSTEM::$Path

An der bis jeder Funktion.

Patrick
quelle
0

Ich weiß, dass dies keine direkte Antwort ist, aber haben Sie versucht, es nicht an einem Laufwerksbuchstaben zu befestigen? Verwenden Sie assign mount=<PATH>stattdessen die Option und richten Sie Ihr Cleaner-Skript so ein, dass es in diesem Unterverzeichnis funktioniert.

Kennzeichen
quelle