Rimuovere correttamente windows.old su Hyper-V Server 2012 R2


22

Ho installato Hyper-V Server 2012 R2 su un server su cui era installato Hyper-V Server 2012. In seguito, è Windows.oldstata creata la cartella standard . Ora vorrei rimuovere quella cartella in modo sicuro. Il modo standard per farlo con una GUI completa sarebbe usare Disk Cleanup, ma ovviamente non ho quell'opzione su Hyper-V Server.

Esiste un modo formale per rimuovere quella cartella in questo scenario? So che se si trattasse di Server Core, potrei installare la GUI completa, compresa Desktop Experience, ma sarebbe una vera assurdità solo rimuovere una cartella in modo pulito.

Il motivo principale per cui mi chiedo, al contrario di fare semplicemente rmdir /so qualcosa del genere, è che la Windows.oldcartella ha molte giunzioni e non voglio interrompere nulla nella copia del sistema operativo di produzione durante questa operazione.


Ho letto cleanmgr.exe può essere eseguito nella riga di comando ... Non sono sicuro se questo si applica al core del server o 2012 ???
Giovanni,

Risposte:


23

Ho prima provato a copiare ed eseguire cleanmgr.exe (strumento di pulizia del disco), ma ha troppe dipendenze da DLL che non sono presenti nel server Core / Hyper-V.

Così invece ho cancellato manualmente la directory.

Innanzitutto ho rimosso tutti i punti di giunzione e i collegamenti simbolici. Per fare questo ho usato junction.exe da SysInternals. Copia l'exe in una directory nel tuo percorso. L'ho eseguito per ottenere un elenco di tutti gli incroci:

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

Ho aperto una PowerShell:

start powershell.exe

ed eseguito il seguente script per trovare le righe pertinenti ed eseguire nuovamente 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"
     }
 }

Ciò ha rimosso tutti i punti di giunzione e il singolo collegamento simbolico sul mio sistema.

indietro in cmd.exe ora ho eseguito tre comandi per cancellare le autorizzazioni ed eliminare tutti i file:

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

Nel mio test, ho installato un nuovo server Hyper-V 2012, quindi aggiornato a 2012 R2, Windows.old non funziona più e il sistema funziona correttamente con tutti i vecchi target di junction intatti.


Qual era il contenuto di junc.Txt? Puoi pubblicarlo su pastebin? Sono curioso di sapere se qualcosa di interessante fosse collegato.
collo lungo,

pastebin.com/pYBGR4ap ha tutte le righe pertinenti da junc.txt
Peter Hahndorf,

Questo sembra aver funzionato bene, grazie! Ora so anche che takeownesiste, che sono leggermente imbarazzato per ammettere di non saperlo.
MikeBaz - MSFT,

1
Perché è necessario rimuovere manualmente i punti di giunzione prima di eliminare la cartella? I punti di giunzione sono memorizzati nel filesystem, quindi verrebbero sicuramente cancellati insieme alla cartella ...?
Ashley,

3
@AshleySteel - Perché quando si mantengono le giunzioni, comandi come il takown falliscono. Ecco l'errore: INFO: il sistema non riesce a trovare il percorso specificato. ("C: \ windows.old \ Documents and Settings \ All Users \ Dati applicazioni \ Dati applicazioni \ Dati applicazioni \ Dati applicazioni \ Dati applicazioni \ Dati applicazioni \ Dati applicazioni \ Dati applicazioni \ Dati applicazioni \ Dati applicazioni \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") ERRORE: la sintassi del nome file, del nome della directory o dell'etichetta del volume non è corretta. - questo mi sembra un problema di ricorsione e si interrompe quando il percorso del file diventa troppo lungo.
Peter Hahndorf,

4

Ho usato la risposta di Peter H e ho confermato che funziona, tuttavia avevo bisogno di farlo su più server, quindi ho modificato il suo codice in uno script PowerShell che può essere eseguito localmente o tramite PS remoto da un'altra macchina. Questo è il file .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

Sì, questo funziona a meraviglia. Non dimenticare di elevare i privilegi powershell.exe ("Esegui come amministratore")
Nexus

Riga: echo y | cacls C: \ windows.old / T / G Everyone: F Dovrebbe essere: echo y | cacls C: \ windows.old / T / G Everyone: F Nessuno spazio tra <kbd> y </kbd> e <kbd> | </kbd>
user437960
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.