Elimine correctamente windows.old en Hyper-V Server 2012 R2

22

He instalado Hyper-V Server 2012 R2 en un servidor que tenía Hyper-V Server 2012. Cuando hice esto, Windows.oldse creó la carpeta estándar . Ahora me gustaría eliminar esa carpeta de forma segura. La forma estándar de hacerlo con una GUI completa sería usar el Liberador de espacio en disco, pero, por supuesto, no tengo esa opción en el servidor Hyper-V.

¿Hay alguna forma formal de eliminar esa carpeta en este escenario? Sé que si se tratara de Server Core, podría instalar la GUI completa, incluida Desktop Experience, pero eso sería una gran tontería solo para eliminar limpiamente una carpeta.

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

MikeBaz - MSFT
fuente
Leí que cleanmgr.exe puede ejecutarse en la línea de comando ... ¿No estoy seguro de si esto se aplica al núcleo del servidor o 2012?
John

Respuestas:

23

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

Entonces, en su lugar, eliminé el directorio manualmente.

Primero eliminé todos los puntos de unión y enlaces simbólicos. Para hacer esto, utilicé junction.exe de SysInternals. Copie el exe en un directorio en su ruta. Lo ejecuté 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 nuevamente:

 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 enlace simbólico único en mi sistema.

De vuelta en cmd.exe ahora ejecuté tres comandos para borrar los permisos y eliminar 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, luego actualicé a 2012 R2, Windows.old ahora desapareció y el sistema funciona bien con todos los viejos objetivos de unión intactos.

Peter Hahndorf
fuente
¿Cuál era el contenido de junc.Txt? ¿Puedes publicarlo en pastebin? Tengo curiosidad por saber si algo de interés estaba vinculado.
Longneck
pastebin.com/pYBGR4ap tiene todas las líneas relevantes de junc.txt
Peter Hahndorf
Esto parece haber funcionado bien, gracias! Ahora también sé que takeownexiste, lo cual me da un poco de vergüenza admitir que no sabía.
MikeBaz - MSFT
1
¿Por qué habría que eliminar manualmente los puntos de unión antes de eliminar la carpeta? Los puntos de unión se almacenan en el sistema de archivos, por lo que seguramente se eliminarían junto con la carpeta ...?
Ashley
3
@AshleySteel: porque al mantener las uniones, los comandos como takeown fallan. Aquí está el error: INFORMACIÓN: El sistema no puede encontrar la ruta especificada. ("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 ") ERROR: el nombre de archivo, el nombre del directorio o la sintaxis de la etiqueta de volumen es incorrecta. - Esto me parece un problema de recursión y se detiene cuando la ruta del archivo es demasiado larga.
Peter Hahndorf
4

Utilicé la respuesta de Peter H y confirme que funciona, sin embargo, necesitaba hacerlo en varios servidores, por lo que modifiqué su código en un script de PowerShell que se puede ejecutar localmente o mediante comunicación remota de PS 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
Me gusta ARock47
fuente
Sí, este funciona una delicia. No olvide elevar los privilegios de powershell.exe ("Ejecutar como administrador")
Nexus
Línea: echo y | cacls C: \ windows.old / T / G Todos: F Debería ser: echo y | cacls C: \ windows.old / T / G Todos: F No hay espacio entre <kbd> y </kbd> y <kbd> | </kbd>
user437960