2015-05-20 77 views
0

我有一個批處理文件,我想拾取最新的「清單」文件,所以我希望能夠使用for循環,但我不確定正確的語法。在批處理腳本中獲取文件名中包含字符串的最新文件的絕對路徑

這是我有:

for /R %imagePath% %%F in (*.manifest.*) do (set manFile=%%F) 

它執行正確的事,返回「C:/some/path/to/file.manifest.ext」,但不一定是最新的一個。我看到其他問題,如使用dir這個問題,但後來我沒有得到整個路徑。我在與dir這樣的嘗試看起來像:

for /R %imagePath% %%F in ('dir /od *.manifest.*.*') do (set manFile=%%F) 

這不給我我所期待的輸出。

完成此操作的最佳方法是什麼?

回答

0
set "manFile=" 
for /f "tokens=2,*" %%a in (' 
    robocopy "%imagePath%" "%temp%" *.manifest.* /is /l /nocopy /s /njh /njs /ndl /nc /ns /ts 
    ^| sort /r 
') do if not defined manFile set "manFile=%%b" 

此使用for /f以處理robocopy命令,將生成具有UTC時間戳匹配的文件將被反向排序,從而最新的文件將在列表中的第一列表的輸出。

+0

太棒了。我不認爲我會想用'robocopy'來列出文件。非常感謝! –

0

MC ND的解決方案非常聰明。但是當我嘗試使用「」作爲文件掩碼時,我得到了錯誤的結果。原因是robocopy列出了來自源文件夾和(虛擬)目標文件夾的相應文件,在這種情況下爲%TEMP%。您可以通過將/xx開關添加到robocopy來解決該問題,或者只使用空目標文件夾。由於我不是100%確定/xx開關將始終工作,我訴諸指定目標文件夾(希望不存在)的隨機名稱。

原始代碼的第二個缺點是FOR循環將不必要地執行,直到可以任意長的文件列表的末尾。

下面的代碼修復的目標文件夾的問題,得到的結果後快捷鍵循環,此外,出口雙雙文件名,並在樹中最年輕的文件的時間戳:

@echo off 
setlocal 

set "srcpath=%~1" 
if not DEFINED srcpath set srcpath=%CD% 
set /A skip=%2 - 1 
set opt= 
if DEFINED skip if %skip%0 GTR 0 set "opt=skip=%skip%" 

set MASK=*.manifest.* 
for /f "%opt% tokens=1,2*" %%a in (' 
    robocopy "%srcpath%" %RANDOM%_%RANDOM% %MASK% /l /s /ts /njh /njs /ndl /nc /ns ^| sort /r 
') do set "tstamp=%%a %%b" & set "youngestfile=%%c" & goto :ex 

:ex 
echo %youngestfile% %tstamp% 

腳本現在可以接受2個參數。第一個參數是源文件夾,如果省略,則默認爲當前文件夾。第二個參數是數字,允許搜索第n個最小的文件。因此,例如「lastfile.2」會返回以當前文件夾爲根的樹中的第二個最年輕的文件。這是FOR循環從最上面的文件開始的最小文件的副作用。

相關問題