我已经在装有Hyper-V Server 2012的服务器上安装了Hyper-V Server 2012 R2。当我这样做时,创build了标准的Windows.old文件夹。 我现在想要安全地删除该文件夹。 使用完整的GUI来完成这项工作的标准方法是使用磁盘清理,但当然在Hyper-V服务器上我没有这个选项。
在这种情况下是否有正式的方法来删除该文件夹? 我知道如果这是服务器核心,我可以安装完整的graphics用户界面,包括桌面体验,但这将是很多胡说,只是干净地删除一个文件夹。
我问的主要原因,而不是仅仅做rmdir /s或者其他一些,就是Windows.old文件夹有很多的连接点,我不想在生产操作系统副本中破坏任何东西,作为这样做的一部分。
我首先尝试复制并运行cleanmgr.exe(磁盘清理工具),但它对Core / Hyper-V服务器中不存在的DLL依赖性过多。
所以相反,我手动删除目录。
首先,我删除了所有的交汇点和符号链接。 为此,我使用SysInternals中的junction.exe 。 将exe复制到path中的一个目录中。 我跑它得到所有路口的名单:
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 /FC:\windows.old /R /DY cacls C:\windows.old /T /G Everyone:F rd /s /q C:\windows.old
在我的testing中,我安装了一个新的Hyper-V服务器2012,然后升级到2012 R2,Windows.old现在不见了,系统运行良好,所有旧的联结目标都完好无损。
我使用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 /FC:\windows.old /R /DY echo y | cacls C:\windows.old /T /G Everyone:F rm C:\windows.old -recurse -force rm "$env:temp\juncts.txt" -force
线:
echo y | cacls C:\windows.old /T /G Everyone:F
应该:
echo y| cacls C:\windows.old /T /G Everyone:F
y和|之间没有空格