Usar o Diskpart em um script do PowerShell não permitirá que o script reutilize a letra da unidade

8

Eu criei um script que monta (anexa) um VHD usando Diskpart , limpa alguns arquivos do sistema e desmonta (desanexa). Ele usa um loop foreach e é suposto limpar vários VHD usando a mesma letra de unidade. No entanto, após o primeiro VHD, ele falha. Eu também notei que quando tento anexar manualmente um VHD com diskpart, o diskpart é bem-sucedido, o Disk Manager mostra o disco com a letra da unidade correta, mas dentro da mesma instância PoSH não consigo conectar (set-location) a essa unidade. Se eu fizer um diskpart manual quando eu abrir o PoSH, posso anexar e desanexar tudo o que quero e recebo a letra da unidade toda vez. Existe algo que eu preciso fazer para redefinir o diskpart no script? Aqui está um trecho do script que estou 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 ; ""
         }
 }
    
por Kyle 11.12.2012 / 01:19

2 respostas

1

Não consigo ver o ponto exato em que seu script está falhando, mas o teste Set-Location que você mencionou me lembra de um problema que tive no PoSH ao tentar mapear / desmapear / mapear locais repetidamente em um script .

link

Em suma utilização FILESYSTEM::X:\

em vez de X:\

EDITAR: Ok, então passei 30 segundos lendo seu roteiro. Eu colocaria

$Path = FILESYSTEM::$Path

No to de cada função.

    
por 30.01.2013 / 15:13
0

Eu sei que isso não é diretamente uma resposta, mas você tentou não montá-lo em uma letra de unidade? Use a opção assign mount=<PATH> e ajuste seu script cleaner para trabalhar nesse subdiretório.

    
por 19.12.2012 / 19:53