Войти

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


Страниц : [1] 2

Sergey.l
08-01-2018, 12:59
Всем привет. Столкнулся с проблемой при формировании даты, а именно числами 8 и 9 в батнике. Насколько понимаю это связано с восьмеричной с/с
Прикрепил батник который создает папки структуры гггг/мм/дд
Но вот в дни где есть цифры 8 или 9 он нехочет работать.
Помогите дописать код чтобы избавиться от этой проблемы. Спасибо

Iska
08-01-2018, 13:37
На WSH:
Option Explicit

Dim dtYesterday
Dim strYear, strMonth, strDay


dtYesterday = DateAdd("d", -1, Now())

strYear = CStr(Year( dtYesterday))
strMonth = Right("00" & CStr(Month(dtYesterday)), 2)
strDay = Right("00" & CStr(Day( dtYesterday)), 2)

CreateFolderEx Join(Array("d:", strYear, strMonth, strDay), "\")

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub CreateFolderEx(strPath)
With WScript.CreateObject("Scripting.FileSystemObject")
If Not .FolderExists(strPath) Then
CreateFolderEx .GetParentFolderName(strPath)
.CreateFolder strPath
End If
End With
End Sub
'=============================================================================

megaloman
08-01-2018, 14:41
Sergey.l, @Echo Off
cls

SetLocal EnableDelayedExpansion

Call :FromNow -1 %Date% "yyyy" "mm" "dd"

Echo %Date% %DeltaDay% %yyyy% %mm% %dd%
Echo MD Disk:\Folder\%yyyy%\%mm%\%dd%
pause
GoTo :Eof

:FromNow
rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в указанных перемменных %yyyy% %mm% %dd%

SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,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
ИМХО, наверное это и не нужно. Папки создаются, чтобы туда поместить файлы прошедших дней. Не проще ли брать дату, например, изменения файла, и, по мере надобности, создавать папки. Тогда батник, построенный по такому принципу, можно запускать хоть раз в несколько дней/недель/месяцев/лет, и при этом рассортировать файлы по нужным папкам, а не в папку вчерашнего дня.

Sergey.l
08-01-2018, 15:07
Спасибо, большое! Нашел батник. (См. вложение)
Подскажите, как сделать условие так чтобы при запуске батника до 00:00 формировалась текущая дата, а после вчерашнее число. Работаю сутки/двое. Днем создаю рабочие папки с тек. датой, а в конце дежурства, т.е. на след день батником забираю с созданных вчера папок файлы.
Буду премного обязан за помощь!

Iska
08-01-2018, 15:07
megaloman, как обычно, мы ничего не знаем — зачем сие нужно :lol:.

до 00:00 формировалась текущая дата, а после вчерашнее число. »
Sergey.l, осмыслите сами всю глубину и невозможность решения в рамках некорректно озвученного Вами условия.

Sergey.l
08-01-2018, 15:12
Нет. С датой изменения файла не получиться. Приходит очень много инфы от организаций. Нужно в течении суток их разбирать, и помимо этого, еще есть задачи.

Sergey.l
08-01-2018, 15:21
Ничего смешного. Есть папка с текущей датой, 08.01.2018. Надо батником перемещать туда файлы в течении суток, после полуночи уже 9 число и батник должен следуя условию перемещать в папку не в 09.01.2018, а в 08.01.2018 megaloman, как обычно, мы ничего не знаем — зачем сие нужно :lol:.

до 00:00 формировалась текущая дата, а после вчерашнее число. »
Sergey.l, осмыслите сами всю глубину и невозможность решения в рамках некорректно озвученного Вами условия.

Извиняюсь, если ввёл в заблуждение. Создание папки это пример, т.е. одно из действий. Для меня важно само формирование даты и использование ее в разных командах, md, copy, move и т.д.Sergey.l, чтобы при запуске батника до 00:00 формировалась текущая дата » Не догоняю! Любое время, например 00:01 13:25 23:49 до 00:00 час:мин следующих суток

Sergey.l, Днем создаю рабочие папки с тек. датой, а в конце дежурства, т.е. на след день батником забираю с созданных вчера папок файлы. »То есть, папки с нужной датой уже существуют. Что мешает их переместить или скопировать в другое место, не выдумывая заново имени с вчерашней датой. Вам надо имеющуюся папку с именем вчерашнего дня переместить или скопировать в папку с таким же именем в другое место.

Iska
08-01-2018, 15:29
Sergey.l, Вы так и не поняли, в чём проблема.

megaloman, желаю успеха в развитии навыка телепатии ;) и заранее сочувствую.

Sergey.l
08-01-2018, 15:37
Основная задача по маске например %d%%m%%y% из папки забирать или в нее копировать файлы. Неудобство в том что днем нужна тек дата а ночью вчерашняя. Мне не сложно было это делать через тотал коммандер, но вы бы видели сколько каталогов и файлов с которыми приходиться работать. Папка с числом наход в 15-20 каталогах и с разных мест в эти папки надо перемещать файллы, а в конце смены забрать обработанные.

Я не совсем разбираюсь в этом. Хотел бы на вас посмотреть, как вы разъяснялись в незнакомой области. Или вы все знаете?)))Sergey.l, Вы так и не поняли, в чём проблема.

megaloman, желаю успеха в развитии навыка телепатии ;) и заранее сочувствую.

