Показать полную графическую версию : [решено] Сравнить несколько папок по дате создания и вывести самую старую
wlad1164
23-05-2018, 10:32
Добрый день, имеется несколько переменных (пути папок на разных локальных дисках) нужно получить дату создания самой старой из них
%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 (http://forum.oszone.net/thread-193655.html) тема2 (сторонний ресурс) (http://www.cyberforum.ru/cmd-bat/thread942338.html) но не получается...
wlad1164, где и как задаются эти Ваши SkladC, SkladD и т.д.? Покажите.
Также покажите результат исполнения команды:
set Sklad
wlad1164
23-05-2018, 10:56
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\"
И так для каждого локального диска
У… Как всё запущено оригинально. wlad1164, расскажите, для каких целей создаются переменные окружения вида Sklad*?
wlad1164
23-05-2018, 12:05
Iska, собственно потому что не могу придумать решение "в лоб" знаний не хватает (читайте как нет) поэтому и строю велосипед из костылей, множество ненужных переменных создается чтобы понять как оно работает на каждом этапе... Пытаясь объединить кусочки кода найденные на форумах с решением подобных задач
wlad1164, тогда начните с описания самой задачи, которую Вам требуется решить.
greg zakharov
23-05-2018, 12:41
Примерное решение задачи.
@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
megaloman
30-05-2018, 19:09
wlad1164, @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%
Вот тестовый код:@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 дают одинаковые правильные результаты
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.