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

gon_za 12-12-2016 06:30 2694909

Создание папок с именем дат
 
Прошу помощи так как давно уже не практиковался и не могу сообразить

Нужен батник при запуске который создаёт папки. Имя папки должны быть даты в формате 12.11.2016. Вся загвоздка в том при запуске батника нужно что бы выходило окно с запросом начальной даты и конечной. Например вводишь 12.11.2016 это начало потом 15.11.2016 это конец и что бы создалось 4 папки за 12, 13, 14, 15 число. Ну как то так.



Всем большое спасибо за помощь

Iska 12-12-2016 07:20 2694917

Цитата:

Цитата gon_za
Вся загвоздка в том при запуске батника нужно что бы выходило окно с запросом начальной даты и конечной. »

«Вся загвоздка в том, что батник…» пакетные файлы не имеют средств графического интерфейса. Равно как и средств работы с датой (например, для самой банальной проверки, что введённое значение представляет собой текстовое представление а) корректной б) даты). Потому один шут приходится использовать командную строку set /p и/или инъекцию JScript/VBScript/PowerShell. Не проще ли просто взять одно из перечисленного и сделать более простыми средствами ровно то же самое?!

gon_za 12-12-2016 07:33 2694921

Цитата:

Цитата Iska
Вся загвоздка в том, что батник…» пакетные файлы не имеют средств графического интерфейса »

Мне виндовозное окно не нужно. Пусть это в окне cmd

Iska 12-12-2016 07:54 2694925

Ну, ждите. Коллеги, кому не лень будет, может быть, и реализуют. Мне лично подобные извращения (с обязательностью условия использования пакетных файлов без какой-либо необходимости и при существовании простых и доступных «искаропки» альтернатив) порядком поднадоели.

megaloman 12-12-2016 10:39 2694963

gon_za, очевидно, Ваша задача решаема, но, при отсутствии в пакетных файлах штатных средств работы с датой, решение будет громоздким. ИМХО, надо переформулировать задачу с учётом конечной цели: в папки явно будут складываться файлы, которые будут каким-то образом идентифицированы по датам. Создавайте папки по мере надобности, основываясь на информации о дате пришедшего файла. Кстати, я бы именовал папки в формате гггг.мм.дд, потом легче искать папку за нужную дату. Хотелось бы представить всю задачу целиком, а не решать мелкий шаг с сомнительной ценностью для использования.

gon_za 12-12-2016 10:53 2694968

Цитата:

Цитата megaloman
Хотелось бы представить всю задачу целиком, а не решать мелкий шаг с сомнительной ценностью для использования. »

А это и есть вся задача. Копирование файлов будет в ручную. А формат даты может быть любой не принципиально.

Iska 12-12-2016 10:55 2694969

Тогда почему именно пакетные файлы?

gon_za 12-12-2016 11:29 2694985

Цитата:

Цитата Iska
Тогда почему именно пакетные файлы? »

Требование тех кто будет пользоваться

megaloman 12-12-2016 11:43 2694990

gon_za, У Вас явный избыток времени☺, вручную Вы тоже руководствуетесь при копировании какими-то правилами. Поставьте задачу полностью: у меня есть папка с файлами, их надо скопировать (перенести?) по подпапкам в соответствии с моими (какими?) правилами.
Как идея: вводите как бы даты в формате дд.мм.гггг, при этом не проверяем, дата ли это, главное, чтобы гггг был в диапазоне, допустим, от 1900 до 2100, мм от 1 до 12, дд от 1 до 31. Далее откуда- то выбираем Ваши файлы, идентифицируем их дату (создания, изменения, выделяем дату из имени - тут Вам виднее), преобразуем даты в число и анализируем, попадает ли файл в заданный диапазон. Например:
Файл с датой 06.03.2016 отвечает условию 20160231<=20160306<=20160431, для него на основе его даты (а в файле кривой даты быть не может) делаем папку с именем корректной даты. И не важно, что в заданных пользователем датах 31 февраля и апреля , на выходе получите набор папок с корректными датами и не пустые.
Думаю, надо упорядочить всю папку, поэтому ручками вводить какие то даты и, тем более, вручную копировать (кстати, а вручную это как? Каким способом) - спина заболит и ручки устанут. Задачу надо решать на уровне организации процесса, а уж потом бросаться писать код.

gon_za 12-12-2016 12:58 2695025

Цитата:

Цитата megaloman
gon_za, У Вас явный избыток времени☺, вручную Вы тоже руководствуетесь при копировании какими-то правилами. Поставьте задачу полностью: у меня есть папка с файлами, их надо скопировать (перенести?) по подпапкам в соответствии с моими (какими?) правилами.
Как идея: вводите как бы даты в формате дд.мм.гггг, при этом не проверяем, дата ли это, главное, чтобы гггг был в диапазоне, допустим, от 1900 до 2100, мм от 1 до 12, дд от 1 до 31. Далее откуда- то выбираем Ваши файлы, идентифицируем их дату (создания, изменения, выделяем дату из имени - тут Вам виднее), преобразуем даты в число и анализируем, попадает ли файл в заданный диапазон. Например:
Файл с датой 06.03.2016 отвечает условию 20160231<=20160306<=20160431, для него на основе его даты (а в файле кривой даты быть не может) делаем папку с именем корректной даты. И не важно, что в заданных пользователем датах 31 февраля и апреля , на выходе получите набор папок с корректными датами и не пустые.
Думаю, надо упорядочить всю папку, поэтому ручками вводить какие то даты и, тем более, вручную копировать (кстати, а вручную это как? Каким способом) - спина заболит и ручки устанут. Задачу надо решать на уровне организации процесса, а уж потом бросаться писать код. »


