Windows中这个批处理命令有什么问题?

时间:2011-06-22 07:48:36

标签: batch-file cmd

FOR %%F IN (E:\backups\7DbBackup_local\*.bak) DO IF %%~tF == (time /t) echo %%F

如果他们的日期修改年/月/日等于当前年/月/日,则应该打印文件名

3 个答案:

答案 0 :(得分:3)

%%~t为您提供日期文件的时间,大致如下:

23/03/2011 04:27 PM

但即使也可能是特定于语言环境的。

另一方面,time /t为您提供03:57 PMdate /t为您提供Wed 22/06/2011 其中可用作匹配项。

如果你想能够匹配它们,你必须做一些字符串欺骗才能从%%~t(剥离时间)和date /t获取日期(剥离一天)名称)。

或者你可以省去麻烦,忘记我喜欢称之为cmd-gymnastics的奇怪活动,并使用一个不错的find实用程序,通过下载CygWin或使用更轻量级{{ 3}}工具(搜索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的日期和时间,但您可以对其进行调整以提供其他值。

答案 1 :(得分: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

答案 2 :(得分: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只列出要复制的文件。