আমি একটি স্ক্রিপ্ট নির্মিত যে মাউন্ট (সংযুক্ত) একটি VHD ব্যবহার Diskpart , কিছু সিস্টেম ফাইল এবং তারপর unmounts (আলাদা) এটি সাফ করে। এটি একটি ফোরচ লুপ ব্যবহার করে এবং ধরে নেওয়া যায় যে একই ড্রাইভ লেটার ব্যবহার করে একাধিক ভিএইচডি পরিষ্কার করা যায়। তবে 1 ম ভিএইচডি পরে এটি ব্যর্থ হয়। আমি আরও লক্ষ্য করেছি যে আমি যখন ডিস্ক পার্টের সাথে ম্যানুয়ালি একটি ভিএইচডি সংযুক্ত করার চেষ্টা করি, ডিস্কপার্টটি সফল হয়, ডিস্ক ম্যানেজারটি সঠিক ড্রাইভের অক্ষর দিয়ে ডিস্কটি দেখায়, তবে একই PoSH উদাহরণের মধ্যে আমি সেই ড্রাইভের সাথে (সেট-লোকেশন) সংযোগ করতে পারি না। আমি যখন 1 তম পিওএসএইচ খুলি আমি কোনও ম্যানুয়াল ডিস্ক পার্ট করি তবে আমি যা চাই তা সংযুক্ত করতে এবং আলাদা করতে পারি এবং প্রতিবার ড্রাইভ চিঠিটি পাই। স্ক্রিপ্টে ডিস্কপার্টটি পুনরায় সেট করতে আমার কিছু করার দরকার আছে? আমি যে স্ক্রিপ্টটি ব্যবহার করছি তার একটি স্নিপেট এখানে।
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 ; ""
}
}