2011-06-22 64 views
2
FOR %%F IN (E:\backups\7DbBackup_local\*.bak) DO IF %%~tF == (time /t) echo %%F 

這應該是打印文件名,如果他們修改日期的年/月/日等於當前的年/月/日Windows中的這個批處理命令有什麼問題?

+0

它代之以什麼? – Oded

+0

不應該使用date/t – adrianm

+0

好吧,它只是打印DO之後的所有內容,點是我甚至不知道如何獲得IF條件的當前日期,所以我使用基本的cmd命令,這顯然不會以這種方式工作 – eugeneK

回答

3

%%~t給你的日期文件的時間,沿着線路的:

23/03/2011 04:27 PM 

但即使可能是特定於語言環境。

在另一方面,time /t給你03:57 PMdate /t給你Wed 22/06/2011均未作爲匹配有用。

如果你想能夠匹配它們,你必須做一些字符串欺騙,以獲得僅從%%~t(剝離時間)和date /t(剝離當天名稱)的日期。

或者你可以保存自己的麻煩,忘掉那個奇怪的活動我喜歡叫CMD-體操,並使用一個體面的find實用,無論是通過下載CygWin或使用更輕巧GnuWin32工具(搜索的findutils)。


如果必須使用cmd,你可以用下面的啓動:

@setlocal enableextensions enabledelayedexpansion 
@echo off 

rem Get todays date 

for /f "tokens=1,2,*" %%a in ('date /t') do set today=%%b 
echo %today% 

rem Process each file in turn. 

for %%a IN (.\*) do call :procFile "%%a" %%~ta 

endlocal 
goto :eof 

:procFile 
    if %2==%today% echo %2 %1 
    goto :eof 

但同樣,請記住,這可能,如果你的語言環境信息的變化打破。幾年前我寫了一個腳本,繞過這些程序使用WMI來獲得更準確的信息:

for /f "skip=2 tokens=2-7 delims=," %%A in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year^ /format:csv') do (
    set /a mydate = 10000 * %%F + 100 * %%D + %%A 
    set /a mytime = 10000 * %%B + 100 * %%C + %%E 
) 
set mydate=00000000%mydate% 
set mydate=%mydate:~-8% 
set mytime=000000%mytime% 
set mytime=%mytime:~-6% 

這給你的格式YYYYMMDDHHMMSS的日期和時間,但你能適應它給其他值。

+0

那我該怎麼辦? – eugeneK

+0

l33t ....從未見過這樣的事情。感謝您的時間幫助我解決這個未知問題//// – eugeneK

+0

'ECHO%DATE%'顯示與'DATE/T'相同,這意味着日期可以從'%DATE%'中提取。因此,而不是FOR循環它可能是'SET今天=%DATE:〜4%''。 –

3

正如paxdiablo指出的,在bat中使用時間是特定於語言環境的。但這不是你的問題。您的問題是,在Windows中,您無法直接與命令的結果進行比較。

如果您想知道,順便說一句,您既不能比較也不能指定也不能做其他任何事情。您需要使用FOR命令捕獲結果,將其分配給環境變量,然後使用它。

因此,您需要與%date%環境變量進行比較。這也是特定於語言環境的。 〜t和%date%都使用相同的語言環境,因此您需要在執行命令之前更改語言環境,使其符合您的需求並最終返回。

試試這個......

setlocal enabledelayedexpansion 
reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul 
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f >nul 
FOR %%F IN (E:\backups\7DbBackup_local\*.bak) DO (
    set dt=%%~tF 
    set dt=!dt:~0,10! 
    if !dt!==%date% echo %%F %%~tF !dt! 
) 
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul 
+0

我不工作,可能是因爲%date%返回Day Name abbr ie。星期三? – eugeneK

+0

取決於您的語言環境,如果它不符合您的需要,請在運行bat文件之前更改它,如最後一行所示。我正在編輯我的答案,以更好的例子。 –

+0

感謝您的解決方案,但@ paxdiablo的一個沒有修改註冊表的作品。 – eugeneK

2

如果你不關心的語言環境,你可以得到xcopy爲你做到這一點:

xcopy E:\backups\7DbBackup_local\*.bak %tmp% /d:%date:~4,10% /l 
  • %tmp%是您的Temp目錄下;即使沒有複製,xcopy也需要一個目的地。
  • %date%給出與date /t相同的輸出,但不必做for歌舞。
  • %date:~4,10%使用batch substrings得到日期mm/dd/yyyy格式。
  • /d告訴xcopy在給定日期或之後獲取文件更改。
  • /l告訴xcopy只列出將被複制的文件。
+0

它可能應該是'%date:〜4,10%'而不是'%date:〜5,10%'(它是一個偏移量,所以它是基於0的)。 –

+0

@Andriy;哎呀,對,你是。謝謝。 –

+0

我需要基於for循環來壓縮文件。使用你的方法將迫使我創建另一批。 – eugeneK