PDA

Показать полную графическую версию : [решено] Поиск самой старой папки и вывод разницы между датой её создания и текущей


wlad1164
09-05-2018, 19:39
Добрый день, прошу сильно не пинать, но подскажите, возможно ли такое:
Имеется несколько локальных дисков C,D,E,F,G... может быть 2-7 шт, на некоторых из них есть папка "VIDEO" в которой множество подпапок, нужно скриптом найти самую "старую" по дате создания папку среди всех подпапок в папках VIDEO всех локальных дисков где она есть, вывести дату создания той самой папки и если возможно : количество дней с момента создания до текущего момента.

Структура примерно такая:
X:\VIDEO\aa-bb-cc dd
где: X-Буква локального диска, кол-во дисков может быть разным на разных ПК, папки VIDEO тоже может не быть на некоторых дисках
aa-число от 01-31
bb-число от 01-12
cc-число от 01-10
dd-число от 01-24

В написании скриптов у меня совсем слабо, с помощью гугла поулчилось найти самую старую папку aa-bb-cc dd на каждом диске, но как их сравнить между собой не понятно...

cd/d "C:\VIDEO\"&& for /f "delims=" %%i in ('2^>nul dir/A:D/B/O:D') do set folderC=%%i --- выводит имя самой старой вложенной папки на диске С

Iska
09-05-2018, 20:02
wlad1164, Вам «самую старую» для каждого из найденных каталогов VIDEO? Или одну для всех найденных каталогов VIDEO? Если второе — то вот Вам на WSH:
Option Explicit

Dim objDrive
Dim objFolder

Dim dtOldestDateCreated
Dim objOldestFolder


dtOldestDateCreated = #01/01/2100#
Set objOldestFolder = Nothing

With WScript.CreateObject("Scripting.FileSystemObject")
For Each objDrive In .Drives
If .FolderExists(objDrive.DriveLetter & ":\Video") Then
For Each objFolder In .GetFolder(objDrive.DriveLetter & ":\Video").SubFolders
If objFolder.DateCreated < dtOldestDateCreated Then
dtOldestDateCreated = objFolder.DateCreated
Set objOldestFolder = objFolder
End If
Next
End If
Next

If Not objOldestFolder Is Nothing Then
WScript.Echo "Path to folder: " & objOldestFolder.Path
WScript.Echo "Date created: " & objOldestFolder.DateCreated
WScript.Echo "Day differense: " & DateDiff("d", objOldestFolder.DateCreated, Now())

WScript.CreateObject("WScript.Shell").Run "explorer.exe """ & objOldestFolder.Path & """", 1, False
Else
WScript.Echo "Nothing found."
WScript.Quit 1
End If
End With

WScript.Quit 0

wlad1164
09-05-2018, 20:23
Iska, спасибо за столь скорый ответ! Но хотелось бы решения в cmd, или результат как то передать bat скрипт, просто нужно добавить этот фрагмент в текущий bat скрипт.
Еще раз спасибо что не поленились написать код

Iska
09-05-2018, 20:27
wlad1164, что именно — передать? Покажите код Вашего пакетного файла, укажите место, куда Вы хотите добавить новый код.

wlad1164
09-05-2018, 20:36
Iska, передать результат, грубо говоря в процессе работы bat вызвать wsh скрипт который отработает и вернет в bat переменную=результату своей работы, и далее продолжится выполнение bat скрипта

Что то вроде этого.

test.bat
---------------------------
выполнение скрипта
запуск whs из bat
получить результат whs скрипта в переменную bat
продолжение выполнения bat скрипта
---------------------------

под результатом имеется ввиду одну для всех найденных каталогов VIDEO »

Iska
09-05-2018, 20:42
wlad1164, повторяю: покажите код Вашего пакетного файла, укажите место, куда Вы хотите добавить новый код.

wlad1164
09-05-2018, 20:49
Iska, да пример тут не имеет смысла, логика проста
@echo off
set /P var="Number: "
Set Number=%var%
:: Тут обрабатывается все что нужно сделать в зависимости от Number

:: Здесь нужно выполнить WSH скрипт
Set value=Результат WSH скрипта
:: Тут обрабатывается все что нужно сделать в зависимости от value
Pause

Как то так, вроде все словами описал выше))))

Iska
09-05-2018, 21:01
wlad1164, ну, не хотите — как хотите. Вот Вам:
Option Explicit

Dim objDrive
Dim objFolder

Dim dtOldestDateCreated
Dim objOldestFolder


dtOldestDateCreated = #01/01/2100#
Set objOldestFolder = Nothing

With WScript.CreateObject("Scripting.FileSystemObject")
For Each objDrive In .Drives
If .FolderExists(objDrive.DriveLetter & ":\Video") Then
For Each objFolder In .GetFolder(objDrive.DriveLetter & ":\Video").SubFolders
If objFolder.DateCreated < dtOldestDateCreated Then
dtOldestDateCreated = objFolder.DateCreated
Set objOldestFolder = objFolder
End If
Next
End If
Next

If Not objOldestFolder Is Nothing Then
WScript.Echo objOldestFolder.Path
End If
End With

WScript.Quit 0
@echo off
setlocal enableextensions enabledelayedexpansion

set /p var="Number: "
set Number=%var%

rem Тут обрабатывается все что нужно сделать в зависимости от Number

rem Здесь нужно выполнить WSH скрипт
for /f "usebackq delims=" %%i in (
`cscript.exe //nologo "%~dp0Sample.vbs"`
) do set sFolder=%%~i

if defined sFolder (
echo [%sFolder%]
rem Тут обрабатывается все что нужно сделать в зависимости от sFolder
pause
) else (
echo Nothing found
exit /b 1
)

endlocal
exit /b 0

играйтесь.




© OSzone.net 2001-2012