Sử dụng Diskpart trong tập lệnh PowerShell sẽ không cho phép tập lệnh sử dụng lại ký tự ổ đĩa


8

Tôi đã xây dựng một tập lệnh gắn kết (đính kèm) một VHD bằng cách sử dụng Diskpart , xóa sạch một số tệp hệ thống và sau đó ngắt kết nối (tách) nó. Nó sử dụng vòng lặp foreach và được cho là để xóa nhiều VHD bằng cùng một ký tự ổ đĩa. Tuy nhiên, sau lần 1 VHD thì thất bại. Tôi cũng nhận thấy rằng khi tôi cố gắng đính kèm VHD thủ công với Diskpart, Diskpart thành công, Trình quản lý đĩa hiển thị đĩa với ký tự ổ đĩa chính xác, nhưng trong cùng một ví dụ PoSH tôi không thể kết nối (vị trí đặt) với ổ đĩa đó. Nếu tôi thực hiện một phần đĩa thủ công khi tôi mở PoSH lần đầu tiên, tôi có thể đính kèm và tách tất cả những gì tôi muốn và tôi nhận được ký tự ổ đĩa mỗi lần. Có điều gì tôi cần làm để thiết lập lại Diskpart trong tập lệnh không? Đây là một đoạn của tập lệnh tôi đang sử dụng.

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 ; ""
         }
 }

Ba ngày rồi vẫn không có câu trả lời. Còn ai có ý tưởng nào không? Đây là một sự chậm trễ lớn trong một dự án mà tôi có
Kyle

Hệ điều hành nào bạn đang chạy tập lệnh này? Tôi hỏi chủ yếu vì 8/2012 đã tích hợp sẵn các lệnh ghép ngắn VHD mount / unmounts. Bạn có một kiểm tra để yêu cầu 7 / 2008R2 nhưng không phải là tối đa.
MikeBaz - MSFT

Câu trả lời:


1

Tôi không thể thấy chính xác điểm mà kịch bản của bạn bị lỗi, tuy nhiên bài kiểm tra Vị trí đặt mà bạn đề cập nhắc nhở tôi về một vấn đề tôi gặp phải trong PoSH khi cố gắng lặp lại các vị trí ánh xạ / không ánh xạ / bản đồ trong tập lệnh.

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

Sử dụng ngắn FILESYSTEM::X:\

thay vì X:\

EDIT: Ok vì vậy tôi thực sự đã dành 30 giây để đọc kịch bản của bạn. Tôi muốn đặt

$Path = FILESYSTEM::$Path

Tại mỗi chức năng.


0

Tôi biết đây không phải là câu trả lời trực tiếp nhưng bạn đã thử không gắn nó vào ký tự ổ đĩa chưa? Sử dụng assign mount=<PATH>tùy chọn thay thế và gian lận tập lệnh sạch hơn của bạn để làm việc trong thư mục con đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.