J'ai construit un script qui monte (attache) un disque dur virtuel à l' aide de Diskpart , nettoie certains fichiers système, puis le démonte (détache). Il utilise une boucle foreach et est supposé nettoyer plusieurs VHD en utilisant la même lettre de lecteur. Cependant, après le 1er VHD, il échoue. J'ai également remarqué que lorsque j'essaie d'attacher manuellement un disque dur virtuel avec diskpart, diskpart réussit, le gestionnaire de disques affiche le disque avec la lettre de lecteur correcte, mais dans la même instance PoSH, je ne peux pas me connecter (set-location) à ce lecteur. Si je fais un diskpart manuel lorsque j'ouvre PoSH pour la première fois, je peux attacher et détacher tout ce que je veux et je reçois la lettre de lecteur à chaque fois. Dois-je faire quelque chose pour réinitialiser diskpart dans le script? Voici un extrait du script que j'utilise.
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 ; ""
}
}
Réponses:
Je ne peux pas voir le point exact où votre script échoue, mais le test Set-Location que vous mentionnez me rappelle un problème que j'ai eu dans PoSH lorsque j'essayais de mapper / dé-mapper / localiser à plusieurs reprises des emplacements dans un script.
/programming/10994979/net-use-only-works-once-in-powershell
En bref
FILESYSTEM::X:\
au lieu de
X:\
EDIT: Ok, donc j'ai réellement passé 30 secondes à lire votre script. je mettrais
$Path = FILESYSTEM::$Path
Au bout de chaque fonction.
la source
Je sais que ce n'est pas directement une réponse, mais avez-vous essayé de ne pas le monter sur une lettre de lecteur? Utilisez
assign mount=<PATH>
plutôt cette option et configurez votre script de nettoyage pour travailler dans ce sous-répertoire.la source