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

Mik*_*SFT 23 windows-server-core hyper-v-server-2012

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

在这种情况下,是否有正式的方法来删除该文件夹?我知道如果这是服务器核心,我可以安装包括桌面体验在内的完整 GUI,但是仅仅为了干净地删除一个文件夹,这将是很多废话。

我提出这个问题的主要原因,而不是仅仅做rmdir /s或类似的事情,是Windows.old文件夹有很多连接点,我不想破坏生产操作系统副本中的任何内容作为这样做的一部分。

Pet*_*orf 24

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

所以我手动删除了目录。

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

c:\tools\junction.exe -s -q C:\windows.old > %temp%\junc.txt
Run Code Online (Sandbox Code Playgroud)

我打开了一个 PowerShell:

start powershell.exe
Run Code Online (Sandbox Code Playgroud)

并运行以下脚本以查找相关行并再次执行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"
     }
 }
Run Code Online (Sandbox Code Playgroud)

这删除了我系统上的所有连接点和单个符号链接。

回到 cmd.exe 我现在执行三个命令来清除权限并删除所有文件:

 takeown /F C:\windows.old /R /D Y
 cacls C:\windows.old /T /G Everyone:F
 rd /s /q C:\windows.old
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我安装了一个新的 Hyper-V 服务器 2012,然后升级到 2012 R2,Windows.old 现在消失了,系统运行良好,所有旧的连接目标都完好无损。

  • @AshleySteel - 因为在保持路口时,像 takeown 这样的命令会失败。这是错误:信息:系统找不到指定的路径。( "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") 错误:文件名、目录名或卷标语法不正确。- 这对我来说似乎是一个递归问题,当文件路径太长时它会停止。 (3认同)

小智 6

我使用了 Peter H 的回答并确认它确实有效,但是我需要在多台服务器上执行此操作,因此我将他的代码修改为可以在本地或通过 PS 远程从另一台机器执行的 powershell 脚本。这是 .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
Run Code Online (Sandbox Code Playgroud)