Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Сравнить несколько папок по дате создания и вывести самую старую

Ответить
Настройки темы
CMD/BAT - [решено] Сравнить несколько папок по дате создания и вывести самую старую

Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день, имеется несколько переменных (пути папок на разных локальных дисках) нужно получить дату создания самой старой из них
%SkladC%="C:\Sklad\folder 1\" :: создана 23.05.18
%SkladD%="D:\Sklad\folder 2\" :: создана 22.05.18
%SkladE%="E:\Sklad\folder 3\" :: создана 20.05.18
%SkladF%="" :: нет такой папки на диске F
%SkladG%="G:\Sklad\folder 4\" :: создана 24.05.18

Иными словами, нужно получить дату создания папки E:\Sklad\folder 3\ т.к. она самая "старая" и записать её в переменную
Доп ограничения: что переменная может быть пустой (в примере %SkladF%), в имени папки есть пробел (в примере "folder_1")
Пытался сделать по аналогии с решениями из этой темы: тема1 тема2 (сторонний ресурс) но не получается...

Отправлено: 10:32, 23-05-2018

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


wlad1164, где и как задаются эти Ваши SkladC, SkladD и т.д.? Покажите.

Также покажите результат исполнения команды:
Код: Выделить весь код
set Sklad

Отправлено: 10:38, 23-05-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska,
Код: Выделить весь код
@for /f "tokens=2 delims=:" %%D in ('
 2^>nul dir/a:d/b/o:d/tc "D:\SKLAD\"^| findstr/lvxc:"%~nx0"^| findstr/n "^"^| findstr "^1:"
') do set D=%%D
If "%D%" NEQ "" Set SkladD="D:\SKLAD\%D%\"

Echo %SkladD%
Echo "D:\SKLAD\10-05-18 10\"

И так для каждого локального диска

Отправлено: 10:56, 23-05-2018 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


У… Как всё запущено оригинально. wlad1164, расскажите, для каких целей создаются переменные окружения вида Sklad*?

Отправлено: 11:53, 23-05-2018 | #4


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, собственно потому что не могу придумать решение "в лоб" знаний не хватает (читайте как нет) поэтому и строю велосипед из костылей, множество ненужных переменных создается чтобы понять как оно работает на каждом этапе... Пытаясь объединить кусочки кода найденные на форумах с решением подобных задач

Отправлено: 12:05, 23-05-2018 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


wlad1164, тогда начните с описания самой задачи, которую Вам требуется решить.

Отправлено: 12:07, 23-05-2018 | #6


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Примерное решение задачи.
Код: Выделить весь код
@echo off
  setlocal enabledelayedexpansion
    call:setVariables
    for /f "tokens=1,* delims==" %%i in ('set sklad') do (
      for /f %%k in ('dir /ad/tc %%j ^| findstr /irc:"folder"') do (
        call:convertToJulian %%k
        set "!julian!=%%j"
      )
    )
    set "ts=0"
    for /f "tokens=1,* delims==" %%i in ('set^
     ^| findstr /irc:"[0-9].*\sklad"') do if %%i gtr !ts! set "ts=%%i"
    for /f "tokens=1,* delims==" %%i in ('set^
     ^| findstr /brc:"!ts!"') do (
      for /f "tokens=1" %%k in ('dir /ad/tc "%%j"^
       ^| findstr /irc:"folder"') do set "latest=%%j %%k"
    )
    echo:!latest!
  endlocal
exit /b

:setVariables
  for /l %%i in (65, 1, 90) do (
    cmd /c exit /b %%i
    set "l=!=exitcodeascii!"&set "d=!l!:\Sklad"
    if exist "!d!" set "Sklad!l!=!d!"
  )
exit /b

:convertToJulian
  set "day=%~1"
  set /a "dd=%day:~0,2%, mm=%day:~3,2%, yy=%day:~6,4%"
  if %mm% lss 3 set /a "mm+=12, yy-=1"
  set /a "a=yy/100, b=a/4, c=2-a+b, e=36525*(yy+4716)/100, f=306*(mm+1)/10"
  set /a "julian=c+dd+e+f-1524"
exit /b
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:41, 23-05-2018 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


wlad1164,
Решаю задачу: На логических дисках компьютера возможно имеются определённые папки, например, с именем "Sklad". Необходимо найти в них самую старую по времени создания подпапку. Вот рабочее решение
Код: Выделить весь код
@Echo Off
cls
Set "FN0=Sklad"

FOR /F "usebackq tokens=1,*" %%i IN (`fsutil fsinfo drives`) DO Call :AllD "%FN0%" "OldDate" "OldDir" %%j

Echo "%OldDate%"   "%OldDir%"
Pause
GoTo :Eof

:AllD
	Set /A Code=2
	Set "CDTold=99999999999999"
	Set "FNold=Folder %1 not found in all disks"
	:Begin
		If "%4"=="" GoTo :End 
		If Not Exist "%4\%1" (Shift /4 &GoTo :Begin)
		If Not %Code% EQU 0 (Set /A Code=1 &Set "FNold=Subfolders in Folder %1 not found in all disks")
		Pushd "%4%~1"
		FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /A:D /O:-D /T:C`) DO (Set /A Code=0 &Set "FN=%4%~1\%%d")
    		For /f "tokens=1,2* delims=,." %%a in ('wmic fsdir where "name='%FN:\=\\%'" get 'CreationDate' /format:csv') Do (
			If /I "%%a"=="%ComputerName%" Set "CDT=%%b"
		)
		If "%CDT%" LSS "%CDTold%" (Set "CDTold=%CDT%" &Set "FNold=%FN%")
		Popd
	Shift /4
	GoTo :Begin
	:End
	Set "%~2=%CDTold:~0,4%.%CDTold:~4,2%.%CDTold:~6,2% %CDTold:~8,2%:%CDTold:~10,2%:%CDTold:~12,2%"
	Set "%~3=%FNold%"
Exit /B %Code%
Похоже, наткнулся на неприятность при работе с CMD
Вот тестовый код:
Код: Выделить весь код
@Echo Off
cls

Set "FN0=E:\_Скопировано.wd"

Pushd "%FN0%"

Echo:
Echo:

FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /A:D /O:-D /T:C`) DO Set "OldFile=%%d" &Set "TimeFile=%%~td"
Echo "%TimeFile%" "%OldFile%"

Echo ===================
Echo:

Set "DirName=%FN0%\%OldFile%"
Set "DirName=%DirName:\=\\%" 

wmic fsdir where "name='%DirName%'" get 'CreationDate' /format:csv

Echo ===================
Echo:

Dir /A:D /O:-D /T:C 

Popd
Pause
Пытаюсь получить время создания самой старой папки из цикла Set "TimeFile=%%~td"
Выяснил, что Dir сортирует папки по дате создания правильно.
Однако, при применении расширения переменной %%~td получаем отнюдь не время создания папки.
То есть ключи в команде Dir под For никак не влияет на значение %%~td
Просто Dir и WMIC дают одинаковые правильные результаты

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 30-05-2018 в 19:23.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:09, 30-05-2018 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Сравнить несколько папок по дате создания и вывести самую старую

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Прочие - [решено] Сортирование файлов по папкам (копирование по дате создания) DIMM2005 Программное обеспечение Windows 36 03-01-2020 16:54
CMD/BAT - Резервирование файлов с сравнением по дате создания Атриарх Скриптовые языки администрирования Windows 5 21-09-2016 19:21
Прочие БД - Access. Отчет. Сделать выборку по дате, но без группировки. Вывести в Excel в ячейку JaneSu Программирование и базы данных 2 01-05-2016 18:56
CMD/BAT - Сортирование файлов по папкам (копирование в многоуровневые папки по дате создания) Systems Скриптовые языки администрирования Windows 18 03-10-2014 11:37
Переименование группы файлов по дате создания Serg2010 AutoIt 1 10-04-2012 10:25




 
Переход