Что не так с этой пакетной командой в Windows? - PullRequest
2 голосов
/ 22 июня 2011
FOR %%F IN (E:\backups\7DbBackup_local\*.bak) DO IF %%~tF == (time /t) echo %%F

Предполагается, что имена файлов будут печататься, если их дата изменения год / месяц / день равна текущему году / месяцу / дню

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

Как указал paxdiablo, использование времени в битах зависит от региона.Но это не твоя проблема.Ваша проблема в том, что в 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
3 голосов
/ 22 июня 2011

%%~t дает вам дату и время файла вдоль строк:

23/03/2011 04:27 PM

, но даже этот может зависеть от локали.

С другой стороны, time /t дает вам 03:57 PM, а date /t дает вам Wed 22/06/2011, , ни один из которых не подходит в качестве совпадения.

Если вы хотите иметь возможность сопоставлять их, вам нужно будет выполнить некоторые хитрости со строками, чтобы получить дату только из %%~t (обрезать время) и date /t (обрезать название дня).

Или вы можете избавить себя от хлопот, забыть об этом странном занятии, которое я люблю называть cmd-gymnastics, и использовать приличную утилиту find, либо загрузив CygWin , либо используя более легкий * 1026 Инструмент * 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%

Это дает вам дату и время в формате YYYYMMDD и HHMMSS, но вы можете адаптировать его для других значений.

2 голосов
/ 22 июня 2011

Если вас не интересует локаль, вы можете получить xcopy, чтобы сделать это за вас:

xcopy E:\backups\7DbBackup_local\*.bak %tmp% /d:%date:~4,10% /l
  • %tmp% - ваш временный каталог; xcopy нужен пункт назначения, даже если он не копируется.
  • %date% дает тот же вывод, что и date /t, но без необходимости исполнять песню for и танец.
  • %date:~4,10% получает формат даты mm/dd/yyyy с использованием пакетных подстрок .
  • /d указывает xcopy, чтобы файлы были изменены в или после указанной даты.
  • /l говорит xcopy просто перечислить файлы, которые будут скопированы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...