Войти

Показать полную графическую версию : [решено] Переименование файла с прошедшей датой


h1dex
04-09-2019, 09:36
добрый день!

подскажите..как через 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
Могу предложить решение через Powershell:
Rename-Item -Path '.\1.pdf' -NewName (((get-date).AddDays(-1).ToString("yyyy.MM.dd")) + '.pdf')

greg zakharov
04-09-2019, 13:30
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
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
В случае с 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
@greg_zahgreg zakharov, может из cmd вызвать повершел чтоб посчитать дату

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

h1dex
04-09-2019, 21:44
ребята..спасибо всем большое! очень помогли! :)

Serguei Kouzmine
05-09-2019, 02:53
greg zakharov, отличие помоему в том что PS домашнее поделие MS (уж какой ни есть а свой) a sqite3, python, ruby etc это все вещи импортные




© OSzone.net 2001-2012