Войти

Показать полную графическую версию : [решено] Дата создания (изменения) файла


Arsenik77
04-10-2016, 13:59
Добрый день
Необходима вычислить дату изменен файла в формате (файл изменен N дней назад).
Нашел здесь, но там как-то мудрено, и она не совсем рабочая.
http://www.dostips.com/DtTipsDateTime.php#Batch.FileDate

Elven
04-10-2016, 14:14
так создания или изменения? Если изменения то все просто, например вот так:
forfiles /m file.name /c "cmd /c echo @fdate"
А вот если именно создания, то тут уже придется извращаться извращениями. Например парсить вывод dir /o:d /tc
for /f %i in ('dir /o:d /tc file.name ^| findstr file.name') do echo %i

Arsenik77
04-10-2016, 14:17
Про первый вариант я знаю, но нужно именно в формате "файл изменен N дней назад"

Внес поправку нужен файл изменен

Elven
04-10-2016, 14:30
Arsenik77, подсчет количества дней в данном случае на cmd/bat дело длительное и неблагодарное, может имеет смысл поcмотреть в сторону PS?
dir file.name | Select Fullname,CreationTime,LastWriteTime,
@{Name="age creation";Expression={[int]((Get-Date)-$_.CreationTime).TotalDays}},
@{Name="age changes";Expression={[int]((Get-Date)-$_.LastWriteTime).TotalDays}}
PS может адекватно от одной даты отнять другую, в то время как на cmd я такой возможности не знаю, кроме как вручную потрошить весь год помесячно, учитывая развчетырегодаизменчивый февраль.

megaloman
04-10-2016, 17:21
Вот VBS. Сохраните скрипт в файл .vbs, сделайте на него значок, затаскивайте Ваш файл на этот значок.
Если принципиально cmd, можно придумать, используя VBSSet Args = WScript.Arguments
If Args.Count = 0 Then
MsgBox "Имя файла не задано"
Else
FName = CStr(Args(0))
Set FSO = CreateObject("Scripting.FileSystemObject")
Set InFile = FSO.GetFile(FName)
iDate = DateDiff("d", InFile.DateLastModified, Now, 2, 1)
MsgBox "Файл" + vbCrLf + FName + vbCrLf + "изменён " + CStr(iDate) + " дней тому назад"
End If

Arsenik77
04-10-2016, 20:22
megaloman, Elven, подскажите как это прикрутить к bat.
Например переменной задается файл, а в ответ требуемое количество дней .

megaloman
04-10-2016, 21:31
Arsenik77, Сложно что-то делать, если есть недоговоренности - у Вас явно задача другая, а посчитать число дней - эпизод. Поэтому прибегну к извращениям:@Echo Off
cls

Set "FName=Z:\Box_In\Диск здоровья Грация с магнитами - мини фитнес тренажер для талии - Интернет-магазин - Городской Центр Тренажеров.mht"

Set "VBS=%TEMP%\%~nx0.vbs"

>"%VBS%" Echo Set Args = WScript.Arguments
>>"%VBS%" Echo FName = CStr(Args(0))
>>"%VBS%" Echo Set FSO = CreateObject("Scripting.FileSystemObject")
>>"%VBS%" Echo Set InFile = FSO.GetFile(FName)
>>"%VBS%" Echo iDate = DateDiff("d", InFile.DateLastModified, Now, 2, 1)
>>"%VBS%" Echo WScript.Echo iDate

Set "iDate=False"
FOR /F "usebackq" %%i IN (`cscript //Nologo "%VBS%" "%FName%" 2^>nul`) DO Set iDate=%%i
Del "%VBS%"

If Not "%iDate%"=="False" (
Echo Файл %FName%
Echo изменён %iDate% дней тому назад
) Else (
Echo Файл %FName% не найден
)


pause

greg zakharov
04-10-2016, 22:50
нужно именно в формате "файл изменен N дней назад"
<?xml : version="1.0" encoding="windows-1251"?> ^<!-- :
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3*" %%i in (
'dir /a-d /tw ^| findstr /brc:"[0-9]"'
) do (
set "tm=%%i %%j"
cscript /nologo "%~f0?.wsf" "!tm!" "%%l"
)
endlocal
exit /b
-->
<package>
<job id="VBS">
<script language="VBScript"><![CDATA[
WScript.Echo "Файл " & WScript.Arguments(1) & _
" изменен " & _
DateDiff("d", CDate(WScript.Arguments(0)), Date) & _
" назад"
]]></script>
</job>
</package>

Arsenik77
05-10-2016, 08:11
megaloman, Именно то, что нужно!!




© OSzone.net 2001-2012