Ich baute ein Skript , dass Halterungen (Anfügen) eine VHD mit Diskpart , einige Systemdateien reinigt und dann Aushänge (detach) es. Es verwendet eine foreach-Schleife und soll mehrere VHD mit demselben Laufwerksbuchstaben bereinigen. Nach der 1. VHD schlägt dies jedoch fehl. Ich habe auch festgestellt, dass beim Versuch, eine virtuelle Festplatte manuell mit diskpart zu verbinden, diskpart erfolgreich ist. Der Disk Manager zeigt die Festplatte mit dem richtigen Laufwerksbuchstaben an, aber innerhalb derselben PoSH-Instanz kann ich keine Verbindung (Set-Location) zu diesem Laufwerk herstellen. Wenn ich beim ersten Öffnen von PoSH ein manuelles Diskpart mache, kann ich alles anhängen und entfernen, was ich will, und ich erhalte jedes Mal den Laufwerksbuchstaben. Muss ich etwas tun, um das Diskpart im Skript zurückzusetzen? Hier ist ein Ausschnitt des Skripts, das ich verwende.
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 ; ""
}
}
Antworten:
Ich kann den genauen Punkt, an dem Ihr Skript fehlschlägt, nicht sehen. Der von Ihnen erwähnte Set-Location-Test erinnert mich jedoch an ein Problem, das ich in PoSH hatte, als ich versuchte, Standorte in einem Skript wiederholt zuzuordnen / zu entfernen / zuzuordnen.
/programming/10994979/net-use-only-works-once-in-powershell
Im kurzen Gebrauch
FILESYSTEM::X:\
anstatt
X:\
EDIT: Ok, also habe ich 30 Sekunden damit verbracht, dein Skript zu lesen. ich würde setzen
$Path = FILESYSTEM::$Path
An der bis jeder Funktion.
quelle
Ich weiß, dass dies keine direkte Antwort ist, aber haben Sie versucht, es nicht an einem Laufwerksbuchstaben zu befestigen? Verwenden Sie
assign mount=<PATH>
stattdessen die Option und richten Sie Ihr Cleaner-Skript so ein, dass es in diesem Unterverzeichnis funktioniert.quelle