2016-06-24 5 views
1

У меня есть сценарий в PowerShell, который сканирует каталог папок, имена которых названы по следующему соглашению: yyyymmdd. Он сканирует каталог и находит все папки, которые являются текущими, и до одной недели, а затем копирует их в другой каталог. После того, как он скопирует их в другой каталог, я хотел бы, чтобы он удалял папки в новом каталоге, которые называются одинаково и старше 18 месяцев. Будет ли простой способ сделать это? Я вставил скрипт ниже.Удаление файлов с помощью сценария PowerShell

$targetdirectory = "\\DPR320-W12-1600\PRTG" 
$sourcedirectory = "C:\Users\Public\Documents\PRTG Traffic Grapher" 
$todaysdate=get-date 
$minusoneweek=$todaysdate.adddays(-7) 
$minusdate=($minusoneweek.Month).tostring(),($minusoneweek.day).tostring(),($minusoneweek.year).tostring() 
$todaysdatestring=($todaysdate.Month).tostring(),($todaysdate.day).tostring(),($todaysdate.year).tostring() 
$oldfilename=$minusdate[0]+$minusdate[1]+$minusdate[2]+" backup" 
$newfilename=$todaysdatestring[0]+$todaysdatestring[1]+$todaysdatestring[2]+" backup" 


Get-ChildItem $sourcedirectory\config | Where-Object { 
    $_.PsIsContainer -and 
    $_.BaseName -match '\d{6}' -and 
    ([DateTime]::ParseExact($_.BaseName, 'yyyyMMdd', $null) -gt (Get-Date).AddDays(-7)) 
} |Copy-Item -Recurse -Force -Destination $targetdirectory\$oldfilename\config 

Copy-Item -Force $sourcedirectory\config.csv -Destination $targetdirectory\$oldfilename 
Copy-Item -Force $sourcedirectory\config.prtg -Destination $targetdirectory\$oldfilename 

rename-item $targetdirectory\$oldfilename $newfilename 

ответ

0

Основываясь на вашем обсуждении с FoxDeploy: Это будет проходить через $ YourDirectory и проверять, соответствует ли имя дате, которая старше 18 месяцев. Используется для моей собственной очистки, за исключением того, что у меня есть имена в точечном формате.

$CleanupList = Get-ChildItem $YourDirectory 
$Threshold = (get-date).AddMonths(-18) 

foreach ($DirName in $CleanupList) 
{ 
    If (([datetime]::ParseExact($DirName.BaseName,'yyyyMMdd',$null)) -lt $Threshold) 
    { 
     Remove-Item $DirName.FullName -Force -Recurse 
    } 
} 
+0

У меня есть папки, которые не обязательно следуют этому соглашению имен. Как я могу заставить сценарий игнорировать их и сосредоточиться только на файлах, которые соответствуют названию? –

+0

Если вы можете привести несколько примеров, чтобы показать эту идею. До сих пор я могу только подумать о проверке того, действительно ли ParseExact смог получить дату из имени папки. –

0

Предполагая, что $targetDirectory содержит файлы, которые вы хотите удалить (тех, кто старше 18 месяцев), просто добавьте в конец вашего сценария:

#resolve this day, 18 months ago 
$18Months = (get-date).AddMonths(-18) 

#get the name in the right format (i.e. 20141224) 
$18MonthString = get-date -Date $18Months -UFormat "%Y%m%d" 

#find the files with a name like this and delete them 
$OldPrtgFiles = dir $targetDirectory | Where Name -like "$18MonthString*" 
$OldPrtgFiles | remove-item -whatif 

Первое исполнение будет отображаться -WhatIf чтобы показать, какие файлы будут удалены. Если вы довольны этим, удалите WhatIf.

+0

Благодарим за ответ! Это будет работать, однако время записи не будет 18 месяцев назад, так как некоторые файлы, которые являются старыми данными, были недавно скопированы в каталог. Как я могу определить, какие файлы удалить с помощью имени папки? Формат именования - это дата, на которую были сделаны данные, например, 20140624. Это будет имя папки для данных, сделанных 24.06.2012. –

+0

А, я вижу. Поэтому мы хотели бы удалить файлы с именем, похожим на 20141224 (18 месяцев назад) – FoxDeploy

+0

Поняли, посмотрите мой ответ прямо сейчас. – FoxDeploy

Смежные вопросы