Creé un script que monta (adjunta) un VHD usando Diskpart , limpia algunos archivos del sistema y luego lo desmonta (separa). Utiliza un bucle foreach y se supone que limpia múltiples VHD usando la misma letra de unidad. Sin embargo, después del primer VHD falla. También noté que cuando trato de conectar manualmente un VHD con diskpart, diskpart tiene éxito, el Administrador de discos muestra el disco con la letra de unidad correcta, pero dentro de la misma instancia de PoSH no puedo conectar (establecer ubicación) a esa unidad. Si hago una parte de disco manual cuando abro PoSH por primera vez, puedo conectar y desconectar todo lo que quiero y obtengo la letra de la unidad cada vez. ¿Hay algo que deba hacer para restablecer diskpart en el script? Aquí hay un fragmento del script que estoy usando.
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 ; ""
}
}
Respuestas:
No puedo ver el punto exacto en el que falla su secuencia de comandos, sin embargo, la prueba de Establecer ubicación que menciona me recuerda un problema que tuve en PoSH al tratar de asignar / desasignar / ubicar mapas repetidamente en una secuencia de comandos.
/programming/10994979/net-use-only-works-once-in-powershell
En uso corto
FILESYSTEM::X:\
en vez de
X:\
EDITAR: Ok, de hecho pasé 30 segundos leyendo tu guión. Yo pondría
$Path = FILESYSTEM::$Path
En el para de cada función.
fuente
Sé que esto no es directamente una respuesta, pero ¿ha intentado no montarlo en una letra de unidad? Utilice la
assign mount=<PATH>
opción en su lugar y manipule su script más limpio para trabajar en ese subdirectorio.fuente