Batch file Windows中的此批处理命令有什么问题?

Batch file Windows中的此批处理命令有什么问题?,batch-file,cmd,Batch File,Cmd,如果文件的修改日期年/月/日等于当前年/月/日,则应打印文件名%%~t提供文件的日期和时间,如下所示: FOR %%F IN (E:\backups\7DbBackup_local\*.bak) DO IF %%~tF == (time /t) echo %%F 但即使这样,也可能是特定于地区的 另一方面,time/t为您提供03:57 PM和date/t为您提供2011年6月22日星期三,两者都不能作为匹配项 如果你想匹配它们,你必须做一些字符串技巧,只从%%~t(去掉时间)和日期/t(去掉

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

%%~t
提供文件的日期和时间,如下所示:

FOR %%F IN (E:\backups\7DbBackup_local\*.bak) DO IF %%~tF == (time /t) echo %%F
但即使这样,也可能是特定于地区的

另一方面,
time/t
为您提供
03:57 PM
date/t
为您提供
2011年6月22日星期三
,两者都不能作为匹配项

如果你想匹配它们,你必须做一些字符串技巧,只从
%%~t
(去掉时间)和
日期/t
(去掉日期名称)中获取日期

或者你可以省去麻烦,忘掉我喜欢称之为cmd体操的奇怪活动,使用一个体面的
find
实用程序,或者下载,或者使用更轻量级的工具(搜索FindUtils)


如果必须使用
cmd
,可以从以下内容开始:

23/03/2011 04:27 PM

但是,请再次记住,如果您的区域设置信息发生更改,这可能会中断。几年前,我编写了一个脚本,绕过这些程序,使用WMI获得更准确的信息:

@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

这将为您提供格式为
YYYYMMDD
HHMMSS
的日期和时间,但您可以调整它以提供其他值。

正如paxdiablo指出的,在bat中使用时间是特定于区域设置的。但这不是你的问题。您的问题是在windows中无法直接与命令的结果进行比较

如果你想知道,顺便说一句,你既不能比较,也不能分配,也不能做其他任何事情。您需要使用FOR命令捕获结果,将其分配给环境变量,然后使用它

因此,您需要与%date%环境变量进行比较。这也是特定于区域设置的。 ~t和%date%都使用相同的区域设置,因此您需要在执行命令之前将区域设置更改为符合您需要的通用格式,并在最后将其恢复

试试这个

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%

如果您不关心语言环境,您可以使用
xcopy
为您执行以下操作:

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
  • %tmp%
    是您的临时目录
    xcopy
    需要一个目标,即使在不复制时也是如此
  • %date%
    提供与
    date/t
    相同的输出,但不必为
    歌曲和舞蹈执行
  • %date:~4,10%
    使用获取日期
    mm/dd/yyyy
    格式
  • /d
    告诉
    xcopy
    在给定日期当天或之后更改文件
  • /l
    告诉
    xcopy
    只列出要复制的文件

嗯,它只是在DO之后打印所有内容,重点是我甚至不知道如何获取IF条件的当前日期,所以我使用基本cmd命令,这显然不起作用。如果它在DO之后打印所有内容,那么要么在命令前面加上
@
,要么使用
echo off
。我不起作用,可能是因为%date%返回的日期名称缩写为ie.Wed?这取决于您的区域设置,如果它不符合您的需要,请在运行bat文件之前更改它,如最后几行所示。我正在编辑一个更好的示例的答案。感谢您的解决方案,但是@paxdiablo的解决方案可以在不修改注册表的情况下工作。l33t。。。。以前从没见过这样的事。感谢您花时间帮助我解决这个未知主题///
ECHO%DATE%
显示的日期与
DATE/T
相同,这意味着可以从
%DATE%
提取日期。因此,与FOR循环不同的是,它可能类似于今天设置的
%DATE:~4%
。嗯,我的意思当然是,第一个脚本中的第一个
FOR
循环,即今天初始化
的循环(只是想澄清一下)。它可能应该是
%DATE:~4,10%
,而不是
%DATE:~5,10%
(这是一个偏移,因此它是基于0的)。我需要基于for循环压缩文件。使用您的方法将强制我创建另一批。@eugeneK;或者,只需在for循环中使用此命令来驱动要压缩的文件列表。此版本还取决于区域设置,因为%date%会。在我的系统上,%date%返回dd/mm/yyyy;在其他系统上可能是yymmdd@eugeneK;而不是
 对于%%F-IN(e:\backups\7DbBackup\u local\*.bak)DO IF…
你可以为/F%%F-IN做
('xcopy e:\backups\7DbBackup\u local\*.bak%tmp%/d:%date:~4,10%/l')做
。这样你就不需要
IF
来检查日期了。
xcopy E:\backups\7DbBackup_local\*.bak %tmp% /d:%date:~4,10% /l