¿Cómo puedo escribir un script para contar los archivos modificados dentro de un mes en particular?

Utilizo un comando de PowerShell para contar archivos ZIP modificados en los últimos 30 días ish, que va algo como esto:

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

Sin embargo, mi verdadera intención con este script es obtener una cuenta de los archivos modificados en el mes anterior. Obviamente, este guión tiene un par de debilidades.

  • Cada vez que ejecuto el script, tengo que calcular los días entre ahora y el comienzo del mes anterior y luego editar el guión en consecuencia.
    • Reconozco que podría tener que editar el script cada vez de todos modos, pero tener que contar días en lugar de sólo especificar un mes es un poco molesto.
  • El script también captura los archivos modificados dentro del mes actual.

¿Hay alguna manera de modificar este comando para que solo seleccione los archivos modificados dentro de un mes específico , o es sólo una limitación de PowerShell?

Si la secuencia de comandos se puede hacer para orientar un mes específico, también se puede escribir para auto-objetivo el mes anterior, así que no tengo que modificarlo cada vez?


EDIT: Muchas gracias a Zdan por la ayuda aquí, y también a Google por caminar conmigo a través de algunos otros temas. Supuse que publicaría mi guión completo aquí, en caso de que alguien estuviera interesado.

Este script cuenta con archivos ZIP en el directorio de destino que se modificaron en el mes anterior. La declaración IF / ELSE temprano ayuda a explicar los casos en los que el mes actual es enero. Esta secuencia de comandos también depende de un archivo denominado Targets.txt , en la carpeta de trabajo actual, en el que se pueden enumerar uno o varios sistemas de destino (un nombre de máquina o IP por línea). El script maneja y registra los errores con gracia si un sistema o carpeta de destino no está disponible y todos los resultados se envían a un archivo de texto (fechado con el mes / año de destino) en la carpeta de trabajo actual. También he hecho ajustes para compatibilidad con versiones de PowerShell antes de 3, donde (gci).count no devolverá nada cuando el valor debe ser cero o uno. (Resuelto en esta pregunta .)

 $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' 

La belleza de powershell es que obtienes objetos .NET completos que puedes inspeccionar. En el caso de las fechas, powershell utiliza la clase DateTime que expone las propiedades de mes y año de las que puede beneficiarse:

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

Importante: Lo anterior no funcionará si lo ejecuta en enero. Tendrá que ajustar el año y el mes en consecuencia cuando suceda.