forfiles 명령이 다른 명령임에도 불구하고 하루가 지나지 않은 파일을 나열하는 이유는 무엇입니까?

forfiles 명령이 다른 명령임에도 불구하고 하루가 지나지 않은 파일을 나열하는 이유는 무엇입니까?

내가 실행하는 명령은forfiles -p"C:\testdata" -m*.* -d-1 -c"cmd /c echo @PATH\@FILE"

하루가 지난 파일만 나열하도록 지정했지만 명령문을 실행하면 오늘 생성된 파일 목록이 반환됩니다.

왜 그런 겁니까? 내가 뭔가 잘못하고 있는 걸까요? 날짜 대신 기간을 지정하는 것이 더 낫습니까(예: 24시간)?

내가 갖고 있는 forfiles 버전은 다음과 같습니다 . 배치 파일이 Windows XP에서 실행되고 있습니다.FORFILES v 1.1 - [email protected] - 4/98

답변1

Forfiles사용하는 버전은 기본 XP 명령이 아닙니다. 이것은 원래 다음 중 하나와 함께 배포된 유틸리티의 이전 버전입니다 W2K Resource Kits(확실하지는 않지만 NT 리소스 키트에도 적용되는 것으로 생각됩니다). XP 자체에서는 이를 사용하는 데 아무런 문제가 없지만 구문을 자세히 살펴보면 다음과 같이 표시됩니다(강조).

-d[+|-][DDMMYY|DD] 날짜가 >= 또는 <=DDMMYY인 파일을 선택합니다.(UTC) 또는 날짜가 >= 또는 <=(현재 날짜 - DD일)인 파일

메모UTC설명에서. 즉 (1.1) forfiles, 시스템 시간이 UTC(오프셋 없음)가 아니고 일광 절약 시간이 적용되지 않는 한 사용자가 생각하는 것과 다른 타임스탬프를 사용한다는 의미입니다 .
예를 들면 아마도 더 쉬울 것입니다. 저는 일광 절약 시간인 UTC+1입니다.
(오늘 날짜 - 2012-09-19)

  • 파일을 생성하고 디렉터리를 수행합니다.

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

오늘 날짜가 있으므로 forfiles에서 선택하면 안 됩니다. 확인해 보겠습니다.

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

그러나 그것은 선택됩니다! 왜? 파일 UTC 시간을 살펴보겠습니다(다음 명령은 powershell에서 실행됩니다).

ls .\zzz_utc.txt |select LastAccessTime,LastAccessTimeUTC

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

보시다시피,시간Utc- 어제 사용했던 (1.1) forfiles거! 이것이 도구에 의해 선택되는 이유입니다.

답변2

"... 하루가 지난 파일만 나열하고 싶습니다..."

"어제 생성된 파일"을 의미합니까? 즉, (오늘은 9월 18일) 수정 날짜/시간이 9월 17일 ≥ 0000(이른 아침 자정)이고 9월 17일 ≤ 2359.60(끝 자정)인 파일입니다. 음, 날짜/시간이 2개입니다. 시간 제약이 있으며 forfiles둘 이상을 지정할 수 없습니다. 요점: 나는 그렇게 forfiles하지 않을 것이라고 믿습니다.

... 하지만 Windows 7 상자를 사용해 보면 /d -1어제 또는 이전에 생성된 파일이 나타납니다. 어쩌면 Windows XP 버전이 forfiles손상되었을 수도 있습니다.

답변3

로부터훌륭한 문서(강조):

마지막 수정 날짜가 현재 날짜에 지정된 일수를 더한 값과 같거나 이후(+)이거나 현재 날짜보다 빠르거나 같은(-) 파일을 선택합니다.지정된 일수 빼기.

편집하다:

아마도 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

답변4

FORFILES /D -1에는 Windows 8 및 Windows Server 2008 R2에서도 버그가 있는 것 같습니다(작동할 수 없음 - 모든 파일 선택 - 그리스어 날짜가 있는 시스템에서)

위의 일부 설명에서 제안한 대로 %date%를 구문 분석할 수 있지만, 예를 들어 Windows 8에서는 날짜가 요일 이름과 공백 문자가 먼저 포함된 3글자로 표시되고 그 다음에는 일반적인 날짜 형식이 표시됩니다. 또한 해당 날짜는 지역화된 형식인 반면 FORFILES /D는 forfiles /?에 따라 dd/MM/yyyy 형식의 날짜를 예상합니다. (적어도 Win8에서는).

정정: /D -dd가 수행하는 작업에 대해 오해가 있는 것 같습니다(저와 다른 사람들도 인터넷 검색으로 판단). dd일 된 파일은 검색하지 않지만 dd일보다 오래된 파일은 검색하지 않는 것 같습니다.

따라서 FORFILES의 /D +dd/MM/yyyy 구문을 사용하고 어제 날짜를 전달하여 날짜가 어제보다 큰 모든 파일을 찾아야 합니다. 이를 자동화하려면 %date%를 사용하고 %date:~7,2%/%date:~4,2%/%date:~-4% 또는 이와 유사한 것으로 구문 분석할 수 있습니다(날짜 부분을 재정렬해야 할 수도 있음). 지역에 따라 다름)

관련 정보