Remova corretamente o windows.old no Hyper-V Server 2012 R2

22

Instalei o Hyper-V Server 2012 R2 em um servidor com o Hyper-V Server 2012. Quando fiz isso, a Windows.oldpasta padrão foi criada. Agora eu gostaria de remover essa pasta com segurança. A maneira padrão de fazer isso com uma GUI completa seria usar a Limpeza de disco, mas é claro que não tenho essa opção no Hyper-V Server.

Existe uma maneira formal de remover essa pasta nesse cenário? Sei que esse era o Server Core, eu poderia instalar a GUI completa, incluindo o Desktop Experience, mas isso seria muita bobagem apenas para remover uma pasta de forma limpa.

Meu principal motivo para perguntar, em vez de fazer rmdir /sou algo parecido, é que a Windows.oldpasta possui muitas junções e não quero interromper nada na cópia do SO de produção como parte disso.

MikeBaz - MSFT
fonte
Eu li cleanmgr.exe pode ser executado na linha de comando ... Não tenho certeza se isso se aplica ao núcleo do servidor ou 2012 ???
john

Respostas:

23

Tentei primeiro copiar e executar o cleanmgr.exe (ferramenta de limpeza de disco), mas ele tem muitas dependências de DLLs que não estão presentes no Core / Hyper-V Server.

Então, em vez disso, excluí o diretório manualmente.

Primeiro, removi todos os pontos de junção e links simbólicos. Para fazer isso, usei o junction.exe do SysInternals. Copie o exe para um diretório em seu caminho. Eu o executei para obter uma lista de todas as junções:

c:\tools\junction.exe -s -q C:\windows.old > %temp%\junc.txt

Abri um PowerShell:

start powershell.exe

e executou o seguinte script para encontrar as linhas relevantes e executar o junction.exe novamente:

 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"
     }
 }

Isso removeu todos os pontos de junção e o único link simbólico no meu sistema.

de volta ao cmd.exe Agora executei três comandos para limpar permissões e excluir todos os arquivos:

 takeown /F C:\windows.old /R /D Y
 cacls C:\windows.old /T /G Everyone:F
 rd /s /q C:\windows.old

No meu teste, instalei um novo servidor Hyper-V 2012 e, em seguida, atualizei para o 2012 R2, o Windows.old se foi e o sistema está funcionando bem com todos os destinos de junção antigos intactos.

Peter Hahndorf
fonte
Qual era o conteúdo do junc.Txt? Você pode publicá-lo em pastebin? Estou curioso para saber se algo de interesse está relacionado.
longneck
pastebin.com/pYBGR4ap tem todas as linhas relevantes de junc.txt
Peter Hahndorf
Parece ter funcionado bem, obrigado! Agora também sei que takeownexiste, o que me deixa um pouco envergonhado de admitir que não sabia.
MikeBaz - MSFT
1
Por que seria necessário remover manualmente os pontos de junção antes de excluir a pasta? Os pontos de junção são armazenados no sistema de arquivos, então com certeza seriam excluídos junto com a pasta ...?
Ashley
3
@AshleySteel - Porque, ao manter as junções, comandos como takeown falham. Aqui está o erro: INFO: O sistema não consegue encontrar o caminho especificado. ("C: \ windows.old \ Documentos e configurações \ Todos os usuários \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") ERRO: O nome do arquivo, o nome do diretório ou a sintaxe do rótulo do volume está incorreta. - isso parece um problema de recursão para mim e para quando o caminho do arquivo fica muito longo.
Peter Hahndorf
4

Eu usei a resposta de Peter H e confirmei que funciona, no entanto, precisava fazer isso em vários servidores, então modifiquei o código dele em um script do PowerShell que pode ser executado localmente ou via PS remoting de outra máquina. Este é o arquivo .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
LikeARock47
fonte
Sim, este funciona um prazer. Não se esqueça de elevar privilégios Powershell.exe ( "Executar como administrador")
Nexus
Linha: eco y | cacls C: \ windows.old / T / G Todos: F Deve ser: eco y | cacls C: \ windows.old / T / G Todos: F Sem espaço entre <kbd> y </ kbd> e <kbd> | </ kbd>
user437960