Это все хорошо но мне это не нужно. Мне нужно запускаешь батник он спрашивает начальную дату например ввожу 01.12.2016 потом спрашивает конечную дату например 05.12.2016 и в этой папке откуда был запущен батник создалось пять пустых папок с именами 01.12.2016, 02.12.2016, 03.12.2016, 04.12.2016, 05.12.2016 и все!!!

alpap 12-12-2016 17:45 2695129

gon_za,
решите ребус:
сколько и каких папок будет создано из диапазона: 27.02.2017 - 3.03.2017?

megaloman 12-12-2016 18:59 2695157

Если начальная и конечная дата в пределах одного месяца, то всё нормально, в противном в любом месяце принимается число дней 31. Делать контроль на правильное число дней в месяце нет моральных сил.
Код:

@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion

Set /P Date1= Input first Date dd.mm.yyyy=
Call :ErrDate "%Date1%" "YDM"
If Not %Log%==1 GoTo :End
Set /A YDM1=%YDM%

Set /P Date2= Input  last Date dd.mm.yyyy=
Call :ErrDate "%Date2%" "YDM"
If Not %Log%==1 GoTo :End
Set /A YDM2=%YDM%

FOR /L %%i IN (%YDM1%,1,%YDM2%) DO (
        Set /A YDM=%%i
        Set /A YY=1!YDM:~0,4!
        Set /A MM=1!YDM:~4,2!
        Set /A DD=1!YDM:~6,2!
        If 101 LEQ !DD! If !DD! LEQ 131 If 101 LEQ !MM! If !MM! LEQ 112 Md !YDM:~0,4!.!YDM:~4,2!.!YDM:~6,2! 2>nul
)
GoTo :Eof

:End

Echo %YDM%  Input date not correct
pause

GoTo :Eof

:ErrDate
        Set "%~2=%~1"
        Set "Log=0"
        Set "Dot=%~1"
        If "%Dot:~2,1%%Dot:~5,1%"==".." Set "Log=1"
        If !Log!==1 (Set "Log=0" &Set "DD=1%Dot:~0,2%" &Set /A DD=!DD!*2/2 2>nul &&If 1%Dot:~0,2% EQU !DD! Set "Log=1")
        If !Log!==1 (Set "Log=0" &Set "MM=1%Dot:~3,2%" &Set /A MM=!MM!*2/2 2>nul &&If 1%Dot:~3,2% EQU !MM! Set "Log=1")
        If !Log!==1 (Set "Log=0" &Set "YY=1%Dot:~6,4%" &Set /A YY=!YY!*2/2 2>nul &&If 1%Dot:~6,4% EQU !YY! Set "Log=1")
        If !Log!==1 (Set "Log=0" &If 101 LEQ !DD! If !DD! LEQ 131 Set "Log=1")
        If !Log!==1 (Set "Log=0" &If 101 LEQ !MM! If !MM! LEQ 112 Set "Log=1")
        If !Log!==1 (Set "Log=0" &If 11980 LEQ !YY! If !YY! LEQ 12100 Set "Log=1")
        If !Log!==1 Set "%~2=%YY:~1,4%%MM:~1,2%%DD:~1,2%"
GoTo :Eof


megaloman 12-12-2016 21:15 2695185

VBS-скрипт. Папки создаются с именами корректных дат
Код:

Set WShell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")

TDir = WShell.CurrentDirectory

Date1 = InDate(InputBox("Вводите дату в формате дд.мм.гггг", "Начальная дата"))
Date2 = InDate(InputBox("Вводите дату в формате дд.мм.гггг", "Конечная дата"))

For D = Date1 To Date2
'    MsgBox CStr(Date1) + "  " + CStr(Date2) + vbCrLf + CStr(D)
    On Error Resume Next
    FSO.CreateFolder (TDir + "\" + CStr(Year(D)) + "." + Right(CStr(Month(D) + 100), 2) + "." + Right(CStr(Day(D) + 100), 2))
'    If Err.Number<>0 Then
'        MsgBox err.description
'    End If
Next
WScript.Quit

Function InDate(Dtin)
    If IsDate(Dtin) Then
        InDate = CDate(Dtin)
    Else
        MsgBox Dtin + vbCrLf + "Дата введена неверно"
        WScript.Quit
    End If
End Function

alpap,
Цитата:

Цитата alpap
решите ребус:
сколько и каких папок будет создано из диапазона: 27.02.2017 - 3.03.2017?

- а в чём подвох, ночь не буду спать пока не узнаю :) , мой скрипт выдал 5 папок

Iska 12-12-2016 22:09 2695199

Цитата:

Цитата megaloman
- а в чём подвох, ночь не буду спать пока не узнаю , мой скрипт выдал 5 папок »

Високосный, або нет, год же ;).

megaloman 12-12-2016 22:24 2695202

Iska, Вы меня пугаете! Я не смотрю последнее время по ящику новости: что, следующий год объявили високосным?

Iska 12-12-2016 22:47 2695206

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


Время: 12:35.

Время: 12:35.
© OSzone.net 2001-