PowerShellスクリプトでDiskpartを使用すると、スクリプトでドライブ文字を再利用できなくなります


8

Diskpartを使用してVHDをマウント(アタッチ)し、いくつかのシステムファイルをクリーンアップして、アンマウント(デタッチ)するスクリプトを作成しました。これはforeachループを使用し、同じドライブ文字を使用して複数のVHDをクリーンアップすると想定されています。ただし、最初のVHDの後は失敗します。また、diskpartを使用してVHDを手動で接続しようとすると、diskpartが成功し、ディスクマネージャーに正しいドライブ文字のディスクが表示されますが、同じPoSHインスタンス内ではそのドライブに接続(設定場所)できません。最初にPoSHを開いたときに手動のdiskpartを実行すると、必要なすべてをアタッチおよびデタッチでき、毎回ドライブ文字を取得できます。スクリプトで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 ; ""
         }
 }

3日間、まだ答えはありません。誰かアイデアはありますか?これは私が持っているプロジェクトに大きな遅延
カイル

このスクリプトを実行しているOSは何ですか?2012年8月にVHDマウント/アンマウントコマンドレットが組み込まれているため、主に質問します。あなたは7 / 2008R2を必要とするチェックを持っていますが、最大ではありません。
MikeBaz-MSFT 2012年

回答:


1

スクリプトが失敗する正確な時点を確認できませんが、あなたが言及したSet-Locationテストは、スクリプトで位置を繰り返しマップ/マップ解除/マップしようとすると、PoSHで発生した問題を思い出させます。

/programming/10994979/net-use-only-works-once-in-powershell

短期的には FILESYSTEM::X:\

の代わりに X:\

編集: わかりましたので、実際にスクリプトを読むのに30秒かかりました。私は置くでしょう

$Path = FILESYSTEM::$Path

各関数のtoに。


0

これが直接の答えではないことはわかっていますが、ドライブ文字にマウントしないように試みましたか?assign mount=<PATH>代わりにオプションを使用して、よりクリーンなスクリプトをそのサブディレクトリで動作するようにリグしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.