2015-04-21 1 views
5

я следующий код, который должен возвращать дату последнего изменения файла в виде строки:Когда и что бежать в FOR/F и WMIC в пакетном файле

:getLastModifiedDate 
@echo on 
SETLOCAL enabledelayedexpansion 
set FILE=%~f1 
set FILE=!FILE:%NETWORK_DRIVE_SHARE_PATH%=%NETWORK_DRIVE_NAME%! 
set FILE=%FILE:\=\\% 
set RETURN_VALUE="internal script error" 

for /f "tokens=* usebackq" %%d in (`wmic datafile where Name^="%FILE%" get lastmodified ^| findstr ^"[0-9]^"`) do (set tmpd="%%d ddd" 
    echo 111111 %tmpd% 
    echo 222222 !tmpd! 
    echo 333333 %%tmpd%% 
    set RETURN_VALUE=%tmpd:~0,14% 
) 
(ENDLOCAL 
    set getLastModifiedDateResult=%RETURN_VALUE% 
) 

exit 
@echo off 
goto :eof 

Я ожидаю, что

set tmpd="%%d ddd" 

комплекты не менее ddd как стоимость для %tmpd%.

Однако, во время исполнения, ничего не делается:

C:\Windows\system32>for /F "tokens=* usebackq" %d in (`wmic datafile where Name="S:\\Actually\\Existing File.csv" get lastmodified | findstr "[0-9]"`) do (
set tmpd="%d ddd" 
    echo 111111 
    echo 222222 !tmpd! 
    echo 333333 %tmpd% 
    set RETURN_VALUE=~0,14 
) 

Я ожидаю, что мой цикл для быть причиной этой проблемы. Когда я выполняю ту же самую строку в cmd.exe, я получаю результат:

C:\Users\uuuu>for /f "tokens=* usebackq" %d in (`wmic datafile where Name^="S:\\Actually\\Existing File.csv" get lastmodified ^| findstr ^"[0-9]^"`) do (set tmpd=%d) 

[[email protected] auf zzzz] 
) sers\yc067xd>(set tmpd=20150413172700.000000+120 

[[email protected] auf FS00QHE0] 
C:\Users\uuuu>echo %tmpd% 
20150413172700.000000+120 

Где я сделал что-то не так?

+0

Для меня это работает в пакетном файле, возможно, ваш файл 'S: \\ На самом деле \\ Существующий файл.csv' не существует. Btw. Только «echo 2222! Tmpd!» Имеет смысл – jeb

+1

Чтобы работать с результатом WMIC, вы должны прочитать [SO: Text garble in batch script для команды wmic] (http://stackoverflow.com/a/25604222/463115) – jeb

+0

@ jeb. Дело в том, что я могу открыть файл, открыв этот путь в Notepad ++. Таким образом, я уверен, что этот файл существует:/ Спасибо за! Tmpd! намек. Я очень смущен, когда использовать, как это называется? - идентификатор переменной. – KoenigGunther

ответ

0

Вам нужно использовать wmic? Существует простой способ вернуть дату последнего изменения:

FOR %%f IN ("%file%") DO SET lastmodified=%%~tf 

Так что ваш сценарий будет выглядеть так:

:getLastModifiedDate 
    @echo on 
    SETLOCAL enabledelayedexpansion 
    set FILE=%~f1 
    set FILE=!FILE:%NETWORK_DRIVE_SHARE_PATH%=%NETWORK_DRIVE_NAME%! 
    set FILE=%FILE:\=\\% 
    set RETURN_VALUE="internal script error" 

    FOR %%f IN ("%FILE%") DO SET getLastModifiedDateResult=%%~tf 
    set getLastModifiedDateResult=%getLastModifiedDateResult:~0, 10% 
    @echo off 
endlocal & goto :eof 
0

Самое простое решение проблемы извлечения даты к файлу может быть использован для получить в текстовой строке как СОЗДАНО дата (и время) иПОСЛЕДНИЕ ИЗМЕНЕННЫЕ дата (и время).

Это решение преодолевает особые трудности, где путь к файлу содержит пространство (или другой не алфавитно-цифровой символ).

@echo off 

:: File location 
SET file=C:\Users\%username%\Desktop\Get TIMESTAMP\file.txt 

:: Get CREATED timestamp of specified file 
FOR /F "tokens=1,* delims= " %%A IN ('DIR /T:C /A:-D "%file%" ^|FIND "/"') DO (
    SET Cdate=%%A 
    SET Ctime=%%B 
    SET Ctime=!Ctime:~0,5! 
    :: Get file Creation Date 
    SET DCREATED=!Cdate! 
    ECHO CREATED DATE: !DCREATED! 
    :: Get file Creation Time 
    SET TCREATED=!Ctime! 
    ECHO CREATED TIME: !TCREATED! 
) & ECHO. 

:: Get LAST MODIFIED timestamp of specified file 
FOR /F "tokens=1,* delims= " %%A IN ('DIR /T:W /A:-D "%file%" ^|FIND "/"') DO (
    SET Mdate=%%A 
    SET Mtime=%%B 
    SET Mtime=!Mtime:~0,5! 
    :: Get file MODIFIED Date 
    SET DMODIFIED=!Mdate! 
    ECHO MODIFIED DATE: !DMODIFIED! 
    :: Get file MODIFIED Time 
    SET TMODIFIED=!Mtime! 
    ECHO MODIFIED TIME: !TMODIFIED! 
) & ECHO. 
Смежные вопросы