2015-04-21 21 views
5

ben bir dize olarak bir dosyanın son değiştirilme tarihini dönmek gerekiyordu şu kodu var olduğunda: Benve toplu dosya içinde İÇİN/F ve WMIC'de içinde kaçmak ne

o

: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 

bekliyoruz

set tmpd="%%d ddd" 

en az ddd değerini %tmpd% için değer olarak ayarlar.

Ancak yürütme sırasında, hiçbir şey yapılır:

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 
) 

benim için döngü Bu sorunun nedeni olmasını bekliyoruz. Yanlış ben yaptım

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 

şey: Ben cmd.exe tam olarak aynı dizeyi yürütmek, ben bir sonuç elde?

+0

Benim için bir toplu iş dosyasında çalışır, muhtemelen sizin dosyaınız: S: \\ Aslında \\ Varolan File.csv' mevcut değil. Btw. Sadece “echo 2222! Tmpd!” Anlamlıdır – jeb

+1

WMIC sonucunu çözmek için [SO: wmic komutu için toplu komutta metin garnitimi] okumanız gerekir (http://stackoverflow.com/a/25604222/463115) – jeb

+0

@ jeb Şey: Bu yolu Notepad ++ 'da açarak dosyayı açabilirim. Böylece, bu dosyanın mevcut olduğundan oldukça eminim:/ ! Tmpd için teşekkürler! ipucu. Ne zaman kullanacağım çok karıştı - nasıl denir? - değişken tanımlayıcı. – KoenigGunther

cevap

0

Wmic kullanmanız mı gerekiyor? son değiştirilme tarihini dönmek için daha kolay bir yolu var:

: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

bir dosyanın tarihleri ​​ayıklarken sorununa en basit çözüm için kullanılabilir:

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

Yani komut gibi görünecektir Bir metin dizesi olarak, CREATED tarih (ve saati) veLAST MODIFIED tarihini (ve zamanını) alın.

Bu çözelti dosyasına yolu bir boşluk (veya başka bir alfanümerik olmayan karakteri) içeren belirli bir zorluk, üstesinden gelmektedir.

@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.