如何编写脚本来统计特定月份内修改的文件数量?

如何编写脚本来统计特定月份内修改的文件数量?

我使用 PowerShell 命令来计算过去 30 天内修改的 ZIP 文件数量,如下所示:

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

然而,我编写这个脚本的真正目的是获取上个月修改的文件数量。显然,这个脚本有几个缺点。

  • 每当我运行脚本时,我都必须计算从现在到上个月开始的天数,然后相应地编辑脚本。
    • 我知道无论如何我每次可能都必须编辑脚本,但必须计算天数而不是仅指定月份有点令人厌烦。
  • 该脚本还将捕获当前月份内修改的所有文件。

有没有办法可以修改此命令,以便它仅选择在具体的个月,或者这只是 PowerShell 的一个限制?

如果脚本可以针对特定月份进行定位,那么也可以将其写入自动定位前一个月,以便我不必每次都进行修改吗?


编辑:非常感谢 zdan 的帮助,也感谢 Google 帮助我解决其他一些问题。我想我会在这里发布我的完整最终脚本,以防有人感兴趣。

此脚本统计目标目录中上个月修改过的 ZIP 文件。前面的 IF/ELSE 语句有助于解释当前月份为 1 月的情况。此脚本还依赖于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

powershell 的优点在于你可以获得完整的 .NET 对象以供检查。对于日期,powershell 使用约会时间您可以利用以下公开的月份和年份属性的类:

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

重要提示:如果您在一月份运行,上述操作将不起作用。届时您需要相应地调整年份和月份。

相关内容