Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование файла с прошедшей датой (http://forum.oszone.net/showthread.php?t=342060)

h1dex 04-09-2019 09:36 2886573

Переименование файла с прошедшей датой
 
добрый день!

подскажите..как через bat сделать так чтобы файл переименовывался и имел название не текущей даты..а прошедшей?

нашёл вот такое на текущую..а как на прошедшую? т.е. не 04.09.2019..а 03.09.2019 к примеру

ren 1.pdf %Date:~0,2%.%Date:~3,2%.%Date:~6,4%.pdf

DJ Mogarych 04-09-2019 10:59 2886591

Могу предложить решение через Powershell:
Код:

Rename-Item -Path '.\1.pdf' -NewName (((get-date).AddDays(-1).ToString("yyyy.MM.dd")) + '.pdf')

greg zakharov 04-09-2019 13:30 2886617

DJ Mogarych, вопрос был про командный сценарий, а не PowerShell. У вас, к слову, переименование идет не как dd.MM.yyyy, а наоборот, да и конкатенация там в общем-то лишняя:
Код:

ren .\1.pfd (get-date).adddays(-1).tostring('dd.MM.yyyy\.p\d\f')
h1dex, пример решения вашей задачи с помощью CMD:
Код:

@echo off
  setlocal enabledelayedexpansion
    if not exist 1.pdf echo:File not found.&goto:eof
    call:getYesterday ts
    ren 1.pdf !ts!.pdf
  endlocal
exit /b

:getYesterday
  call:toJulianDay !date:~0,2! !date:~3,2! !date:~6,4!
  set /a "jdn-=1"
  call:fromJulianDay ts
exit /b

:toJulianDay
  set "d=%~1"&set "m=%~2"
  for %%i in (d m) do if !%%i! lss 10 set "%%i=!%%i:0=!"
  set "jdn=(1461*(%~3+4800+(m-14)/12))/4+(367*(m-2-12*((m-14)/12"
  set "jdn=!jdn!)))/12-(3*((%~3+4900+(m-14)/12)/100))/4+d-32075"
  set /a "jdn=!jdn!"
exit /b

:fromJulianDay
  set /a "a=jdn+32044, b=(4*a+3)/146097, c=a-146097*b/4"
  set /a "d=(4*c+3)/1461, e=c-1461*d/4, m=(5*e+2)/153"
  set /a "dd=e-(153*m+2)/5+1, mm=m+3-12*(m/10), yyyy=100*b+d-4800+m/10"
  for %%i in (dd mm) do if !%%~i! lss 10 set "%%~i=0!%%~i!"
  set "%~1=!dd!.!mm!.!yyyy!"
exit /b


megaloman 04-09-2019 15:57 2886641

h1dex,
Код:

@Echo Off
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO Call :FromNow -1 %%d "yyyy" "mm" "dd"
        Ren 1.pdf %dd%.%mm%.%yyyy%.pdf
Exit /B

:FromNow
rem Пересчет даты yyyymmdd на заданное кол-во дней
rem Заимствовано http://forum.oszone.net/thread-186889.html
 SetLocal
 Set DT=%2
 Set /A yyyy=%DT:~0,4%, mm=1%DT:~4,2%-100, dd=1%DT:~6,2%-100
 Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
 Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
 Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
 Set /A J=J+2-12*L,I=100*(N-49)+I+L
 Set /A yyyy=I,mm=100+J,dd=100+K
 EndLocal& Set "%~3=%yyyy%" &Set "%~4=%mm:~-2%" &Set "%~5=%dd:~-2%"
GoTo :Eof

Дату можно получать на -(минус) сколько надо дней, если без минуса - то это плюс

greg zakharov 04-09-2019 18:18 2886655

В случае с Windows 10 и WSL задача может быть решена гораздо проще:
Код:

wsl -e date -d "1 day ago" "+%d.%m.%Y.pdf" | (set /p #= & for /f "tokens=2 delims==" %i in ('set #') do @ren 1.pdf %i)
Помимо прочего, несколько нестандартно можно использовать curl или tar, ставшие сравнительно недавно стандартными утилитами Windows. Также можно использовать технику гибридизации с WSH или chakra (через WSH), а может даже mshta. В общем, выбор велик, но приводить здесь все примеры дело неблагодарное.

Serguei Kouzmine 04-09-2019 18:49 2886657

@greg_zahgreg zakharov, может из cmd вызвать повершел чтоб посчитать дату

greg zakharov 04-09-2019 20:33 2886670

Serguei Kouzmine, можно и pwsh, а можно Python или Perl. Или Tcl. Или SQLite. - На этом и многом другом задача решается просто.

h1dex 04-09-2019 21:44 2886685

ребята..спасибо всем большое! очень помогли! :)

Serguei Kouzmine 05-09-2019 02:53 2886705

greg zakharov, отличие помоему в том что PS домашнее поделие MS (уж какой ни есть а свой) a sqite3, python, ruby etc это все вещи импортные


Время: 23:25.

Время: 23:25.
© OSzone.net 2001-