El uso de Diskpart en un script de PowerShell no permitirá que el script reutilice la letra de unidad


8

Creé un script que monta (adjunta) un VHD usando Diskpart , limpia algunos archivos del sistema y luego lo desmonta (separa). Utiliza un bucle foreach y se supone que limpia múltiples VHD usando la misma letra de unidad. Sin embargo, después del primer VHD falla. También noté que cuando trato de conectar manualmente un VHD con diskpart, diskpart tiene éxito, el Administrador de discos muestra el disco con la letra de unidad correcta, pero dentro de la misma instancia de PoSH no puedo conectar (establecer ubicación) a esa unidad. Si hago una parte de disco manual cuando abro PoSH por primera vez, puedo conectar y desconectar todo lo que quiero y obtengo la letra de la unidad cada vez. ¿Hay algo que deba hacer para restablecer diskpart en el script? Aquí hay un fragmento del script que estoy 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 ; ""
         }
 }

Tres días y aún no hay respuesta. ¿Alguien tiene alguna idea? Esto está creando un gran retraso en un proyecto que tengo
Kyle

¿En qué sistema operativo está ejecutando este script? Pregunto principalmente porque 8/2012 tiene cmdlets integrados para montar / desmontar VHD. Tiene un cheque que requiere 7 / 2008R2 pero no un máximo.
MikeBaz - MSFT

Respuestas:


1

No puedo ver el punto exacto en el que falla su secuencia de comandos, sin embargo, la prueba de Establecer ubicación que menciona me recuerda un problema que tuve en PoSH al tratar de asignar / desasignar / ubicar mapas repetidamente en una secuencia de comandos.

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

En uso corto FILESYSTEM::X:\

en vez de X:\

EDITAR: Ok, de hecho pasé 30 segundos leyendo tu guión. Yo pondría

$Path = FILESYSTEM::$Path

En el para de cada función.


0

Sé que esto no es directamente una respuesta, pero ¿ha intentado no montarlo en una letra de unidad? Utilice la assign mount=<PATH>opción en su lugar y manipule su script más limpio para trabajar en ese subdirectorio.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.