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