1

Я использую команду PowerShell для подсчета ZIP-файлов, измененных за последние 30 дней, что выглядит примерно так:

(gci "\\servername\sharename\foldername\subfoldername\*.zip" | where {$_.LastWriteTime -gt ((get-date)-(new-timespan -day 35))}).count

Тем не менее, мое истинное намерение с этим сценарием состоит в том, чтобы получить количество файлов, измененных в течение предыдущего календарного месяца. Очевидно, у этого скрипта есть пара слабых мест.

  • Всякий раз, когда я запускаю скрипт, мне нужно вычислять дни между началом и началом предыдущего месяца, а затем соответствующим образом редактировать скрипт.
    • Я понимаю, что мне, возможно, придется каждый раз редактировать скрипт, но подсчет дней вместо простого указания месяца немного утомителен.
  • Скрипт также будет перехватывать любые файлы, измененные в текущем месяце.

Есть ли способ изменить эту команду, чтобы она выбирала только файлы, измененные в течение определенного месяца, или это только ограничение PowerShell?

Если можно создать сценарий для определенного месяца, можно ли его также написать для автоматического нацеливания на предыдущий месяц, чтобы мне не приходилось каждый раз изменять его?


РЕДАКТИРОВАТЬ: Большое спасибо zdan за помощь здесь, а также Google за помощь в решении некоторых других вопросов. Я решил опубликовать свой полный, окончательный сценарий на случай, если кому-то будет интересно.

Этот скрипт подсчитывает ZIP-файлы в целевой директории, которые были изменены в течение предыдущего месяца. Заявление IF/ELSE на ранней стадии помогает учесть случаи, когда текущим месяцем является январь. Этот сценарий также зависит от файла с именем Targets.txt в текущей рабочей папке, в котором может быть указана одна или несколько целевых систем (одно имя компьютера или IP-адрес в строке). Сценарий корректно обрабатывает и регистрирует ошибки, если целевая система или папка недоступны, а все результаты выводятся в текстовый файл (с указанием целевого месяца / года) в текущей рабочей папке. Я также внес коррективы для совместимости с версиями PowerShell до 3, где (gci).count ничего не возвращает, когда значение должно быть равно нулю или единице. (Решено в этом вопросе.)

$ErrorActionPreference = 'Stop'
if ((get-date).Month -eq 1)
{
    $TargetMonth = 12
    $TargetYear = (get-date).Year-1
}
else
{
    $TargetMonth = (get-date).Month-1
    $TargetYear = (get-date).Year
}
echo "ZIP file counts for $TargetMonth/$TargetYear" | Out-File "$TargetMonth-$TargetYear ZIPs.txt"
echo "----------------------------------" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
echo "`n" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
foreach ($Target in gc 'Targets.txt')
{
    try
    {
        $ThisTarget = @(gci "\\$Target\c$\Folder\Subfolder\ZIPs\*.zip" | where {($_.LastWriteTime.Month -eq $TargetMonth) -and ($_.LastWriteTime.Year -eq $TargetYear)}).count
        $ZIPTotal += $ThisTarget
        echo "$Target has $ThisTarget ZIPs." | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
    }
    catch
    {
        echo "$Target could not be reached or ZIPs directory not found." | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
        $ZIPsErrors ++
    }
}
echo "----------------------------------" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
echo "`n" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
echo "The total number of ZIPs counted is $ZIPsTotal" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
echo "Total number of errors encountered is $ZIPsErrors" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
rv TargetMonth
rv TargetYear
rv Target
rv ThisTarget
rv ZIPsTotal
rv ZIPsErrors
$ErrorActionPreference = 'Continue'

1 ответ1

1

Прелесть PowerShell в том, что вы получаете полноценные .NET-объекты, которые вы можете проверить. В случае дат PowerShell использует класс DateTime, который предоставляет свойства месяца и года, которыми вы можете воспользоваться:

(gci "\\servername\sharename\foldername\subfoldername\*.zip" | 
    ?{ $lwt = $_.LastWriteTime; ($lwt.Month -eq ((get-date).Month-1)) -and (($lwt.Year -eq (Get-Date).Year))}).count

Важно: вышеуказанное не будет работать, если вы запустите его в январе. Вам нужно будет корректировать год и месяц соответственно, когда это произойдет.

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