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

V!RTuE 07-09-2014 00:50 2399433

Как узнать точное время изменения файла до секунд
 
Этот код показывает время с точностью до минут в формате DD-MM-YYYY HH:MM
Код:

for /f "delims=" %%i in ('dir /b /a:-d /o:d "%f%RECEIVE\*.USR"') do set usrnew=%%i
set usrnew=%~dp0RECEIVE\%usrnew%
for %%i in ("%usrnew%") do set usrtime=%%~ti

Надо с точностью до секунд и в формате DD-MM-YYYY_HH-MM-SS (добавить знак _ после года и заменить : на - )

Iska 07-09-2014 07:05 2399452

Цитата:

Цитата V!RTuE
Надо с точностью до секунд и в формате DD-MM-YYYY_HH-MM-SS (добавить знак _ после года и заменить : на - ) »

Например, можно использовать свойство «LastModified» класса «CIM_DataFile» посредством «wmic.exe»:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=E:\Песочница\0397\Sample.txt

if exist "%sSourceFile%" (
        for /f "usebackq skip=1 delims=" %%i in (
                `wmic.exe DataFile where "Name='%sSourceFile:\=\\%'" get LastModified`
        ) do for /f %%j in ("%%~i") do (
                set sVar=%%~j
                set sLastModified=!sVar:~6,2!-!sVar:~4,2!-!sVar:~0,4!_!sVar:~8,2!-!sVar:~10,2!-!sVar:~12,2!
                echo !sLastModified!
        )
) else (
        echo Can't find source file [%sSourceFile%].
        exit /b 1
)

endlocal
exit /b 0


V!RTuE 07-09-2014 21:00 2399720

Цитата:

Цитата Georgio
Код:
for /f "delims=" %%i in ('dir /b /a:-d /o:d "%f%RECEIVE\*.USR"') do set usrnew=%%i
for %%i in ("%~dp0RECEIVE\%usrnew%") do set usrtime=%%~ti
set usrtime=%usrtime: =_%& call set usrtime=%%usrtime:.=-%%& call set usrtime=%%usrtime::=-%% »

не показывает секунды


Цитата:

Цитата Georgio
for /f "delims=" %%i in ('dir /b /a:-d /o:d "%f%RECEIVE\*.USR"') do set usrnew=%%i
for /f "delims=" %%i in ('mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(Replace(Replace(Repl ace(CreateObject("Scripting.FileSystemObject").GetFile("%~dp0RECEIVE\%usrnew%").DateLastModified,Chr (46),Chr(45)),Chr(32),Chr(95)),Chr(58),Chr(45)))&Close()"') do set usrtime=%%i »

вообще ничего не показывает. Вот весь мой код:
Код:

@echo off
SET f=%~dp0
for /f "delims=" %%i in ('dir /b /a:-d /o:d "%f%RECEIVE\*.USR"') do set usrnew=%%i
for /f "delims=" %%i in ('mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(Replace(Replace(Replace(CreateObject("Scripting.FileSystemObject").GetFile("%f%RECEIVE\%usrnew%").DateLastModified,Chr(46),Chr(45)),Chr(32),Chr(95)),Chr(58),Chr(45)))&Close()"') do set usrtime=%%i
echo %usrtime%
pause

P.S.:Iska, ваш код сработал. спасибо

Iska 07-09-2014 21:22 2399724

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (`dir /b /s /a:-d /o:d "%~dp0RECEIVE\*.USR" 2^>nul`) do (
        set sSourceFile=%%~i
       
        for /f "usebackq skip=1 delims=" %%j in (
                `wmic.exe DataFile where "Name='!sSourceFile:\=\\!'" get LastModified`
        ) do for /f %%k in ("%%~j") do (
                set sVar=%%~k
                set sLastModified=!sVar:~6,2!-!sVar:~4,2!-!sVar:~0,4!_!sVar:~8,2!-!sVar:~10,2!-!sVar:~12,2!
               
                echo !sSourceFile!
                echo !sLastModified!
        )
)

endlocal
exit /b 0


V!RTuE 08-09-2014 01:18 2399813

Цитата:

