PowerShell 스크립트에서 Diskpart를 사용하면 스크립트가 드라이브 문자를 재사용 할 수 없습니다


8

Diskpart를 사용하여 VHD 를 마운트 (첨부) 하고 일부 시스템 파일을 정리 한 다음 마운트 해제 (분리) 하는 스크립트를 작성 했습니다. foreach 루프를 사용하며 동일한 드라이브 문자를 사용하여 여러 VHD를 정리한다고 가정합니다. 그러나 첫 번째 VHD 이후에는 실패합니다. 또한 diskpart를 사용하여 VHD를 수동으로 연결하려고하면 diskpart가 성공하고 디스크 관리자에 디스크에 올바른 드라이브 문자가 표시되지만 동일한 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 ; ""
         }
 }

3 일이지만 여전히 답이 없습니다. 누구든지 아이디어가 있습니까? 이것은 내가 가진 프로젝트에서 중대한 지연을 초래합니다
Kyle

이 스크립트를 어떤 OS에서 실행하고 있습니까? 2012 년 8 월에 기본 제공 VHD 마운트 / 마운트 해제 cmdlet이 있기 때문에 주로 묻습니다. 7 / 2008R2가 필요하지만 최대 값은 아닙니다.
MikeBaz-MSFT 2014 년

답변:


1

스크립트가 실패한 정확한 지점을 볼 수 없지만 언급 한 Set-Location 테스트는 스크립트에서 반복적으로 매핑 / 매핑 해제 / 매핑 위치를 시도 할 때 PoSH에서 발생한 문제를 상기시킵니다.

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

짧게 사용 FILESYSTEM::X:\

대신에 X:\

편집 : 좋아, 실제로 30 초 동안 스크립트를 읽는 데 보냈습니다. 나는 넣을 것이다

$Path = FILESYSTEM::$Path

각 기능의 ~에.


0

나는 이것이 직접적인 대답이 아니라는 것을 알고 있지만 드라이브 문자에 마운트하지 않으셨습니까? 사용 assign mount=<PATH>이 하위 디렉토리에 작업을 대신하고 장비하여 청소기 스크립트를 옵션을 선택합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.