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 ; ""
}
}
Jawaban:
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.
sumber
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.sumber