Dê este arquivo em lote abaixo de uma tentativa.
Ele exibirá os arquivos correspondentes junto com as novas informações de registro de data e hora, mas não modificará (ainda) os registros de data e hora dos arquivos.
Salve o script em lote em um arquivo com a extensão .cmd
(exemplo: redatefiles.cmd
).
Ele processará todos os arquivos na pasta atual (em funcionamento).
Você pode executá-lo assim:
C:\>redatefiles.cmd
Se você executar dessa forma, ele usará esses padrões:
- Os arquivos na pasta atual com uma extensão de
.jpg
serão processados. Todos os outros arquivos serão ignorados. - A data (não a hora) do arquivo correspondente que é alfabeticamente primeiro será usada como data para o registro de data e hora gerado para todos os arquivos correspondentes.
- O tempo para o timestamp gerado (no formato de 24 horas) começará em
23:59:58
para o primeiro arquivo de correspondência .
O tempo será reduzido em 2 segundos para cada arquivo. Assim, o segundo arquivo correspondente será marcado como timestamp 23:59:56
e > 23:59:54
... 23:59:00
, 23:58:58
... 23:00:00
, 22:59:58
e assim por diante.
Se você quiser especificar uma máscara de arquivo diferente, poderá executá-la assim:
C:\>redatefiles.cmd .png
or C:\>redatefiles.cmd *.png
or C:\>redatefiles.cmd "*.png"
Você também pode especificar várias máscaras de arquivo separando cada máscara de arquivo com um |
como este (aspas duplas são necessárias):
C:\>redatefiles.cmd ".png|.jpg"
or C:\>redatefiles.cmd "*.png|*.jpg"
or C:\>redatefiles.cmd "|.png|.jpg|"
or C:\>redatefiles.cmd "|*.png|*.jpg|"
Se você deseja incluir arquivos que não têm uma extensão, especifique isso com um único .
(ponto) como este:
C:\>redatefiles.cmd .
or C:\>redatefiles.cmd "."
or C:\>redatefiles.cmd ".|.png"
or C:\>redatefiles.cmd ".png|.|.jpg"
Para o filemask
, você não pode :
- especifique uma parte nome do nome do arquivo,
- especifique curingas diferentes de um único
*
como a parte nome do nome do arquivo, - especifique curingas na parte extensão do nome do arquivo.
- especifique
*.*
como ofilemask
Por exemplo, isso não funcionará:
C:\>redatefiles.cmd somefile.png
C:\>redatefiles.cmd somefile*.png
C:\>redatefiles.cmd ?.png
C:\>redatefiles.cmd *.pn*
C:\>redatefiles.cmd *.*
E, se o tempo de um arquivo cair de 00:00:02
para 00:00:00
, o tempo para o próximo arquivo será 23:59:58
no mesmo dia . Isso limita efetivamente o script ao processamento de, no máximo, cerca de 43200 na mesma pasta.
Se qualquer uma dessas restrições não funcionar, avise-me e eu editarei o script para permitir isso.
Configuração: se você olhar nas primeiras linhas do script em lote, verá algumas linhas como esta:
rem set "zzdate=01/01/2013"
rem set "zzhour24=23"
rem set "zzminute=59"
rem set "zzsecond=58"
Se você deseja configurar o script em lote para usar uma data ou starttime , é possível especificar removendo o rem
em cada uma dessas linhas e fornecendo seus valores desejados da seguinte forma:
set "zzdate=05/07/2013"
set "zzhour24=10"
set "zzminute=00"
set "zzsecond=00"
Uma vez que você tentou isso e verificou que os arquivos corretos estão selecionados, e os timestamps são processados como você precisa, me avise e eu adicionarei o código para fazer as alterações de timestamp.
Além disso, por favor, deixe-me saber se isso está correto:
- Sua localização usa o formato de data dos EUA de
MM/DD/YYYY
como04/30/2013
- Você precisa definir o
Creation time
para os arquivos e não oModification time
(ou talvez se você precisar definir os dois). - Você instalou ou pode instalar o Microsoft Powershell no seu computador.
Aqui está o script em lote.
@echo off
rem starting from 23:59:58, if there are 43200 files or more, it will not roll to previous day
call :clean
rem set "zzdate=01/01/2013"
rem set "zzhour24=23"
rem set "zzminute=59"
rem set "zzsecond=58"
rem *************************
set "zz_1=%~1"
set "zzdateready=0"
set "zztimeready=0"
call :getextlist
echo.
echo Re-dating files matching: "%zzextlist%"
echo.
for /f "usebackq delims=" %%f in ('dir /b /on "*.*"') do call :work "%%~ff" "%%~nxf" "%%~xf"
goto :EOF
:work
rem:work
set "zz_full=%~1"
set "zz_name=%~2"
set "zz_ext=%~3"
if "%zz_ext%."=="." set "zz_ext=."
echo "%zzextlist%"|find /i "|%zz_ext%|">nul
if %errorlevel% NEQ 0 goto :noextmatch
rem got a target file
if not %zzdateready%%zztimeready% EQU 11 call :settimestamp
rem echo zzdate =%zzdate%
rem echo zzmonth=%zzmonth%/%zzday%/%zzyear%
rem echo zzhour24=%zzhour24%:%zzminute%:%zzsecond%
rem echo zzhour12=%zzhour12%:%zzminute%:%zzsecond% %zzampm%
rem echo zz_full=%zz_full%
rem echo zz_ext=%zz_ext%
echo new timestamp: %zzmonth%/%zzday%/%zzyear% %zzhour24%:%zzminute%:%zzsecond% (%zzhour12%:%zzminute%:%zzsecond% %zzampm%) for file: %zz_name%
call :decrementtime
rem echo next timestamp=%zzmonth%/%zzday%/%zzyear% %zzhour24%:%zzminute%:%zzsecond% (%zzhour12%:%zzminute%:%zzsecond% %zzampm%)
rem echo.
goto :EOF
:noextmatch
rem:noextmatch
echo Skipping file: %zz_name%
rem echo.
goto :EOF
:settimestamp
rem:settimestamp
if "%zzdate%."=="." call :getfiledate
if %zzdateready% EQU 0 call :explodedate
if "%zzhour24%."=="." call :setdefaulttime
if "%zzminute%."=="." call :setdefaulttime
if "%zzsecond%."=="." call :setdefaulttime
if %zztimeready% EQU 0 call :settime12
goto :EOF
:getfiledate
rem:getfiledate
for /f "usebackq delims=" %%g in ('dir "%zz_full%"^|find /i "%zz_name%"') do set "zzdstring=%%~g"
set "zzdate=%zzdstring:~0,10%"
rem echo zzdstring=%zzdstring%
set "zzdstring="
goto :EOF
:explodedate
rem:explodedate
set "zzmonth=%zzdate:~0,2%"
set "zzday=%zzdate:~3,2%"
set "zzyear=%zzdate:~6,4%"
set "zzdateready=1"
goto :EOF
:setdefaulttime
rem:setdefaulttime
set "zzhour24=23"
set "zzminute=59"
set "zzsecond=58"
goto :EOF
:settime12
rem:settime12
rem insure 2 digit times
set "zzhour24=00%zzhour24%"
set "zzminute=00%zzminute%"
set "zzsecond=00%zzsecond%"
set "zzhour24=%zzhour24:~-2%"
set "zzminute=%zzminute:~-2%"
set "zzsecond=%zzsecond:~-2%"
set "zzampm=AM"
set "zzhour12=%zzhour24%"
if %zzhour12% GEQ 12 set "zzampm=PM"
if %zzhour12% GTR 12 set /A zzhour12=%zzhour24%-12
set "zzhour12=0%zzhour12%
set "zzhour12=%zzhour12:~-2%
if "%zzhour12%"=="00" set "zzhour12=12"
set "zztimeready=1"
goto :EOF
:decrementtime
rem:decrementtime
if 1%zzsecond% EQU 100 goto :fixseconds
set /a zzsecond=1%zzsecond%-2
set zzsecond=%zzsecond:~1%
goto :EOF
:fixseconds
rem:fixseconds
rem zzsecond is 00, set to 58, then check zzminute
set zzsecond=58
if 1%zzminute% EQU 100 goto :fixminutes
set /a zzminute=1%zzminute%-1
set zzminute=%zzminute:~1%
goto :EOF
:fixminutes
rem:fixminutes
rem zzminute is 00, set to 59, then check zzhourXX
set zzminute=59
if 1%zzhour24% EQU 100 goto :fixhours
set /a zzhour24=1%zzhour24%-1
set /a zzhour12=1%zzhour12%-1
set zzhour24=%zzhour24:~1%
set zzhour12=%zzhour12:~1%
rem if hour12 just went from 01:00:00 PM to 00:59:58 PM make it 12:59:58 PM
if "%zzhour12%:%zzminute%:%zzsecond% %zzampm%"=="00:59:58 PM" set "zzhour12=12"
rem if hour12 just went from 12:00:00 PM to 11:59:58 PM make it 11:59:58 AM
if "%zzhour12%:%zzminute%:%zzsecond% %zzampm%"=="11:59:58 PM" set "zzampm=AM"
rem if hour12 just went from 01:00:00 AM to 00:59:58 AM make it 12:59:58 AM
if "%zzhour12%:%zzminute%:%zzsecond% %zzampm%"=="00:59:58 AM" set "zzhour12=12"
rem if hour12 just went from 12:00:00 AM to 11:59:58 PM (previous day) it should be handled by :fixhours
goto :EOF
:fixhours
rem:fixhours
rem not adjusting date if hours rolls under 00
set "zzhour24=23"
set "zzminute=59"
set "zzsecond=58"
set "zzampm=AM"
set "zzhour12=%zzhour24%"
if %zzhour12% GEQ 12 set "zzampm=PM"
if %zzhour12% GTR 12 set /A zzhour12=%zzhour24%-12
set "zzhour12=0%zzhour12%
set "zzhour12=%zzhour12:~-2%
if "%zzhour12%"=="00" set "zzhour12=12"
goto :EOF
:getextlist
rem:getextlist
rem set default of "*.jpg"
set "zzextlist=|.jpg|"
set "zztext=x%zz_1%x"
if "%zztext%"=="xx" goto :EOF
set "zztext=%zztext:~1,-1%"
set "zztemp=%zztext:~0,1%"
if "%zztemp%"=="/" goto :EOF
set "zzextlist=%zztext%"
if "%zztemp%"=="|" set "zzextlist=%zztext:|*=|%"
if "%zztemp%"=="|" goto :EOF
set "zzextlist=|%zztext%|"
set "zzextlist=%zzextlist:|*=|%"
goto :EOF
:clean
rem:clean
set "zzextlist="
set "zzdate="
set "zzmonth="
set "zzday="
set "zzyear="
set "zzdstring="
set "zzhour24="
set "zzminute="
set "zzsecond="
set "zzhour12="
set "zzampm="
set "zzdateready="
set "zztimeready="
set "zz_full="
set "zz_name="
set "zz_ext="
set "zztemp="
set "zztext="
set "zz_1="
goto :EOF
Editar:
Aqui está o código para modificar os timestamps do arquivo Creation time
formatados como US date
, usando Microsoft Powershell
.
Para adicionar o código para modificar o registro de data e hora Creation time
do arquivo para o arquivo de lote mostrado acima:
1. Encontre a linha que começa: echo new timestamp...
. Parece assim:
echo new timestamp: %zzmonth%/%zzday%/%zzyear% %zzhour24%:%zzminute%:%zzsecond% (%zzhour12%:%zzminute%:%zzsecond% %zzampm%) for file: %zz_name%
2. Logo abaixo dessa linha, insira estas três linhas:
set "zzpsstamp12=%zzmonth%/%zzday%/%zzyear% %zzhour12%:%zzminute%:%zzsecond% %zzampm%"
set "zzpscmd=(dir \"%zz_full%\").CreationTime=\"%zzpsstamp12%\"
call powershell %zzpscmd%
Se isso não funcionar para você, deixe-me saber o que você precisa e eu vou editar o roteiro para você.