megaloman
08-01-2018, 15:56
Хотел бы на вас посмотреть, как вы разъяснялись в незнакомой области. Или вы все знаете? » Да никто щеки тут не надувает от важности :), Вы взялись написать батник, но не знаете как написать - готов помочь. Но надо четкая постановка задачи. Четко мыслим-четко излагаем-правильно делаем. А у Вас, извините, не математика в изложении, а Слово о полку Игореве.
Определитесь, что такое ночь, и что такое день - в математике нет таких понятий.
Допустим с 00:00:00,00 до 07:59:59,99 это ночь.
с 08:00:00,00 до 23:59:59,99 это день.

Sergey.l
08-01-2018, 16:27
Еще раз постараюсь объяснить. Согласен, что запутал вас.

С 08:00 до 00:00 - день
С 00:01 до 07:59 - ночь

В 8:00 я создаю папку в разных местах с текущей, сегодняшней датой через батник. Весь день перемещаю в эти папки и забираю из них файлы по маске %d%%m%%y%. После полуночи дата меняется. Соответственно батник уже будет искать файлы и перемещать в папки не с датой например 08012018, а 09012018. Вот для этого я и прошу помочь в решении этого вопроса. Понятно, сто можно два батника написать с текущей датой, и тек дата - 1. Но хотелось бы один
Хотел бы на вас посмотреть, как вы разъяснялись в незнакомой области. Или вы все знаете? » Да никто щеки тут не надувает от важности :), Вы взялись написать батник, но не знаете как написать - готов помочь. Но надо четкая постановка задачи. Четко мыслим-четко излагаем-правильно делаем. А у Вас, извините, не математика в изложении, а Слово о полку Игореве.
Определитесь, что такое ночь, и что такое день - в математике нет таких понятий.
Допустим с 00:00:00,00 до 07:59:59,99 это ночь.
с 08:00:00,00 до 23:59:59,99 это день.

megaloman
08-01-2018, 18:48
Sergey.l, @Echo Off
cls

Set "NightB=0001"
Set "NightE=0759"

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmm"

Set /A DeltaDay=0
If 1%NightB% LEQ 1%hhmm% If 1%hhmm% LEQ 1%NightE% Set /A DeltaDay=-1

Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"

Echo %Date% %Time% %yyyy% %mm% %dd% %hhmm%
pause
GoTo :Eof

:StrDate
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
Set "%~1=%@Tdate:~0,4%"
Set "%~2=%@Tdate:~4,2%"
Set "%~3=%@Tdate:~6,2%"
Set "%~4=%@Tdate:~8,4%"
GoTo :Eof

:FromNow

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в перемменной %yyyy% %mm% %dd%

SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,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Основная задача по маске например %d%%m%%y% из папки забирать или в нее копировать файлы. » Всё остальное для меня - лирика.

DJ Mogarych
08-01-2018, 20:55
Powershell:
mkdir (get-date).AddDays(-1).ToString("dd.MM.yyy")

Sergey.l
09-01-2018, 17:40
Спасибо!

Wirehead
10-01-2018, 11:48
Зачем городить огород с этими батниками,если можно одной строкой из павершел все сделать!

Iska
10-01-2018, 12:35
Wirehead, например, для того, чтобы не разворачивать сотню остальных строк из пакетного файла в тысячу строк на PowerShell.

DJ Mogarych
10-01-2018, 16:16
Да уж лучше потратить несколько недель и портировать всё на Powershell, чем постоянно на грабли наступать в батниках, пытаясь там реализовать через разные извращения уже встроенные в пауэршелл готовые командлеты и модули. Будет наоборот - сто строк батника будут десятью строками в пауэршелле. Нужно сказать, что большинство, если не все, команды старой командной строки являются алиасами в Powershell, так что, возможно, ничего особо и переделывать-то не придётся.
К тому же, появится новое полезное умение.

Iska
10-01-2018, 23:38
DJ Mogarych, в данном случае не могу с Вами согласиться, коллега: какой смысл тратить несколько дней или недель на то, что уже и так работает?!

DJ Mogarych
11-01-2018, 09:16
Чтобы держаться прогресса, потому что в какой-то момент окажется, что то, что работало, работать перестало, а миграция на новые решения невозможна, потому что пропущено слишком много итераций, и прямой апгрейд не поддерживается.

Положим, к этому случаю это имеет непрямое отношение, но несколько раз видел совершенно исключительные случаи, типа сеть на компах под Windows NT в 2013 году, где задача стояла установить антивирус Касперского.

Ну и, в конце концов, интересно же изучать что-то новое и более эффективное :)

Elven
11-01-2018, 15:04
Iska, DJ Mogarych, от вопроса ушли, коллеги :) для поддержания офтопа:
Iska, иногда стоит потратить. Тот же вопрос с определением даты для cmd/bat - больной весьма, и решать его раз и насовсем никто не хочет, у меня в одном батнике вообще та еще хрень работает - cmd запускает posh, тот дергает несколько значений (в т.ч. и дату с перемоткой на неделю назад) и складывает их в файл, откуда эти значения забираются обратно cmd. Писано еще года три назад, костыль, конечно, но костыль прям таки титановый, не ломается, зараза! А вот то что этот костыль заменил - ломалось, по крайней мере 1-2 раза в месяц приходилось искать куда подевалось то, что должно было лежать вот в этом конкретном "здесь", а не в том "здесь", которое "там".
DJ Mogarych, большей частью согласен, однако есть одно "но": Iska говорит в первую очередь о скриптовых языках, в них изменения если и происходят, то не столь агрессивные как в приведенном примере (обычно).




© OSzone.net 2001-2012