Правильно удалите windows.old на Hyper-V Server 2012 R2

Я установил Hyper-V Server 2012 R2 на сервер, на котором был Hyper-V Server 2012. Когда я это сделал, стандарт Windows.old папка была создана. Теперь я хотел бы безопасно удалить эту папку. Стандартный способ сделать это с полным графическим интерфейсом - использовать очистку диска, но, конечно, у меня нет такой опции на сервере Hyper-V.

Есть ли формальный способ удалить эту папку в этом сценарии? Я знаю, что если бы это было Server Core, я мог бы установить полный графический интерфейс пользователя, включая Desktop Experience, но это было бы большой ерундой только для чистого удаления папки.

Моя основная причина спрашивать, а не просто делать rmdir /s или что-то такое, что Windows.old папка имеет много соединений, и я не хочу ничего ломать в производственной копии ОС, как часть этого.

2 ответа

Решение

Сначала я попытался скопировать и запустить cleanmgr.exe (инструмент очистки диска), но у него слишком много зависимостей от библиотек DLL, которых нет в Core/Hyper-V Server.

Поэтому вместо этого я удалил каталог вручную.

Сначала я удалил все точки соединения и символические ссылки. Для этого я использовал junction.exe из SysInternals. Скопируйте исполняемый файл в каталог по вашему пути. Я запустил его, чтобы получить список всех соединений:

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

Я открыл PowerShell:

start powershell.exe

и запустил следующий скрипт, чтобы найти соответствующие строки и снова выполнить 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"
     }
 }

Это удалило все точки соединения и единственную символическую ссылку в моей системе.

Вернувшись в cmd.exe, я выполнил три команды, чтобы очистить разрешения и удалить все файлы:

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

В моем тесте я установил новый сервер Hyper-V 2012, затем обновил до 2012 R2, Windows.old теперь не работает, и система работает нормально со всеми старыми целевыми объектами соединения.

Я использовал ответ Питера Х и подтвердил, что он работает, однако мне нужно было сделать это на нескольких серверах, поэтому я изменил его код в сценарий powershell, который может выполняться либо локально, либо с помощью удаленного взаимодействия PS с другой машины. Это файл.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
Другие вопросы по тегам