![如何编写脚本来统计特定月份内修改的文件数量?](https://linux22.com/image/1362130/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E8%84%9A%E6%9C%AC%E6%9D%A5%E7%BB%9F%E8%AE%A1%E7%89%B9%E5%AE%9A%E6%9C%88%E4%BB%BD%E5%86%85%E4%BF%AE%E6%94%B9%E7%9A%84%E6%96%87%E4%BB%B6%E6%95%B0%E9%87%8F%EF%BC%9F.png)
我使用 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
重要提示:如果您在一月份运行,上述操作将不起作用。届时您需要相应地调整年份和月份。