我在安装了 Hyper-V Server 2012 的服务器上安装了 Hyper-V Server 2012 R2。当我这样做时,Windows.old
创建了标准文件夹。我现在想安全地删除该文件夹。使用完整 GUI 执行此操作的标准方法是使用磁盘清理,但我在 Hyper-V Server 上当然没有该选项。
在这种情况下,有没有正式的方法来删除该文件夹?我知道如果这是服务器核心,我可以安装包括桌面体验在内的完整 GUI,但只是为了干净地删除一个文件夹,那就太荒谬了。
我之所以询问而不是直接去做rmdir /s
或诸如此类的事情,主要原因是该Windows.old
文件夹有很多连接点,而且我不想在执行此操作时破坏生产操作系统副本中的任何东西。
答案1
我首先尝试复制并运行 cleanmgr.exe(磁盘清理工具),但是它对 Core/Hyper-V Server 中不存在的 DLL 有太多依赖性。
因此我手动删除了该目录。
首先,我删除了所有连接点和符号链接。为此,我使用了连接点来自 SysInternals。将 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 现在已经消失,并且系统运行良好,所有旧的连接目标都完好无损。
答案2
我使用了 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