2017-03-23 12 views
3

有可能獲得一個Windows系統的當前日期和文件的最後修改日期,就像thise:如何將今天的日期與沒有區域設置影響的文件上次修改日期進行比較?

  • 當前日期:date /T
  • 最後修改日期:±echo %~tI%(其中%I是一個FOR環路內提交)

但都依賴於區域設置,因此他們需要別的東西來代替:

  • 當前日期:wmic os get localdatetime
  • 最後修改日期:

有人知道如何填寫問號嗎?

背景資料,這個想法是得到這樣的結果如下:

  • 當前日期:20170323115047.782000 + 060
  • 最後修改日期:20170323120513.

砍掉前八字符(爲了獲得一天)

  • Cu rrent日期:20170323
  • 最後修改日期:20170323

這使得能夠看到這個文件已經被修改的今天。
我想避免區域設置,以確保我需要削減的字符數量。

+0

雖然'date/T'和'%%〜tI'返回依賴於地區的日期格式,但它們仍然可用於(非)相等比較,因爲格式相同,因爲您已將在第一個_space_處的'%%〜tI'的時間部分,並且_space_不被用作日期分隔符(這不太可能)... – aschipfl

回答

3

以下批次通過wmic輸出它自己的最後修改日期時間。

@Echo off&SetLocal 
set File=%~f0 
:: need to escape \ with another one \\ 
set File=%File:\=\\% 
for /f %%a in (
    'wmic DataFile where "Name='%File%'" get lastmodified ^| findstr "^[0-9]" ' 
) do Echo File:%File% lastmodified:%%a 

樣本輸出

> 12-16.cmd 
File:Q:\\Test\\2017-03\\23\\12-16.cmd lastmodified:20170323123900.908030+060 
+0

這個答案基於區域獨立命令'wmic datafile where Name =「 D:\\ Temp_Folder \\ .log「get」last modified「',這正是我所需要的。謝謝。 – Dominique

4

LotPings'腳本讓你的想法如何開始,但有一點點的全面檢查。試試這個:

@echo off 
setlocal 
::change to the needed file or to the command line argument 
set fileLoc=%~f0 
set fileLoc=%fileLoc:\=\\% 

for /f "tokens=* delims=" %%# in ('wmic os get localdatetime /format:value') do (
    for /f "tokens=* delims=" %%a in ("%%#") do set "%%a" 
) 

::echo %LocalDateTime% 
set today=%LocalDateTime:~0,8% 
echo today: %today% 




for /f "tokens=* delims=" %%# in ('wmic DataFile where "Name='%fileLoc%'" get lastmodified /format:Value ') do (

    for /f "tokens=* delims=" %%a in ("%%#") do set "%%a" 
) 

echo %lastmodified% 
set lmodified=%lastmodified:~0,8% 

if "%lmodified%" equ "%lmodified%" (
    echo modified today 
) else (
    echo hasnt been modified today 
) 
endlocal 

這裏的子解釋:https://ss64.com/nt/syntax-substring.html

+1

++ npocmaka,但你的'setlocal'在哪兒?其明顯的排斥是困擾我的強迫症。 – rojo

3

對於timestamp比較,你可以使用forfiles找到今天修改的文件。這個解決方案比我認爲的將WMI查詢結果中的子串關閉更加優雅。

@echo off & setlocal 

set "file=notes.txt" 

forfiles /d +0 /m "%file%" >NUL 2>NUL && (
    echo %file% was modified today. 
) || (
    for %%I in ("%file%") do echo %%~I was last modified %%~tI 
) 

forfiles /?的更多信息一個cmd控制檯。命令forfiles在匹配時退出0,在不匹配時退出1,允許使用conditional execution。另外,see this related question

+1

是的。不詳細。 – npocmaka

3

Rojo是正確的,FORFILES可用於列出今天已修改的文件。但它是S.L..O。W .....

ROBOCOPY更快:-)

下會在當前目錄列表最近修改的文件。

robocopy . . /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp 

你可以,如果你想

robocopy "c:\your\path" "c:\your\path" /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp 

您可以添加/S遞歸搜索所有子文件夾

robocopy "c:\your\path" "c:\your\path" /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp /s 
0

相當長的一段工作後指定一個特定的路徑,我發現一種讓所有東西都能正常運轉的方法(基於Lotping的回答):

set Filename=F:\\DIR\\Filename.exe 
for /f %%a in ('wmic datafile where "Name='!Filename!'" get "lastmodified"^|findstr [0-9]') do set Filename_DATE=%%a 
echo Filename_DATE=!Filename_DATE! 
set FilenameFinalDATE=!Filename_DATE:~0,8! 
echo !FilenameFinalDATE! 

(請注意,一切都在這裏很重要(雙斜線,雙百分比,單引號和雙引號,...))

0

雖然date /T/%DATE%%%~tI返回區域設置相關的日期格式,尚可用於(非)相等比較,因爲格式相同,因爲您將%%~tI的時間部分分爲第一個和第二個分隔符,並且不使用日期分隔符(這是非常不可能的和罕見):

for %%I in ("C:\TEMP\test.txt") do set "AGE=%%~tI" 
set "AGE=%AGE: =" & rem "%" 
if "%AGE%"=="%DATE%" echo File has been modified today. 
+0

你的觀點在一個單一的環境中是正確的,但我偶然發現了這個系統,同時從捷克到比利時進口了一批批文件:-) – Dominique

+0

你還記得這些日期格式是怎麼樣的嗎? – aschipfl

相關問題