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

22

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

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

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

MikeBaz - MSFT
источник
Я читал, что cleanmgr.exe можно запустить из командной строки ... Не уверен, относится ли это к ядру сервера или к 2012 году ???
Джон

Ответы:

23

Сначала я попытался скопировать и запустить 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 теперь не работает, и система работает нормально со всеми старыми целевыми объектами соединения.

Питер Хандорф
источник
Каково было содержимое junc.Txt? Можете ли вы опубликовать это в pastebin? Мне любопытно, если что-нибудь интересное было связано.
longneck
pastebin.com/pYBGR4ap содержит все соответствующие строки из junc.txt
Питер Хандорф,
Похоже, это сработало нормально, спасибо! Я также теперь знаю takeown, что существует, и мне немного стыдно признать, о чем я не знал.
MikeBaz - MSFT
1
Зачем нужно вручную удалять точки соединения перед удалением папки? Точки соединения хранятся в файловой системе, поэтому, несомненно, будут удалены вместе с папкой ...?
Эшли
3
@AshleySteel - потому что при сохранении соединений такие команды, как takeown, не выполняются. Вот ошибка: INFO: Система не может найти указанный путь. ("C: \ windows.old \ Documents and Settings \ Все пользователи \ Данные приложения \ Данные приложения \ Данные приложения \ Данные приложения \ Данные приложения \ Данные приложения \ Данные приложения \ Данные приложения \ Данные приложения \ Данные приложения \ Данные приложения \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") ОШИБКА: неверный синтаксис имени файла, имени каталога или метки тома. - это похоже на проблему рекурсии и останавливается, когда путь к файлу становится слишком длинным.
Питер Хандорф,
4

Я использовал ответ Питера Х и подтвердил, что он работает, однако мне нужно было сделать это на нескольких серверах, поэтому я изменил его код в сценарий 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
LikeARock47
источник
Да, это работает удовольствие. Не забудьте повысить привилегии powershell.exe («Запуск от имени администратора»)
Nexus
Строка: эхо у | cacls C: \ windows.old / T / G Каждый: F Должен быть: echo y | cacls C: \ windows.old / T / G Все: F Между <kbd> y </ kbd> и <kbd> | </ kbd> нет
пробела