Компьютерный форум 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=332361)

Sergey.l 08-01-2018 12:59 2789710

Создание папки с датой вчерашнего дня
 
Вложений: 1
Всем привет. Столкнулся с проблемой при формировании даты, а именно числами 8 и 9 в батнике. Насколько понимаю это связано с восьмеричной с/с
Прикрепил батник который создает папки структуры гггг/мм/дд
Но вот в дни где есть цифры 8 или 9 он нехочет работать.
Помогите дописать код чтобы избавиться от этой проблемы. Спасибо

Iska 08-01-2018 13:37 2789713

На 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 2789725

Sergey.l,
Если не изобретать велосипед, то вот CMD
Код:

@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 2789732

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

Iska 08-01-2018 15:07 2789733

megaloman, как обычно, мы ничего не знаем — зачем сие нужно :lol:.

Цитата:

Цитата Sergey.l
до 00:00 формировалась текущая дата, а после вчерашнее число. »

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

Sergey.l 08-01-2018 15:12 2789736

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

Sergey.l 08-01-2018 15:21 2789741

Ничего смешного. Есть папка с текущей датой, 08.01.2018. Надо батником перемещать туда файлы в течении суток, после полуночи уже 9 число и батник должен следуя условию перемещать в папку не в 09.01.2018, а в 08.01.2018
Цитата:

Цитата Iska (Сообщение 2789733)
megaloman, как обычно, мы ничего не знаем — зачем сие нужно :lol:.

Цитата:

Цитата Sergey.l
до 00:00 формировалась текущая дата, а после вчерашнее число. »

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

Извиняюсь, если ввёл в заблуждение. Создание папки это пример, т.е. одно из действий. Для меня важно само формирование даты и использование ее в разных командах, md, copy, move и т.д.
Цитата:

Цитата megaloman (Сообщение 2789737)
Sergey.l,
Цитата:

Цитата Sergey.l
чтобы при запуске батника до 00:00 формировалась текущая дата »

Не догоняю! Любое время, например 00:01 13:25 23:49 до 00:00 час:мин следующих суток

Sergey.l,
Цитата:

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

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


Iska 08-01-2018 15:29 2789746

Sergey.l, Вы так и не поняли, в чём проблема.

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

Sergey.l 08-01-2018 15:37 2789750

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

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

Цитата Iska (Сообщение 2789746)
Sergey.l, Вы так и не поняли, в чём проблема.

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


megaloman 08-01-2018 15:56 2789753

Цитата:

Цитата Sergey.l
Хотел бы на вас посмотреть, как вы разъяснялись в незнакомой области. Или вы все знаете? »

Да никто щеки тут не надувает от важности :), Вы взялись написать батник, но не знаете как написать - готов помочь. Но надо четкая постановка задачи. Четко мыслим-четко излагаем-правильно делаем. А у Вас, извините, не математика в изложении, а Слово о полку Игореве.

Определитесь, что такое ночь, и что такое день - в математике нет таких понятий.
Допустим с 00:00:00,00 до 07:59:59,99 это ночь.
с 08:00:00,00 до 23:59:59,99 это день.

Sergey.l 08-01-2018 16:27 2789759

Еще раз постараюсь объяснить. Согласен, что запутал вас.

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

В 8:00 я создаю папку в разных местах с текущей, сегодняшней датой через батник. Весь день перемещаю в эти папки и забираю из них файлы по маске %d%%m%%y%. После полуночи дата меняется. Соответственно батник уже будет искать файлы и перемещать в папки не с датой например 08012018, а 09012018. Вот для этого я и прошу помочь в решении этого вопроса. Понятно, сто можно два батника написать с текущей датой, и тек дата - 1. Но хотелось бы один
Цитата:

Цитата megaloman (Сообщение 2789753)
Цитата:

Цитата Sergey.l
Хотел бы на вас посмотреть, как вы разъяснялись в незнакомой области. Или вы все знаете? »

Да никто щеки тут не надувает от важности :), Вы взялись написать батник, но не знаете как написать - готов помочь. Но надо четкая постановка задачи. Четко мыслим-четко излагаем-правильно делаем. А у Вас, извините, не математика в изложении, а Слово о полку Игореве.

Определитесь, что такое ночь, и что такое день - в математике нет таких понятий.
Допустим с 00:00:00,00 до 07:59:59,99 это ночь.
с 08:00:00,00 до 23:59:59,99 это день.


megaloman 08-01-2018 18:48 2789794

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

Цитата:

Цитата Sergey.l
Основная задача по маске например %d%%m%%y% из папки забирать или в нее копировать файлы. »

Всё остальное для меня - лирика.

DJ Mogarych 08-01-2018 20:55 2789816

Powershell:
Код:

mkdir (get-date).AddDays(-1).ToString("dd.MM.yyy")

Sergey.l 09-01-2018 17:40 2790030

Спасибо!

Wirehead 10-01-2018 11:48 2790249

Зачем городить огород с этими батниками,если можно одной строкой из павершел все сделать!

Iska 10-01-2018 12:35 2790277

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

DJ Mogarych 10-01-2018 16:16 2790332

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

Iska 10-01-2018 23:38 2790413

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

DJ Mogarych 11-01-2018 09:16 2790453

Чтобы держаться прогресса, потому что в какой-то момент окажется, что то, что работало, работать перестало, а миграция на новые решения невозможна, потому что пропущено слишком много итераций, и прямой апгрейд не поддерживается.

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

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

Elven 11-01-2018 15:04 2790551

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

Казбек 11-01-2018 16:09 2790572

PowerShell Core 6.0: Generally Available (GA) and Supported!
Цитата:

What’s happening to Windows PowerShell?
The short answer is that it’s still useful and supported!

Windows PowerShell 3.0, 4.0, and 5.1 will continue to be supported on supported versions of Windows and Windows Server.
(Note: While Windows PowerShell 2.0 is still in support, it has been deprecated, and it’s recommend that workloads be migrated to newer versions of PowerShell.)

However, there are currently no plans to introduce new functionality to Windows PowerShell. This means that the risk of regression will be very low for Windows PowerShell, so you can count on it as a stable platform for your existing workloads. There are also no plans to provide a new Windows Management Framework (WMF) package for downlevel operating systems.

DJ Mogarych 12-01-2018 14:55 2790811

Цитата:

Цитата Elven
изменения если и происходят, то не столь агрессивные »

Происходят, довольно заметные. Например, часть скриптов Powershell пришлось адаптировать для Windows 2003, потому что версия PS 2.0, которая там максимально возможна, не понимает некоторого синтаксиса скриптов для более новых версий PS.


Время: 14:07.

Время: 14:07.
© OSzone.net 2001-