2

Я пытаюсь заставить изображения отображаться в определенном порядке на как можно большем количестве смартфонов, не требуя специального программного обеспечения, и самый простой способ сделать это - изменить время создания изображений так, чтобы первый файл буквенно-цифровым образом был самым последним время и пр. Этот процесс необходимо выполнять одновременно с сотнями изображений, поэтому я не могу сделать это вручную. Есть ли инструмент или метод, который может автоматизировать процесс?

1 ответ1

0

Дайте этот пакетный файл ниже попробовать.

Он будет отображать соответствующие файлы вместе с новой информацией о метках времени, но (пока) не будет изменять метки времени файлов.

Сохраните пакетный скрипт в файл с расширением .cmd (пример: redatefiles.cmd).

Он будет обрабатывать все файлы в текущей (рабочей) папке.

Вы можете запустить его так:

    C:\>redatefiles.cmd

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

  • Файлы в текущей папке с расширением .jpg будут обработаны. Все остальные файлы будут пропущены.
  • Дата (не время) соответствующего файла, расположенная в алфавитном порядке первой, будет использоваться в качестве даты для сгенерированной метки времени для всех соответствующих файлов.
  • Время для сгенерированной метки времени (в 24-часовом формате) начнется в 23:59:58 для первого соответствующего файла.

Затем время будет уменьшаться на 2 секунды для каждого файла, поэтому второй соответствующий файл будет иметь метку времени 23:59:56 затем 23:59:54 ... 23:59:00, 23:58:58 ... 23:00:00, 22:59:58 и так далее.

Если вы хотите указать другую маску файла, вы можете запустить ее следующим образом:

    C:\>redatefiles.cmd .png
or  C:\>redatefiles.cmd *.png
or  C:\>redatefiles.cmd "*.png"

Вы также можете указать несколько файловых масок , разделяя каждую файловую маску знаком | вот так (двойные кавычки обязательны):

    C:\>redatefiles.cmd ".png|.jpg"
or  C:\>redatefiles.cmd "*.png|*.jpg"

or  C:\>redatefiles.cmd "|.png|.jpg|"
or  C:\>redatefiles.cmd "|*.png|*.jpg|"

Если вы хотите включить файлы, которые не имеют расширения, укажите это с одним . (точка), как это:

    C:\>redatefiles.cmd .
or  C:\>redatefiles.cmd "."
or  C:\>redatefiles.cmd ".|.png"
or  C:\>redatefiles.cmd ".png|.|.jpg"


Для filemask вы не можете:

  • указать имя часть имени файла,
  • указать , кроме одного * в качестве имени части имени файла символы,
  • укажите подстановочные знаки в части расширения имени файла.
  • укажите *.* в качестве filemask

Например, они не будут работать:

    C:\>redatefiles.cmd somefile.png
    C:\>redatefiles.cmd somefile*.png
    C:\>redatefiles.cmd ?.png
    C:\>redatefiles.cmd *.pn*
    C:\>redatefiles.cmd *.*

И, если время для файла уменьшается с 00:00:02 до 00:00:00, время для следующего файла будет 23:59:58 в тот же день. Это эффективно ограничивает сценарий обработкой максимум около 43200 в одной папке.

Если какое-либо из этих ограничений не будет работать для вас, дайте мне знать, и я отредактирую сценарий, чтобы учесть это.

Конфигурация: Если вы посмотрите в первые несколько строк пакетного скрипта, вы увидите несколько строк, подобных этой:

rem    set "zzdate=01/01/2013"
rem    set "zzhour24=23"
rem    set "zzminute=59"
rem    set "zzsecond=58"

Если вы хотите настроить пакетный сценарий на использование другой даты или времени начала, вы можете указать его здесь, удалив rem в каждой из этих строк и указав нужные значения, например:

set "zzdate=05/07/2013"
set "zzhour24=10"
set "zzminute=00"
set "zzsecond=00"

После того, как вы попробуете это и убедитесь, что выбраны правильные файлы и временные метки обрабатываются так, как вам нужно, дайте мне знать, и я добавлю код для внесения изменений в временную метку.

Также, пожалуйста, дайте мне знать, если это правильно:

  1. Ваше местоположение использует формат даты США: MM/DD/YYYY например, 04/30/2013
  2. Вам нужно установить время Creation time для файлов, а не время Modification time (или, возможно, если вам нужно установить оба).
  3. Вы установили или можете установить Microsoft Powershell на свой компьютер.


Вот пакетный скрипт.

@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



Редактировать:

Вот код для изменения временных меток Creation time файла в формате US date с использованием Microsoft Powershell.

Чтобы добавить код для изменения временных меток Creation time файла в командный файл, показанный выше:

1. Найдите строку, которая начинается: echo new timestamp... Это выглядит так:

echo new timestamp: %zzmonth%/%zzday%/%zzyear% %zzhour24%:%zzminute%:%zzsecond%  (%zzhour12%:%zzminute%:%zzsecond% %zzampm%) for file: %zz_name%

2. Прямо под этой строкой вставьте эти три строки:

set "zzpsstamp12=%zzmonth%/%zzday%/%zzyear% %zzhour12%:%zzminute%:%zzsecond% %zzampm%"
set "zzpscmd=(dir \"%zz_full%\").CreationTime=\"%zzpsstamp12%\"
call powershell %zzpscmd%


Если это не сработает, дайте мне знать, что вам нужно, и я отредактирую сценарий для вас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .