none
Power shell - Criar um script para Deletar arquivos comparando a data mais antiga pelo nome do arquivo , ex: APPYYYYMMDD.txt , APPYYYYMMMDD.txt RRS feed

  • Pergunta

  • $YourDirectory = "C:\Temp\"
    $Threshold = (get-date).adddays(-2)
    $CleanupList = Get-ChildItem $YourDirectory |
        Where-Object {($_.Name -match 'APP\d{8}.txt') -and ($_.LastWriteTime -lt $Threshold)}
    
    ForEach ($FileName in $CleanupList) {
        Remove-ItemProperty -WhatIf $Filename.FullName -Force 
    
    }

    Consegui chegar até esse código, porém ao rodar o script não recebo mensagem de erro e nem deleta o arquivo com o nome de data mais antiga.



    quinta-feira, 10 de novembro de 2016 15:11

Respostas

  • $YourDirectory = "C:\Temp\"
    
    $Threshold = ((get-date).adddays(-2))
    
    $CleanupList = Get-ChildItem $YourDirectory |
       
    
    ForEach ($FileName in $CleanupList) {
        $date = ([datetime]::ParseExact((($FileName.Name.TrimEnd(".txt")).Substring($FileName.Name.Length - 12)), "yyyyMMdd", $null))
        if ($date -lt $Threshold) {
            Remove-Item $Filename.FullName -Force
        }
    }
    Conclusão. 
    • Editado JORGEMIGUELR10 segunda-feira, 14 de novembro de 2016 17:07
    • Marcado como Resposta JORGEMIGUELR10 quarta-feira, 16 de novembro de 2016 12:05
    segunda-feira, 14 de novembro de 2016 14:36

