23 votos

Eliminar correctamente Windows.old en Hyper-V Server 2012 R2

He instalado Hyper-V Server 2012 R2 en un servidor que tenía Hyper-V Server 2012. Cuando hice esto, el estándar Windows.old se creó una carpeta. Ahora me gustaría eliminar esa carpeta de forma segura. La forma estándar de hacerlo con una interfaz gráfica completa sería usar el Limpiador de Disco, pero por supuesto no tengo esa opción en el Servidor Hyper-V.

¿Hay alguna forma formal de quitar esa carpeta en este escenario? Sé que si esto fuera el núcleo del servidor podría instalar la interfaz gráfica completa, incluyendo la experiencia de escritorio, pero eso sería un montón de tonterías sólo para eliminar limpiamente una carpeta.

Mi principal razón para preguntar, en lugar de sólo hacer rmdir /s o algo así, es que el Windows.old tiene muchas uniones, y no quiero romper nada en la copia del sistema operativo de producción como parte de hacer esto.

24voto

Todd Puntos 2342

Primero intenté copiar y ejecutar cleanmgr.exe (herramienta de limpieza de discos), pero tiene demasiadas dependencias de DLLs que no están presentes en el servidor Core/Hyper-V.

Así que en lugar de eso borré el directorio manualmente.

Primero eliminé todos los puntos de unión y los enlaces simbólicos. Para hacer esto usé junction.exe de SysInternals. Copie el exe en un directorio en su ruta. Lo corrí para obtener una lista de todos los cruces:

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

Abrí un PowerShell:

start powershell.exe

y ejecutó el siguiente script para encontrar las líneas relevantes y ejecutar junction.exe de nuevo:

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

Esto eliminó todos los puntos de unión y el único enlace simbólico de mi sistema.

En el cmd.exe ejecuté tres comandos para limpiar los permisos y borrar todos los archivos:

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

En mi prueba, instalé un nuevo servidor Hyper-V 2012, y luego lo actualicé a 2012 R2, Windows.old ya no existe y el sistema funciona bien con todos los viejos objetivos de unión intactos.

6voto

LikeARock47 Puntos 11

Usé la respuesta de Peter H y confirmé que sí funciona, sin embargo necesitaba hacerlo en varios servidores, así que modifiqué su código en un powerhell script que puede ser ejecutado localmente o a través de PS remoto desde otra máquina. Este es el archivo .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

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: