2016-09-28 130 views
3

我使用在Windows 7目前我正在試圖從每個子目錄中獲取最新的文件,並把它們打印到Windows命令行批處理腳本返回最新的文件屏幕。舉例來說,如果我有:如何在Windows命令行中的每個子目錄使用批處理

C:\Home\Hi\Folder1\a 01/05/2016 
C:\Home\Hi\Folder1\b 01/10/2016 

C:\Home\Hi\Folder2\x 03/05/2016 
C:\Homeh\Hi\Folder2\y 03/1/2016 

這將返回:文件夾bx

我已經寫了一些腳本來嘗試這一點,但只返回這在我的例子是x最後一個目錄的最新文件。腳本是:

FOR /R "C:\Users\Maxx\Desktop\tools" %%G in (.) DO (
    Pushd %%G 
    FOR /F %%I IN ('DIR %%G /B /O:D') DO SET NEWEST=%%I 
      ECHO %NEWEST% 
      Popd) 
Echo "back home" 

如果有人知道如何從每個子目錄中獲取最新的文件,那將是非常好的。

注意:我已經看過其他各種示例,如:Generate a list of the newest file in each subdirectory in windows batch,這對構建我現在有的東西非常有幫助,但最終它沒有奏效。

+0

你的代碼看起來除了不使用延遲擴展良好。 – Squashman

+0

最後一個示例文件夾是否正確,或者有兩個拼寫錯誤?我的意思是,'C:\ Home \ Hi \ Folder2 \ y 03/01/2016'而不是'C:\ Homeh \ Hi \ Folder2 \ y 03/1/2016' ... – aschipfl

回答

0
@ECHO OFF 
SETLOCAL 

FOR /R "C:\106x" %%G in (.) DO (
Pushd "%%G" 
SET "first=" 
FOR /F "delims=" %%I IN ('DIR . /a-d /B /O:-D 2^>nul') DO IF NOT DEFINED first SET first=Y&ECHO %%~dpI 
Popd 
) 
Echo "back home" 

GOTO :EOF 

對於每個目錄,進入目錄,清除標誌first,掃描目錄中的文件(不是目錄),基本格式,反向日期順序,壓制任何「找不到文件」從空目錄報告。

在找到第一個(即最年輕的)文件中設置的標誌first和報告文件名 - 或者你需要的文件名的部分。

一旦設置了first,報告機制將不會被調用,因爲if defined適用於當前值的變量。

請注意,指定的日期時,它的最好說明您正在使用的格式 - 或者至少是使用日期,其中的日數爲> 12,這應該是足夠的。例如,您的日期「01/10/2016」可能會被解釋爲1月10日或10月1日,具體取決於受訪者的語言環境。 「2016年10月13日」或「10/13/2016」將使問題變得明顯。

1

您需要申請delayed expansion因爲你正在編寫和相同的代碼塊中讀取變量NEWEST

setlocal EnableDelayedExpansion 
for /R "C:\Users\Maxx\Desktop\tools" %%G in (.) do (
    pushd "%%~G" 
    for /F %%I in ('dir "%%~G" /B /O:D') do set "NEWEST=%%I" 
     echo !NEWEST! 
    ) 
    popd 
echo back home 
endlocal 

另外,更換echo %NEWEST%通過call echo %%NEWEST%%

for /R "C:\Users\Maxx\Desktop\tools" %%G in (.) do (
    pushd "%%~G" 
    for /F %%I in ('dir "%%~G" /B /O:D') do set "NEWEST=%%I" 
     call echo %%NEWEST%% 
    ) 
    popd 
echo back home 

另外,我改進引用。

相關問題