在Hyper-V Server 2012 R2上正确删除windows.old


22

我已经在装有Hyper-V Server 2012的服务器上安装了Hyper-V Server 2012 R2。执行此操作后,便Windows.old创建了标准文件夹。我现在想安全地删除该文件夹。使用完整的GUI进行此操作的标准方法是使用“磁盘清理”,但当然在Hyper-V Server上我没有该选项。

在这种情况下,有没有正式的方法可以删除该文件夹?我知道这是否是Server Core,我可以安装包括桌面体验在内的完整GUI,但这只是为了干净地删除文件夹而带来的很多废话。

我问这个问题的主要理由(而不是仅仅这样做)rmdir /s是因为该Windows.old文件夹有很多连接,并且我不想破坏生产OS副本中的任何内容。


我阅读了cleanmgr.exe可以在命令行中运行...不确定这是否适用于服务器核心或2012 ???
约翰,

Answers:


23

我首先尝试复制并运行cleanmgr.exe(磁盘清理工具),但是它对DLL的依赖过多,而DLL在Core / Hyper-V Server中不存在。

因此,我手动删除了该目录。

首先,我删除了所有连接点和符号链接。为此,我使用了SysInternals的junction.exe。将exe复制到您路径中的目录中。我运行它来获取所有路口的列表:

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中的所有相关行
Peter Hahndorf

看来效果不错,谢谢!我现在也知道takeown存在,对此我有些尴尬地承认我不知道。
MikeBaz-MSFT 2013年

1
为什么在删除文件夹之前需要手动删除连接点?连接点存储在文件系统中,因此一定会与文件夹一起删除...?
阿什利2013年

3
@AshleySteel-因为当保持连接时,诸如takeown之类的命令会失败。错误信息:INFO:系统找不到指定的路径。(“ 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 \ Application Data \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly“)错误:文件名,目录名称或卷标签语法不正确。-对我来说,这似乎是递归问题,并且在文件路径过长时停止。
彼得·汉道夫

4

我使用了Peter H的答案并确认它确实有效,但是我需要在多台服务器上执行此操作,因此我将其代码修改为一个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

是的,这很有效。别忘了提升powershell.exe权限(“以管理员身份运行”)
Nexus 2015年

行:echo y | cacls C:\ windows.old / T / G Everyone:F应该是:echo y | cacls C:\ windows.old / T / G Everyone:F <kbd> y </ kbd>和<kbd> | </ kbd>之间没有空格
user437960
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.