在PowerShell脚本中使用Diskpart不会允许脚本重复使用驱动器盘符

我构build了一个使用Diskpart挂载(附加) VHD脚本,清除了一些系统文件,然后卸载(分离)它。 它使用一个foreach循环,并假设使用相同的驱动器号来清理多个VHD。 但是,在第一个VHD失败之后。 我还注意到,当我尝试手动附加一个VHD与diskpart,diskpart成功,磁盘pipe理器显示正确的驱动器号的磁盘,但在同一个PoSH实例,我无法连接(设置位置)该驱动器。 如果我在第一次打开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 ; "" } } 

我无法看到脚本失败的确切位置,但是您提到的设置位置testing提醒了我在PoSH中尝试在脚本中重复映射/取消映射/映射位置时遇到的问题。

https://stackoverflow.com/questions/10994979/net-use-only-works-once-in-powershell

总之使用FILESYSTEM::X:\

而不是X:\

编辑:好吧,所以我实际上花了30秒读你的脚本。 我会放

$Path = FILESYSTEM::$Path

在每个function的到。

我知道这不是一个直接的答案,但你有没有试图将其挂载到驱动器号? 使用assign mount=<PATH>选项,并使用清理脚本在该子目录中工作。