Menggunakan Diskpart dalam skrip PowerShell tidak akan mengizinkan skrip untuk menggunakan kembali huruf drive

8

Saya membuat skrip yang me-mount (melampirkan) VHD menggunakan Diskpart , membersihkan beberapa file sistem dan kemudian meng-unmount (melepaskan) itu. Ia menggunakan foreach loop dan seharusnya membersihkan beberapa VHD menggunakan huruf drive yang sama. Namun, setelah VHD 1 gagal. Saya juga memperhatikan bahwa ketika saya mencoba untuk secara manual melampirkan VHD dengan diskpart, diskpart berhasil, Disk Manager menunjukkan disk dengan huruf drive yang benar, tetapi dalam contoh PoSH yang sama saya tidak dapat menghubungkan (set-lokasi) ke drive itu. Jika saya melakukan diskpart manual ketika saya membuka PoSH pertama saya bisa melampirkan dan melepaskan semua yang saya inginkan dan saya mendapatkan huruf drive setiap kali. Apakah ada sesuatu yang harus saya lakukan untuk mengatur ulang diskpart di skrip? Berikut cuplikan dari skrip yang saya gunakan.

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
sumber
Tiga hari dan masih belum ada jawaban. Adakah yang punya ide? Ini merupakan penundaan besar dalam proyek yang saya miliki
Kyle
OS apa yang Anda jalankan skrip ini? Saya bertanya terutama karena 8/2012 memiliki built-in VHD mount / unmount cmdlets. Anda memiliki cek yang membutuhkan 7 / 2008R2 tetapi tidak maksimal.
MikeBaz - MSFT

Jawaban:

1

Saya tidak dapat melihat titik tepat di mana skrip Anda gagal, namun tes Set-Lokasi yang Anda sebutkan mengingatkan saya pada masalah yang saya alami di PoSH ketika mencoba memetakan / membatalkan peta / lokasi peta dalam skrip berulang kali.

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

Dalam penggunaan singkat FILESYSTEM::X:\

dari pada X:\

EDIT: Ok jadi saya sebenarnya menghabiskan 30 detik membaca skrip Anda. Saya akan menempatkan

$Path = FILESYSTEM::$Path

Di untuk setiap fungsi.

Patrick
sumber
0

Saya tahu ini bukan jawaban langsung tetapi apakah Anda sudah mencoba untuk tidak memasangnya ke huruf drive? Gunakan assign mount=<PATH>opsi sebagai gantinya dan rig skrip pembersih Anda untuk bekerja di sub-direktori itu.

Menandai
sumber