Я создал скрипт, который монтирует (присоединяет) виртуальный жесткий диск с помощью Diskpart , очищает некоторые системные файлы и затем отключает (отсоединяет) его. Он использует цикл foreach и предполагает очистку нескольких виртуальных жестких дисков с использованием одной и той же буквы диска. Однако после 1-го VHD это не удается. Я также заметил, что когда я пытаюсь вручную подключить VHD с помощью diskpart, diskpart успешно завершает работу, Disk Manager показывает диск с правильной буквой диска, но в том же экземпляре PoSH я не могу подключиться (set-location) к этому диску. Если при первом открытии PoSH я выполняю ручную разметку диска, я могу прикрепить и отсоединить все, что хочу, и каждый раз получаю букву диска. Что мне нужно сделать, чтобы сбросить diskpart в скрипте? Вот фрагмент сценария, который я использую.
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 ; ""
}
}
Ответы:
Я не вижу точной точки, в которой ваш сценарий дает сбой, однако упомянутый вами тест Set-Location напоминает мне о проблеме, с которой я столкнулся в PoSH, когда пытался многократно отображать / отменять / отображать местоположения в сценарии.
/programming/10994979/net-use-only-works-once-in-powershell
В короткие сроки
FILESYSTEM::X:\
вместо
X:\
РЕДАКТИРОВАТЬ: Хорошо, поэтому я на самом деле потратил 30 секунд на чтение вашего сценария. Я бы поставил
$Path = FILESYSTEM::$Path
На каждой функции.
источник
Я знаю, что это не прямой ответ, но вы пытались не монтировать его на букву диска?
assign mount=<PATH>
Вместо этого используйте опцию и настройте ваш скрипт-уборщик для работы в этом подкаталоге.источник