Como posso escrever um script para contar arquivos modificados dentro de um mês específico?

1

Eu uso um comando do PowerShell para contar arquivos ZIP modificados nos últimos 30 dias, algo assim:

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

No entanto, minha verdadeira intenção com esse script é obter uma contagem dos arquivos modificados no mês anterior. Obviamente, esse script tem algumas fraquezas.

  • Sempre que executo o script, preciso calcular os dias entre agora e o início do mês anterior e, em seguida, editar o script de acordo.
    • Eu reconheço que talvez eu tenha que editar o script toda vez, mas ter que contar dias em vez de apenas especificar um mês é um pouco trabalhoso.
  • O script também captura todos os arquivos modificados no mês atual.

Existe uma maneira de eu modificar este comando para que ele selecione apenas arquivos modificados dentro de um mês específico , ou isso é apenas uma limitação do PowerShell?

Se o script puder ser feito para segmentar um mês específico, ele também poderá ser gravado para segmentar automaticamente o mês anterior para que eu não precise modificá-lo sempre?

EDIT: Muito obrigado a Zdan pela ajuda aqui, e também ao Google por me orientar sobre outros assuntos. Eu pensei em postar meu roteiro completo aqui, caso alguém estivesse interessado.

Esse script conta arquivos ZIP no diretório de destino que foram modificados no mês anterior. A instrução IF / ELSE antecipada ajuda a contabilizar os casos em que o mês atual é janeiro. Esse script também depende de um arquivo chamado Targets.txt , na pasta de trabalho atual, no qual um ou vários sistemas de destino podem ser listados (um nome de máquina ou IP por linha). O script normalmente processa e registra erros se um sistema ou pasta de destino estiver inacessível, e todos os resultados serão enviados para um arquivo de texto (datado com o mês / ano de destino) na pasta de trabalho atual. Também fiz ajustes para compatibilidade com versões do PowerShell anteriores a 3, em que (gci).count não retornaria nada quando o valor deveria ser zero ou um. (Resolvido em esta questão .)

$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'
    
por Iszi 03.05.2013 / 19:28

1 resposta

1

A beleza do powershell é que você obtém objetos .NET completos que você pode inspecionar. No caso de datas, o powershell usa a classe DateTime que expõe as propriedades Mês e Ano que você pode aproveitar:

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

Importante: o acima não funcionará se você executá-lo em janeiro. Você precisará ajustar o ano e o mês de acordo quando isso acontecer.

    
por 03.05.2013 / 21:21