Powershell: Script único para “limpar” várias pastas de arquivos com mais de

3

Eu gostaria de criar um script de manutenção que seria executado em cada um dos nossos servidores para limpar diretórios comuns de drop / archive. De preferência, o script usaria um arquivo de referência para o caminho da pasta e o limite de envelhecimento desejado. Em seguida, o script limparia o caminho dos arquivos mais antigos que o limite de duração. O arquivo de referência de entrada seria algo como isto:

c:\logs\iis\siteA\ 30
c:\logs\job1\ 60
e:\archive\clientA\ 90

O primeiro componente é o caminho do arquivo; e o segundo é o número de dias que os arquivos devem ser retidos, separados por um espaço.

Agora, para o script, tenho o seguinte; no entanto, sou embaraçosamente deficiente na experiência de criação de scripts. (sou mais orientado para redes)

#Attempted loop
Foreach ($ParentDir = Get-Content .\paths.txt $arg1, $arg2)
{$limit = (Get-Date).AddDays(-$arg2)
$path = $ParentDir

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force}

Eu sinto que a lógica está próxima, mas a minha sintaxe está desativada. A minha abordagem é factível? Existe uma maneira melhor? Você poderia ajudar com a sintaxe? Usando poweshell v3.

Crédito em que o crédito é devido a muita lógica que eu tirei de deadlydog de esta postagem

    
por MaCuban 19.02.2014 / 23:24

2 respostas

7

Editado para incluir o arquivo de texto solicitado de

c:\logs\iis\siteA\ -30
c:\logs\job1\ -60
e:\archive\clientA\ -90

Eu testei os novos pedaços de código separadamente do que eu tinha por aí, mas ainda assim deveria fazer o que você quer, eu acho.

$controlfile = "c:\path\to\yourfile.txt"    
$curr_date = Get-Date

New-Item -ItemType directory -Path f:\delete

foreach ($line in get-content $controlfile)
{
    $split = $line.split(" ")
    $file_path = $split[0]
    $max_days = $split[1]

    $del_date = $curr_date.AddDays($max_days)

    # move the files to the kill directory
    Get-ChildItem $file_path | Where-Object { $_.LastWriteTime -lt $del_date } |  Move-Item -destination "f:\delete"
}

O motivo pelo qual ele é movido para um diretório diferente é porque há aparentemente um bug em exclusões recursivas , e meus dados são muitos, muitos subdiretórios de profundidade, então uma vez que eu mudei tudo para o diretório kill, eu corro isto:

del /f/s/q f:\delete > nul
rmdir /s/q f:\delete

Se você não tiver esse problema, adicione-o ao final da parte superior do PowerShell:

$del_dir = "f:\delete"
$fso = New-Object -ComObject scripting.filesystemobject
$fso.DeleteFolder($del_dir)
    
por 19.02.2014 / 23:36
3

Você pode criar um cmdlet para isso, para que também possa usá-lo em sua linha de comando:

Cmdlet

param(
    [string]$folder,
    [int]$expiry
)

ls $folder | % { if ($_.LastWriteTime -le (date).AddDays(-$expiry)) { rm $_ -fo } }

Uso

.\script.ps1 -folder "c:\logs\iis\siteA\"  -expiry 30
.\script.ps1 -folder "c:\logs\job1\"       -expiry 60
.\script.ps1 -folder "e:\archive\clientA\" -expiry 90
    
por 21.02.2014 / 06:37