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 ; ""
}
}
답변
스크립트가 실패한 정확한 지점을 볼 수 없지만 언급 한 Set-Location 테스트는 스크립트에서 반복적으로 매핑 / 매핑 해제 / 매핑 위치를 시도 할 때 PoSH에서 발생한 문제를 상기시킵니다.
/programming/10994979/net-use-only-works-once-in-powershell
짧게 사용
FILESYSTEM::X:\
대신에 X:\
편집 :
좋아, 실제로 30 초 동안 스크립트를 읽는 데 보냈습니다. 나는 넣을 것이다
$Path = FILESYSTEM::$Path
각 기능의 ~에.
답변
나는 이것이 직접적인 대답이 아니라는 것을 알고 있지만 드라이브 문자에 마운트하지 않으셨습니까? 사용 assign mount=<PATH>
이 하위 디렉토리에 작업을 대신하고 장비하여 청소기 스크립트를 옵션을 선택합니다.