web-dev-qa-db-fra.com

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

J'ai installé Hyper-V Server 2012 R2 sur un serveur qui avait Hyper-V Server 2012. Lorsque j'ai fait cela, le dossier Windows.old 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 s'il s'agissait de 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, au lieu de simplement faire rmdir /s Ou quelque chose du genre, est que le dossier Windows.old A beaucoup de jonctions, et je ne veux rien casser dans le système d'exploitation de production copier dans le cadre de cette opération.

22
MikeBaz - MSFT

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 est maintenant parti et le système fonctionne correctement avec toutes les anciennes cibles de jonction intactes.

23
Peter Hahndorf

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 la télécommande PS à 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
4
LikeARock47