2

Я пытаюсь написать скрипт Powershell, который проверяет определенную папку на наличие ZIP-файлов. Файлы .zip содержат информацию из определенных резервных копий. Эти файлы .zip лежат в дереве папок для различных заводов, которыми владеет наша компания. Каждый день в нижней части этого дерева папок должен быть новый файл .zip, который хранится в течение 7 дней.

В идеале каждая папка должна содержать 7 дней подряд резервных копий, равных 7 ZIP-файлам в каждой папке. Иногда их больше 7, а иногда 0 в зависимости от проблемы, с которой сталкивается завод.

Я хочу (и испытываю затруднения) написать скрипт, который проверяет эти папки на наличие этих ZIP-файлов и сообщает, нет ли там файлов за последние семь дней. (Это нормально, если нет точно 7).

Пока у меня есть следующий код:

Get-ChildItem -filter "*.zip" -recurse -path C:\ArcherBackup\ | where {($_.CreationTime -gt ((get-date).AddDays(-7)))}

Но этот код выводит список всех файлов, которые мне приходится просматривать вручную.

Я бы хотел, чтобы скрипт более или менее выделил каталог, в котором нет файла .zip, возраст которого не менее 7 дней.

Любая помощь или руководство приветствуется.

2 ответа2

1

Ваш фрагмент вернет все файлы, созданные за последние семь дней.

$_.CreationTime -gt ((get-date).AddDays(-7))

Я думаю, что вы хотите вернуть файлы старше семи дней, поэтому измените -gt на -lt:

$_.CreationTime -lt ((get-date).AddDays(-7))

При использовании сравнений рекомендуется всегда использовать меньше операторов, поэтому условное увеличение увеличивается слева направо, как по оси X, и это помогает в удобочитаемости / понимании.

0 -lt x -and x -lt 10

Становится очевидным, что x должен находиться между 0 и 10.

1

var 1, командная строка, подкаталог, который не содержит ZIP-файл, возраст которого не менее 7 дней:

powershell $tm=(get-date).AddDays(-7);ls "C:\ArcherBackup" -fo -r^|?{$_.PSIsContainer}^|%{ls "$($_.FullName)" -fo -fi *.zip}^|?{$_.CreationTime -lt $tm}^|group Directory^|FT -H Name

var 2, командная строка, подкаталог, который не содержит ZIP-файл, возраст которого не менее 7 дней;

кроме скрытых файлов и каталогов:

powershell $tm=(get-date).AddDays(-7);ls "C:\ArcherBackup" -r^|?{$_.PSIsContainer}^|%{ls "$($_.FullName)" -fi *.zip}^|?{$_.CreationTime -lt $tm}^|group Directory^|FT -H Name

пустые подпапки без файлов:

powershell $d=ls -r^|?{$_.PSIsContainer};$d^|?{$_.GetFiles().Count -eq 0}^|FT -H FullName

подпапки без zip-файлов:

powershell $d=ls -r^|?{$_.PSIsContainer};$d^|?{$_.GetFiles('*.zip').Count -eq 0}^|FT -H FullName

подпапки без zip-файлов;

подкаталог, который не содержит ZIP-файл, возраст которого не менее 7 дней:

powershell $d=ls "C:\ArcherBackup" -fo -r^|?{$_.PSIsContainer};$tm=(get-date).AddDays(-7);$d^|%{ls "$($_.FullName)" -fo -fi *.zip}^|?{$_.CreationTime -lt $tm}^|group Directory^|FT -Au -H Name, Count;$d^|?{$_.GetFiles('*.zip').Count -eq 0}^|FT -H FullName|findstr [/s]| more

|findstr [/s]| - удалить пустую строку в трубе

FT - псевдоним Format Table

FT -H FullName - выходной формат, выберите только FullName

-Au псевдоним -Autosize

-H скрыть заголовок,

? - псевдоним where - псевдоним Where-Object

% - псевдоним foreach - псевдоним ForEach-Object

-fo - псевдоним -force , fi - псевдоним -filter , -r - псевдоним -recurse

^ - экранирующий символ | - текущая оболочка не обрабатывается как pipeline команда

group - псевдоним Group-Object

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .