2011-06-22 66 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