Frage Entfernen Sie windows.old auf Hyper-V Server 2012 R2 ordnungsgemäß


Ich habe Hyper-V Server 2012 R2 auf einem Server mit Hyper-V Server 2012 installiert. Als ich dies getan habe, der Standard Windows.old Ordner wurde erstellt. Ich möchte diesen Ordner jetzt sicher entfernen. Die Standardmethode, dies mit einer vollständigen GUI zu tun, wäre die Verwendung der Datenträgerbereinigung, aber natürlich habe ich diese Option nicht auf Hyper-V Server.

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

Mein Hauptgrund zu fragen, anstatt nur zu tun rmdir /s oder so etwas, ist das Windows.old Ordner hat viele Junctions, und ich möchte nichts in der Produktion Betriebssystem Kopie als Teil dabei brechen.


19
2017-10-12 13:17


Ursprung


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


Antworten:


Ich habe zuerst versucht, cleanmgr.exe (Tool zur Datenträgerbereinigung) zu kopieren und auszuführen, aber es hat 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 habe ich alle Verbindungspunkte und symbolischen Verbindungen entfernt. Dazu habe ich gebraucht junction.exe von SysInternals. Kopiere die exe in ein Verzeichnis in deinem Pfad. Ich habe es ausgeführt, um eine Liste aller Verbindungen 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 der einzige symbolische Link auf meinem System entfernt.

zurück in cmd.exe Ich habe jetzt drei Befehle ausgeführt, um die 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, dann ein Upgrade auf 2012 R2, Windows.old ist nun weg und das System läuft einwandfrei, wobei alle alten Junction-Ziele intakt sind.


21
2017-10-12 22:26



Was war der Inhalt von junc.Txt? Kannst du es in Pastebin posten? Ich bin neugierig, ob etwas von Interesse verknüpft war. - longneck
pastebin.com/pYBGR4ap hat alle relevanten Zeilen von junc.txt - Peter Hahndorf
Das scheint gut zu funktionieren, danke! Ich weiß es jetzt auch takeown existiert, was mir etwas peinlich ist zu zugeben, dass ich nichts davon wusste. - MikeBaz - MSFT
Warum müsste man die Verbindungspunkte vor dem Löschen des Ordners manuell entfernen? Die Knotenpunkte sind im Dateisystem gespeichert, würden also mit dem Ordner gelöscht werden ...? - Ashley Steel
@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: Der Dateiname, der Verzeichnisname oder die Datenträger-Beschriftungssyntax sind falsch. - Das sieht für mich wie ein Rekursionsproblem aus und hört auf, wenn der Dateipfad zu lang wird. - Peter Hahndorf


Ich habe die Antwort von Peter H. verwendet und bestätigt, dass es funktioniert, aber ich musste dies auf mehreren Servern tun, also modifizierte ich seinen Code in ein Powershell-Skript, das entweder lokal oder über 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

4
2018-01-26 08:59



Skript von @ LikeARock47 hat auch für mich funktioniert. Vielen Dank! - user225616
Ja, das funktioniert ein Leckerbissen. Vergessen Sie nicht, die powershell.exe-Berechtigungen zu erhöhen ("Als Administrator ausführen") - Nexus
Zeile: echo y | C: \ windows.old / T / G Jeder: F Sollte sein: echo y | cacls C: \ windows.old / T / G Jeder: F Kein Leerzeichen zwischen <kbd> y </ kbd> und <kbd> | </ kbd> - user437960