Цитата Iska
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
for /f "usebackq delims=" %%i in (`dir /b /s /a:-d /o:d "%~dp0RECEIVE\*.USR" 2^>nul`) do (
set sSourceFile=%%~i
for /f "usebackq skip=1 delims=" %%j in (
`wmic.exe DataFile where "Name='!sSourceFile:\=\\!'" get LastModified`
) do for /f %%k in ("%%~j") do (
set sVar=%%~k
set sLastModified=!sVar:~6,2!-!sVar:~4,2!-!sVar:~0,4!_!sVar:~8,2!-!sVar:~10,2!-!sVar:~12,2!
echo !sSourceFile!
echo !sLastModified!
)
)
endlocal
exit /b 0 »

Определяет не самый новый файл в каталоге. В каталоге %~dp0RECEIVE\ есть еще подкаталоги с *.usr-файлами с датой изменения меньшей, чем usr-файл в каталоге %~dp0RECEIVE\ и вот как раз определяет файл и дату из этого подкаталога.
Как переделать код, чтобы сканировал только каталог %~dp0RECEIVE\ и игнорировал все подкаталоги?

V!RTuE 08-09-2014 01:38 2399817

Цитата:

Цитата Georgio
Код:
@echo off
SET f=%~dp0
for /f "delims=" %%i in ('dir /b /a:-d /o:d "%f%RECEIVE\*.USR"') do set usrnew=%%i
for /f "delims=" %%i in ('mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(Replace(Replace(Repl ace(CreateObject("Scripting.FileSystemObject").GetFile("%f%RECEIVE\%usrnew%").DateLastModified,Chr(4 6),Chr(45)),Chr(32),Chr(95)),Chr(58),Chr(45)))&Close()"') do set usrtime=%%i
echo %usrtime%
pause »

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

Georgio 08-09-2014 03:11 2399835

Код:

@echo off
set "f=%~dp0"
for /f "delims=" %%i in ('dir /b /a:-d /o:d "%f%RECEIVE\*.USR"') do set usrnew=%%i
for /f "tokens=1,2" %%i in ('mshta "javascript:new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(new ActiveXObject('Scripting.FileSystemObject').GetFile('%f:\=\\%RECEIVE\\%usrnew%').DateLastModified);close();"') do set x=%%i& set y=%%j
for /f %%i in ('mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(Replace(Replace(Replace("%x%"&Chr(32)&"%y%",Chr(46),Chr(45)),Chr(32),Chr(95)),Chr(58),Chr(45)))&Close()"') do set usrtime=%%i
echo %usrtime%
pause>nul
exit /b


V!RTuE 08-09-2014 03:23 2399837

Georgio, спасибо. теперь работает. Но на мгновение пару раз появляется окно и закрывается. Можно ли как то сделать, чтобы вообще не появлялось ничего?

Georgio 08-09-2014 03:35 2399839

V!RTuE, практически нельзя. Если бы не "close();" и "&Close()", окна вообще пришлось бы закрывать вручную.

Iska 08-09-2014 07:29 2399848

Цитата:

Цитата V!RTuE
Как переделать код, чтобы сканировал только каталог %~dp0RECEIVE\ и игнорировал все подкаталоги? »

Убрать параметр «/s» у команды «dir» и добавить путь к определению файла:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (`dir /b /a:-d /o:d "%~dp0RECEIVE\*.USR" 2^>nul`) do (
        set sSourceFile=%~dp0RECEIVE\%%~i
       
        for /f "usebackq skip=1 delims=" %%j in (
                `wmic.exe DataFile where "Name='!sSourceFile:\=\\!'" get LastModified`
        ) do for /f %%k in ("%%~j") do (
                set sVar=%%~k
                set sLastModified=!sVar:~6,2!-!sVar:~4,2!-!sVar:~0,4!_!sVar:~8,2!-!sVar:~10,2!-!sVar:~12,2!
               
                echo !sSourceFile!
                echo !sLastModified!
        )
)

endlocal
exit /b 0


Georgio 08-09-2014 12:23 2399968

V!RTuE, сократил код, убрав одно мелькающее окно:

Код:

@echo off
set "f=%~dp0"
for /f "delims=" %%i in ('dir /b /a:-d /o:d "%f%RECEIVE\*.USR"') do set usrnew=%%i
for /f "tokens=1,2" %%i in ('mshta "javascript:new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(new ActiveXObject('Scripting.FileSystemObject').GetFile('%f:\=\\%RECEIVE\\%usrnew%').DateLastModified);close();"') do set usrtime=%%i_%%j& call set usrtime=%%usrtime:.=-%%& call set usrtime=%%usrtime::=-%%
echo %usrtime%
pause>nul
exit /b

.


Время: 02:19.

Время: 02:19.
© OSzone.net 2001-