Prawidłowo usuń windows.old na Hyper-V Server 2012 R2

22

Zainstalowałem Hyper-V Server 2012 R2 na serwerze, który miał Hyper-V Server 2012. Kiedy to zrobiłem, utworzono standardowy Windows.oldfolder. Chciałbym teraz bezpiecznie usunąć ten folder. Standardowym sposobem na to z pełnym GUI byłoby użycie Oczyszczania dysku, ale oczywiście nie mam tej opcji na serwerze Hyper-V.

Czy istnieje formalny sposób usunięcia tego folderu w tym scenariuszu? Wiem, że gdyby to był Server Core, mógłbym zainstalować pełny interfejs GUI, w tym Desktop Experience, ale byłoby to bzdurą, gdyby po prostu usunąć folder.

Głównym powodem, dla którego pytam, a nie tylko to, rmdir /sczy coś takiego, jest to, że Windows.oldfolder ma wiele skrzyżowań i nie chcę niczego łamać w produkcyjnej kopii systemu operacyjnego w ramach tego.

MikeBaz - MSFT
źródło
Czytam cleanmgr.exe można uruchomić w wierszu polecenia ... Nie jestem pewien, czy dotyczy to rdzenia serwera czy 2012 ???
Jan

Odpowiedzi:

23

Najpierw próbowałem skopiować i uruchomić cleanmgr.exe (narzędzie do czyszczenia dysku), ale ma zbyt wiele zależności od bibliotek DLL, które nie występują w serwerze Core / Hyper-V Server.

Zamiast tego ręcznie usunąłem katalog.

Najpierw usunąłem wszystkie punkty połączeń i dowiązania symboliczne. Aby to zrobić, użyłem junction.exe z SysInternals. Skopiuj plik exe do katalogu na swojej ścieżce. Uruchomiłem go, aby uzyskać listę wszystkich skrzyżowań:

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

Otworzyłem PowerShell:

start powershell.exe

i uruchomiłem następujący skrypt, aby znaleźć odpowiednie linie i ponownie uruchomić plik junction.exe:

 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"
     }
 }

To usunęło wszystkie punkty połączenia i pojedyncze łącze symboliczne w moim systemie.

z powrotem w cmd.exe Wykonałem teraz trzy polecenia, aby usunąć uprawnienia i usunąć wszystkie pliki:

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

W moim teście zainstalowałem nowy serwer Hyper-V 2012, a następnie uaktualniłem do 2012 R2, Windows.old już nie ma, a system działa dobrze, a wszystkie stare cele połączeń pozostały nietknięte.

Peter Hahndorf
źródło
Jaka była zawartość junc.Txt? Czy możesz to opublikować na pastebin? Jestem ciekawy, czy coś interesującego było powiązane.
longneck
pastebin.com/pYBGR4ap ma wszystkie odpowiednie wiersze z junc.txt
Peter Hahndorf
Wygląda na to, że działało dobrze, dzięki! Teraz też wiem takeown, że istnieje, co nieco wstyd mi przyznać, że nie wiedziałem o tym.
MikeBaz - MSFT
1
Dlaczego trzeba ręcznie usunąć punkty połączenia przed usunięciem folderu? Punkty połączeń są przechowywane w systemie plików, więc na pewno zostaną usunięte wraz z folderem ...?
Ashley,
3
@AshleySteel - Ponieważ podczas utrzymywania skrzyżowań polecenia takie jak takeown kończą się niepowodzeniem. Oto błąd: INFO: System nie może znaleźć określonej ścieżki. („C: \ windows.old \ Documents and Settings \ Wszyscy użytkownicy \ Dane aplikacji \ Dane aplikacji \ Dane aplikacji \ Dane aplikacji \ Dane aplikacji \ Dane aplikacji \ Dane aplikacji \ Dane aplikacji \ Dane aplikacji \ Dane aplikacji \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") BŁĄD: nazwa pliku, nazwa katalogu lub składnia etykiety woluminu jest nieprawidłowa. - dla mnie wygląda to na problem z rekurencją i zatrzymuje się, gdy ścieżka pliku staje się zbyt długa.
Peter Hahndorf
4

Użyłem odpowiedzi Petera H i potwierdziłem, że działa, ale musiałem to zrobić na wielu serwerach, więc zmodyfikowałem jego kod w skrypt PowerShell, który można wykonać lokalnie lub za pomocą PS PS z innej maszyny. To jest plik .ps1:

# 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
źródło
Tak, ten działa na ucztę. Nie zapomnij podnieść uprawnień programu powershell.exe („Uruchom jako administrator”)
Nexus,
Linia: echo y | cacls C: \ windows.old / T / G Wszyscy: F Powinny być: echo y | cacls C: \ windows.old / T / G Wszyscy: F Brak miejsca między <kbd> y </kbd> a <kbd> | </kbd>
user437960