2015-10-01 2 views
-1

Мне нужен пакетный файл/скрипт/инструмент для удаления указанных файлов в папке. У меня есть папка с большим количеством XML-файлов. Он может содержать файлы с разницей в несколько символов (с указанием даты).Сценарий/инструмент для удаления указанного имени файла

aa_bb_000000001_2015_9_1.xml 
aa_bb_000000001_2015_9_15.xml 
aa_bb_000000001_2015_10_1.xml 

aa_bb_000000002_2015_5_5.xml 
aa_bb_000000002_2015_8_14.xml 
aa_bb_000000002_2015_10_1.xml 

aa_bb_000000005_2015_7_7.xml 
. 
. 

Длина этой части 15 строка

aa_bb_000000001 

Эта часть представляет собой дату

2015_10_1 

Мне нужно удалить все файлы, часть имени с датой является ранний. В результате партии должны остаться только файлы:

aa_bb_000000001_2015_10_1.xml

aa_bb_000000002_2015_10_1.xml

aa_bb_000000005_2015_7_7.xml

.

.

+1

Вы должны опубликовать то, что вы так далеко, а затем люди могут помочь вам заставить его работать. Не ожидайте, что люди сообщества сделают для вас работу .... – jpo38

+0

Я не понимаю этого: «Мне нужно удалить все файлы, часть которых с датой будет самой ранней.» И результат. Это не соответствует. –

+0

@dark клык Из этих файлов aa_bb_000000001_2015_9_1.xml , aa_bb_000000001_2015_9_15.xml, aa_bb_000000001_2015_10_1.xml, который должен быть удален aa_bb_000000001_2015_9_1.xml , aa_bb_000000001_2015_9_15.xml потому что имеет более раннюю дату в имени файла (2015_9_1 и 2015_9_15). – Artec

ответ

0

Вот одно из решений, которое довольно короткое. Чтобы понять, как работает код, было бы лучше, чтобы сосредоточиться на том, что делает команда Group-Object, то, что регулярные выражения, и как они взаимодействуют с -match оператора:

$Groups = Get-ChildItem "C:\XMLFiles\*.xml" | Group-Object {$_.Name.Substring(0, 15)} 
$FilesToKeep = @{} 
foreach ($Group in $Groups) { 
    $MaxDate = "00000000" 
    foreach ($FileInfo in $Group.Group) { 
     $FileInfo.name -match "(\d{4})_(\d{1,2})_(\d{1,2}).xml$" | Out-Null 
     $Date = $Matches[1]+([int]$Matches[2]).ToString("00")+([int]$Matches[3]).ToString("00") 
     if ($Date -gt $MaxDate) { 
      $MaxDate = $Date 
      $FilesToKeep[$Group.Name] = $FileInfo.FullName 
     } 
    } 
} 
Get-ChildItem "C:\XMLFiles\*.xml" | Where-Object {-not $FilesToKeep.ContainsValue($_.FullName)} | Remove-Item 
+0

Скрипт работает так, как должен. Я попытаюсь проанализировать, чтобы понять, как это работает. Большое вам спасибо за вашу работу и ваше время написания! – Artec

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