Supprimer correctement windows.old sur Hyper-V Server 2012 R2

22

J'ai installé Hyper-V Server 2012 R2 sur un serveur qui avait Hyper-V Server 2012. Lorsque j'ai fait cela, le Windows.olddossier standard a été créé. Je voudrais maintenant supprimer ce dossier en toute sécurité. La façon standard de le faire avec une interface graphique complète serait d'utiliser le nettoyage de disque, mais bien sûr, je n'ai pas cette option sur Hyper-V Server.

Existe-t-il un moyen formel de supprimer ce dossier dans ce scénario? Je sais que si c'était Server Core, je pourrais installer l'interface graphique complète, y compris Desktop Experience, mais ce serait beaucoup de bêtises juste pour supprimer proprement un dossier.

Ma principale raison de demander, par opposition à simplement faire rmdir /sou quelque Windows.oldchose du genre, est que le dossier a beaucoup de jonctions, et je ne veux rien casser dans la copie du système d'exploitation de production dans le cadre de cela.

MikeBaz - MSFT
la source
J'ai lu que cleanmgr.exe peut s'exécuter dans la ligne de commande ... Je ne sais pas si cela s'applique au noyau du serveur ou à 2012 ???
john

Réponses:

23

J'ai d'abord essayé de copier et d'exécuter cleanmgr.exe (outil de nettoyage de disque), mais il a trop de dépendances sur les DLL qui ne sont pas présentes dans Core / Hyper-V Server.

Au lieu de cela, j'ai supprimé le répertoire manuellement.

J'ai d'abord supprimé tous les points de jonction et les liens symboliques. Pour ce faire, j'ai utilisé junction.exe de SysInternals. Copiez l'exe dans un répertoire de votre chemin. Je l'ai exécuté pour obtenir une liste de toutes les jonctions:

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

J'ai ouvert un PowerShell:

start powershell.exe

et exécuté le script suivant pour rechercher les lignes pertinentes et réexécuter 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"
     }
 }

Cela a supprimé tous les points de jonction et le lien symbolique unique sur mon système.

de retour dans cmd.exe, j'ai maintenant exécuté trois commandes pour effacer les autorisations et supprimer tous les fichiers:

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

Dans mon test, j'ai installé un nouveau serveur Hyper-V 2012, puis mis à niveau vers 2012 R2, Windows.old a maintenant disparu et le système fonctionne correctement avec toutes les anciennes cibles de jonction intactes.

Peter Hahndorf
la source
Quel était le contenu de junc.Txt? Pouvez-vous le poster sur pastebin? Je suis curieux de savoir si quelque chose d'intéressant était lié.
longneck
pastebin.com/pYBGR4ap a toutes les lignes pertinentes de junc.txt
Peter Hahndorf
Cela semble avoir bien fonctionné, merci! Je sais aussi maintenant qu'il takeownexiste, ce que je suis un peu gêné d'admettre que je ne connaissais pas.
MikeBaz - MSFT
1
Pourquoi faudrait-il supprimer manuellement les points de jonction avant de supprimer le dossier? Les points de jonction sont stockés dans le système de fichiers, donc seraient sûrement supprimés avec le dossier ...?
Ashley
3
@AshleySteel - Parce que lors de la conservation des jonctions, les commandes comme la suppression échouent. Voici l'erreur: INFO: le système ne peut pas trouver le chemin spécifié. ("C: \ windows.old \ Documents and Settings \ All Users \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") ERREUR: le nom de fichier, le nom de répertoire ou la syntaxe d'étiquette de volume est incorrect. - cela ressemble à un problème de récursivité pour moi et il s'arrête lorsque le chemin du fichier devient trop long.
Peter Hahndorf
4

J'ai utilisé la réponse de Peter H et confirmé que cela fonctionne, mais je devais le faire sur plusieurs serveurs, j'ai donc modifié son code en un script PowerShell qui peut être exécuté localement ou via PS à distance à partir d'une autre machine. Voici le fichier .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
la source
Ouais celui-ci fonctionne un régal. N'oubliez pas d'élever les privilèges powershell.exe («Exécuter en tant qu'administrateur»)
Nexus
Ligne: écho y | cacls C: \ windows.old / T / G Tout le monde: F Devrait être: echo y | cacls C: \ windows.old / T / G Tout le monde: F Pas d'espace entre <kbd> y </kbd> et <kbd> | </kbd>
user437960