web-dev-qa-db-ja.com

Hyper-V Server 2012 R2上のwindows.oldを適切に削除します

Hyper-V Server 2012がインストールされているサーバーにHyper-V Server 2012 R2をインストールしました。これを実行すると、標準のWindows.oldフォルダーが作成されました。そのフォルダを安全に削除したいと思います。完全なGUIでこれを行うための標準的な方法は、ディスククリーンアップを使用することですが、もちろん、Hyper-Vサーバーにはそのオプションはありません。

このシナリオでそのフォルダーを削除する正式な方法はありますか?これがServer Coreであるかどうかはわかりますが、デスクトップエクスペリエンスを含む完全なGUIをインストールできますが、フォルダーを完全に削除するだけでは、多くの意味がありません。

単にrmdir /sなどを実行するのではなく、質問する主な理由は、Windows.oldフォルダーに多数のジャンクションがあり、本番OSのコピーで何も壊したくないためです。これを行うことの一部。

22
MikeBaz - MSFT

最初にcleanmgr.exe(ディスククリーンアップツール)をコピーして実行しようとしましたが、Core/Hyper-V Serverに存在しないDLLへの依存が多すぎます。

代わりに、ディレクトリを手動で削除しました。

まず、すべてのジャンクションポイントとシンボリックリンクを削除しました。これを行うには、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に戻り、次の3つのコマンドを実行して、アクセス許可をクリアし、すべてのファイルを削除します。

 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はなくなり、システムはすべての古いジャンクションターゲットをそのまま使用して正常に動作しています。

23
Peter Hahndorf

私はピーター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
4
LikeARock47