Por que o comando forfiles lista arquivos com menos de um dia, apesar de o comando ser diferente?

1

O comando que estou executando é forfiles -p"C:\testdata" -m*.* -d-1 -c"cmd /c echo @PATH\@FILE"

Eu especifiquei que gostaria de listar apenas arquivos com um dia de vida, no entanto, quando executo a instrução, ela me retorna uma lista de arquivos que foram criados hoje.

Por que isso? Estou fazendo algo errado? Seria melhor especificar um período de tempo em oposição a uma data? 24 horas?

A versão do forfiles que tenho é a seguinte: FORFILES v 1.1 - [email protected] - 4/98 . O arquivo em lote está sendo executado no Windows XP.

    
por PeanutsMonkey 18.09.2012 / 21:42

4 respostas

1

Forfiles versão que você usa não é um comando nativo do XP. É uma versão mais antiga do utilitário, que foi originalmente distribuído com um dos W2K Resource Kits (acho que vai mesmo para o NT Resource kit, embora eu não tenho certeza). Não há nada de errado em usar isso no XP, mas se você olhar de perto a sua sintaxe, ele diz (ênfase minha):

-d[+|-][DDMMYY|DD] Select files with date >= or <=DDMMYY (UTC) or files having date >= or <= (current date - DD days)

Anote UTC na descrição. Isso significa que (1.1) forfiles usa registros de data e hora diferentes que você acha que faz - a menos que a hora do sistema seja UTC (sem deslocamento), sem horário de verão. Isso provavelmente será mais fácil com um exemplo. Sou UTC + 1, horário de verão.
(data de hoje - 2012-09-19)

  • Crie um arquivo e faça um dir:

2012-09-19 00:14 5 zzz_utc.txt

tem data de hoje, por isso não deve ser selecionado por forfiles, vamos verificar:

FORFILES -pc:\temp -mzzz_utc.* -d-1 -c"CMD /C Echo @FILE"
zzz_utc.txt

Mas ele é selecionado! Por quê? Vamos ver os tempos UTC do arquivo (o seguinte comando é executado no powershell):

ls .\zzz_utc.txt |select LastAccessTime,LastAccessTimeUTC

LastAccessTime                          LastAccessTimeUtc
--------------                          -----------------
2012-09-19 00:15:11                     2012-09-18 22:15:11

Como você pode ver, TimeUtc - o usado por (1.1) forfiles é de ontem! É por isso que ele é selecionado pela ferramenta.

    
por 19.09.2012 / 00:57
1

"... desejo listar apenas arquivos com um dia de idade ..."

Você quer dizer "arquivos que foram criados ontem"? Ou seja, (hoje sendo 18 de setembro), arquivos cuja data / hora de modificação é ≥ 0000 (meia-noite no início da manhã de) 17 de setembro, e ≤ 2359.60 (meia-noite no final de) 17 de setembro. restrições de tempo, e forfiles não permite que você especifique mais de um. Conclusão: acredito que forfiles não fará isso.

... No entanto, quando tento /d -1 na minha caixa do Windows 7, obtenho arquivos que foram criados ontem ou antes. Então, talvez a versão do forfiles do Windows XP esteja quebrada.

    
por 18.09.2012 / 22:41
1

A partir da documentação detalhada (ênfase minha):

Selects files with a last modified date later than or equal to (+) the current date plus the number of days specified, or earlier than or equal to (-) the current date minus the number of days specified.

Editar:

Talvez você possa tentar com um VBScript:

Set args = WScript.Arguments.Named
Set fso  = CreateObject("Scripting.FileSystemObject")

d = 0
p = "."

If args.Exists("?") Or args.Count = 0 Then
  WScript.Echo "Usage: cscript " & WScript.ScriptName & " [/d:DAYS] [/p:PATH]"
  WScript.Quit(0)
End If

If args.Exists("d") Then d = args("d")
If args.Exists("p") Then p = args("p")

refDate = DateAdd("d", d, Now)
TraverseFolders fso.GetFolder(p)

Sub TraverseFolders(fldr)
  For Each f In fldr.Subfolders
    TraverseFolders(f)
  Next
  For Each f In fldr.Files
    If f.DateLastModified < refDate Then
      WScript.StdOut.WriteLine f.Path
      'f.Delete
    End If
  Next
End Sub
    
por 18.09.2012 / 21:46
0

Parece que FORFILES / D -1 tem um bug mesmo no Windows 8 e no Windows Server 2008 R2 (não é possível fazer isso - seleciona todos os arquivos - em um sistema com datas em grego)

Você pode analisar o% date% como sugerido em algum comentário acima, mas observe que no Windows 8, por exemplo, a data está mostrando três letras com o nome do dia e um caractere de espaço primeiro e depois o formato de data clássico. Também essa data estará em formato localizado, enquanto FORFILES / D espera uma data no formato dd / MM / aaaa de acordo com forfiles /? (pelo menos no Win8).

CORREÇÃO: parece haver um mal-entendido (por mim e por outros que também julgam a partir de uma pesquisa na net) sobre o que / D -dd faz, parece que ele não procura por arquivos com dd dias, mas ser mais velho que dd dias

então você precisa usar a sintaxe / D + dd / MM / yyyy de FORFILES e passar a data de ontem para encontrar todos os arquivos com data maior que ontem. Para automatizar isso você poderia usar% date% e analisá-lo com% date: ~ 7,2% /% date: ~ 4,2% /% date: ~ -4% ou algo parecido (pode ser necessário reordenar as partes da data lá, dependendo da sua localidade)

    
por 16.07.2014 / 12:47