Entfernen Sie Windows.old unter Hyper-V Server 2012 R2 ordnungsgemäß

22

Ich habe Hyper-V Server 2012 R2 auf einem Server mit Hyper-V Server 2012 installiert. Dabei wurde der Standardordner Windows.olderstellt. Ich möchte diesen Ordner jetzt sicher entfernen. Die Standardmethode für eine vollständige Benutzeroberfläche ist die Verwendung der Datenträgerbereinigung, aber diese Option ist auf Hyper-V-Servern natürlich nicht verfügbar.

Gibt es in diesem Szenario eine formale Möglichkeit, diesen Ordner zu entfernen? Ich weiß, wenn dies Server Core wäre, könnte ich die vollständige GUI einschließlich Desktop Experience installieren, aber das wäre eine Menge Unsinn, nur um einen Ordner sauber zu entfernen.

Mein Hauptgrund für die Frage rmdir /sist, dass der Windows.oldOrdner viele Verknüpfungen hat und ich dabei nichts in der Kopie des Produktionsbetriebssystems brechen möchte.

MikeBaz - MSFT
quelle
Ich lese cleanmgr.exe kann in der Befehlszeile ausgeführt werden ... Nicht sicher, ob dies für Server Core oder 2012 gilt?
John

Antworten:

23

Ich habe zuerst versucht, cleanmgr.exe (Disk Cleanup Tool) zu kopieren und auszuführen, aber es gibt zu viele Abhängigkeiten von DLLs, die in Core / Hyper-V Server nicht vorhanden sind.

Also habe ich stattdessen das Verzeichnis manuell gelöscht.

Zuerst entfernte ich alle Verbindungspunkte und symbolischen Verbindungen. Dazu habe ich junction.exe von SysInternals verwendet. Kopieren Sie die exe in ein Verzeichnis in Ihrem Pfad. Ich habe es ausgeführt, um eine Liste aller Abzweigungen zu erhalten:

c:\tools\junction.exe -s -q C:\windows.old > %temp%\junc.txt

Ich habe eine PowerShell geöffnet:

start powershell.exe

und führte das folgende Skript aus, um die relevanten Zeilen zu finden und junction.exe erneut auszuführen:

 foreach ($line in [System.IO.File]::ReadLines("$env:temp\junc.txt"))
 {
     if ($line -match "^\\\\")
     {
         $file = $line -replace "(: JUNCTION)|(: SYMBOLIC LINK)",""
         & c:\tools\junction.exe -d "$file"
     }
 }

Dadurch wurden alle Verbindungspunkte und die einzelne symbolische Verknüpfung auf meinem System entfernt.

Zurück in cmd.exe Ich habe jetzt drei Befehle ausgeführt, um Berechtigungen zu löschen und alle Dateien zu löschen:

 takeown /F C:\windows.old /R /D Y
 cacls C:\windows.old /T /G Everyone:F
 rd /s /q C:\windows.old

In meinem Test habe ich einen neuen Hyper-V-Server 2012 installiert und dann auf 2012 R2 aktualisiert. Windows.old ist jetzt nicht mehr verfügbar und das System funktioniert einwandfrei, wobei alle alten Junction-Ziele intakt sind.

Peter Hahndorf
quelle
Was war der Inhalt von junc.Txt? Kannst du es in Pastebin posten? Ich bin gespannt, ob etwas von Interesse verknüpft war.
Longneck
pastebin.com/pYBGR4ap hat alle relevanten Zeilen von junc.txt
Peter Hahndorf
Dies scheint gut funktioniert zu haben, danke! Ich weiß jetzt auch, dass takeownes etwas peinlich ist, zuzugeben, dass ich nichts davon wusste.
MikeBaz - MSFT
1
Warum müsste man die Verbindungspunkte manuell entfernen, bevor der Ordner gelöscht wird? Die Knotenpunkte sind im Dateisystem gespeichert, würden also sicherlich zusammen mit dem Ordner gelöscht werden ...?
Ashley
3
@AshleySteel - Wenn die Junctions beibehalten werden, schlagen Befehle wie takeown fehl. Hier ist der Fehler: INFO: Das System kann den angegebenen Pfad nicht finden. ("C: \ windows.old \ Dokumente und Einstellungen \ All Users \ Anwendungsdaten \ Anwendungsdaten \ Anwendungsdaten \ Anwendungsdaten \ Anwendungsdaten \ Anwendungsdaten \ Anwendungsdaten \ Anwendungsdaten \ Anwendungsdaten \ Anwendungsdaten \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") FEHLER: Die Syntax für Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch. - Das sieht für mich nach einem Rekursionsproblem aus und hört auf, wenn der Dateipfad zu lang wird.
Peter Hahndorf
4

Ich habe die Antwort von Peter H verwendet und bestätigt, dass sie funktioniert. Ich musste dies jedoch auf mehreren Servern tun. Deshalb habe ich seinen Code in ein Powershell-Skript geändert, das entweder lokal oder per PS-Remoting von einem anderen Computer ausgeführt werden kann. Dies ist die .ps1-Datei:

# Script to remove windows.old after an upgrade

# Assumes path to sysinternals is in the PATH env variable


$ErrorActionPreference = "Inquire"

junction.exe -accepteula -s -q C:\windows.old | out-file $env:temp\juncts.txt -force

foreach ($line in [System.IO.File]::ReadLines("$env:temp\juncts.txt"))
 {
     if ($line -match "^\\\\")
     {
         $file = $line -replace "(: JUNCTION)|(: SYMBOLIC LINK)",""
         & junction.exe -d "$file"
     }
 }

 takeown /F C:\windows.old /R /D Y
 echo y | cacls C:\windows.old /T /G Everyone:F

 rm C:\windows.old -recurse -force
 rm "$env:temp\juncts.txt" -force
LikeARock47
quelle
Ja, das hier ist ein Genuss. Vergessen Sie nicht, die Rechte für powershell.exe zu erhöhen ("Run As Administrator")
Nexus
Zeile: echo y | cacls C: \ windows.old / T / G Alle: F Sollte sein: echo y | cacls C: \ windows.old / T / G Alle: F Kein Leerzeichen zwischen <kbd> y </ kbd> und <kbd> | </ kbd>
user437960