Quand et quoi échapper dans FOR / F et WMIC dans un fichier de commandes

J’ai le code suivant qui est censé retourner la date de la dernière modification d’un fichier en tant que chaîne:

: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 

J’attends cela

 set tmpd="%%d ddd" 

définit au moins ddd comme valeur pour %tmpd% .

Cependant, pendant l’exécution, rien n’est fait:

 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 ) 

Je m’attends à ce que ma boucle soit la cause de ce problème. Lorsque j’exécute exactement la même chaîne dans cmd.exe, j’obtiens un résultat:

 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 ) [xxx@yyy auf zzzz] ) sers\yc067xd>(set tmpd=20150413172700.000000+120 [yc067xd@R0199 auf FS00QHE0] C:\Users\uuuu>echo %tmpd% 20150413172700.000000+120 

Où est-ce que j’ai fait quelque chose de mal?

Devez-vous utiliser Wmic? Il existe un moyen plus simple de retourner la dernière date de modification:

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

Donc, votre script ressemblerait à ceci:

 :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 

La solution la plus simple au problème de l’extraction des dates d’un fichier peut être utilisée pour obtenir, en tant que chaîne de texte, la date (et l’heure) CREATED et la date (et l’heure) LAST MODIFIED .

Cette solution surmonte une difficulté particulière, où le chemin d’ access au fichier contient un espace (ou un autre caractère non alphanumérique).

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