Todas as Respostas

  • Tente isto:

    $YourDirectory = "C:\Temp\"
    $Threshold = (get-date).adddays(-2)
    $CleanupList = Get-ChildItem $YourDirectory |
        Where-Object {($_.Name -match 'APP\d{8}.txt') -and ($_.LastWriteTime -lt $Threshold)}
    
    ForEach ($FileName in $CleanupList) {
        Remove-Item $Filename.FullName -Force
    
    }

    quinta-feira, 10 de novembro de 2016 16:28
  • Olá, 

    $YourDirectory = "C:\Temp\"
    $Threshold = (get-date).adddays(-2)
    $CleanupList = Get-ChildItem $YourDirectory |
        Where-Object {($_.Name -match 'APP\d{8}.txt') -and ($_.LastWriteTime -lt $Threshold)}
    
    ForEach ($FileName in $CleanupList) {
        Remove-Item $Filename.FullName -Force
        
    }

    Recebi o seguinte erro:

    Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
    At F:\dd.ps1:7 char:16 erro na linha  Remove-Item $Filename.FullName -Force


    quinta-feira, 10 de novembro de 2016 18:39
  • Estranho, pra mim funcionou. Poderia explicar melhor o que você necessita? Não ficou claro só com o título.

    Tente isso para ver se está listado os arquivos que devem ser apagados:

    ForEach ($FileName in $CleanupList) {
        Write-Host $Filename.FullName
      
    }

    quinta-feira, 10 de novembro de 2016 20:37
  • Não recebi mensagem de erro.

    Eu tenho diversos arquivos que são criados com o nome de data exemplo; APP20161111.txt,  APP20161110.tx,  APP20161109.tx .....

    Eu quero deletar o arquivo com o nome de data mais antigos por 2 dias, no caso seguindo o exemplo removeria o arquivo APP20161109.tx.

    Where-Object {($_.Name -match 'APP\d{8}.txt') -and ($_.LastWriteTime -lt $Threshold)}

    sexta-feira, 11 de novembro de 2016 14:16
  • Se a data de modificação coincidir com a data do nome do arquivo, basta: 

    $YourDirectory = "C:\teste\"
    $Threshold = (get-date).adddays(-2)
    $dataAtual = (Get-Date -Format yyyyMMdd)
    $CleanupList = Get-ChildItem $YourDirectory |
        Where-Object {($_.LastWriteTime -lt $Threshold)}
    
    ForEach ($FileName in $CleanupList) {
        Remove-Item $Filename.FullName -Force
    }

    sexta-feira, 11 de novembro de 2016 14:55
  • Se quiser levar em conta apenas o nome do arquivo:

    $YourDirectory = "C:\teste\"
    
    $Threshold = ((get-date).adddays(-2))
    
    $CleanupList = Get-ChildItem $YourDirectory |
        Where-Object {($_.Name -match 'APP\d{8}.txt')}
    
    ForEach ($FileName in $CleanupList) {
        $date = ([datetime]::ParseExact(($FileName.Name.TrimEnd(".txt").TrimStart("APP")), "yyyyMMdd", $null))
        if ($date -lt $Threshold) {
            Remove-Item $Filename.FullName -Force
        }
    }

    • Editado J. Maurício sexta-feira, 11 de novembro de 2016 16:10 correção
    • Marcado como Resposta JORGEMIGUELR10 sexta-feira, 11 de novembro de 2016 18:32
    • Não Marcado como Resposta JORGEMIGUELR10 quarta-feira, 16 de novembro de 2016 12:05
    sexta-feira, 11 de novembro de 2016 16:07
  • Obrigado! 

    O script funcionar com sucesso.

    Nesse código conseguimos adicionar mais nomes de arquivos ex: APPyyyymmmdd.txt, docyyyymmdd.txt, FATyyyymmdd??

    Ou 

    Fazer um parser para ler apenas os 8 ultimos caracter.

    sexta-feira, 11 de novembro de 2016 18:36
  • Assim:

    $YourDirectory = "C:\teste\"
    
    $Threshold = ((get-date).adddays(-2))
    
    $CleanupList = Get-ChildItem $YourDirectory |
        Where-Object {($_.Name -match '\d{8}.txt')}
    
    ForEach ($FileName in $CleanupList) {
        $date = ([datetime]::ParseExact((($FileName.Name.TrimEnd(".txt")).Remove(0,3)), "yyyyMMdd", $null))
        if ($date -lt $Threshold) {
            Remove-Item $Filename.FullName -Force
        }
    }



    • Editado J. Maurício sexta-feira, 11 de novembro de 2016 18:55
    • Marcado como Resposta JORGEMIGUELR10 sexta-feira, 11 de novembro de 2016 19:23
    • Não Marcado como Resposta JORGEMIGUELR10 quarta-feira, 16 de novembro de 2016 12:05
    • Sugerido como Resposta J. Maurício sexta-feira, 18 de novembro de 2016 09:16
    sexta-feira, 11 de novembro de 2016 18:52
  • Obrigado novamente.

    Esse script já resolveu o meu problema.

    Só para estudo e conhecimento, poderia me dar um exemplo de como o código ficaria para analisar apenas os 8 últimos caracteres, assim o script ficara bem funcional.



    sexta-feira, 11 de novembro de 2016 19:28
  • $YourDirectory = "C:\Temp\"
    
    $Threshold = ((get-date).adddays(-2))
    
    $CleanupList = Get-ChildItem $YourDirectory |
       
    
    ForEach ($FileName in $CleanupList) {
        $date = ([datetime]::ParseExact((($FileName.Name.TrimEnd(".txt")).Substring($FileName.Name.Length - 12)), "yyyyMMdd", $null))
        if ($date -lt $Threshold) {
            Remove-Item $Filename.FullName -Force
        }
    }
    Conclusão. 
    • Editado JORGEMIGUELR10 segunda-feira, 14 de novembro de 2016 17:07
    • Marcado como Resposta JORGEMIGUELR10 quarta-feira, 16 de novembro de 2016 12:05
    segunda-feira, 14 de novembro de 2016 14:36
  • Olá. Foi um prazer. Pena você ter desmarcado uma resposta válida que lhe ajudou.
    • Editado J. Maurício quarta-feira, 16 de novembro de 2016 14:42
    quarta-feira, 16 de novembro de 2016 12:16