2016-09-15 59 views
0

我需要檢查當前目錄的子目錄內是否存在任何文件,該目錄是前一天或之前修改的。批處理腳本檢查是否存在早於一天的子目錄中的文件

這將是非常容易的,如果它的工作使用下面的行。

FOR /D /r %%G in ("*") DO forfiles /p "%%G" /D -1 /C "SET /a exists = 1" 

但是,用forfiles執行命令時有一個bug,你應該調用另一個cmd。 (見http://ss64.com/nt/forfiles.html

在它需要被調用結束:

FOR /D /r %%G in ("*") DO forfiles /p "%%G" /D -1 /C "cmd /c SET /a exists = 1" 

的問題,這一點,是「存在」將在其他CMD會話一個局部變量,而不是當前的,所以我不會在我的腳本中提供它。

雷蒙德陳建議使用另一個用於在實際執行操作:https://blogs.msdn.microsoft.com/oldnewthing/20120803-00/?p=6953

這讓我寫下面一行:

for /f %%i in ('FOR /D /r %%G in ("*"^) DO forfiles /p %%G /D -1 /C "cmd /c echo 1"') do set exists=%%i 

然而,在這種情況下,這並不爲我的工作在另一個FOR之間,寫入'exists'的是子目錄而不是'1'。

我該如何解決這個問題?

在此先感謝。

編輯: 正如aschipfl所述,切換兩個FOR命令的位置使其工作,但我現在的侷限性是它只是檢查日期而不關心時間。因此,修改日期爲2016年9月15日23:59的文件將在2016年9月16日00:00

+1

'forfiles'不能執行內部'cmd'命令,除非你聲明'cmd/C';這不是一個錯誤; 'forfiles'是一個外部命令(不嵌入'cmd'),所以它不能查看'cmd';你所指的錯誤僅僅是使用*外部命令*。無論如何,你是否知道'forfiles'僅僅是關注日期,但它並不關心時間?所以如果一個文件最後在* 23:59 *處被修改了,它將會在* 00:00 *處被'forfiles/D -1'返回。儘管如此,爲了解決你的問題,我認爲你需要在'forfiles'周圍放置'for/F'循環,但是在'for/D/R'循環中放置* ... – aschipfl

+0

謝謝,我不知道'forfiles'不關心時間。無論如何,我可能需要另一種解決方案。我現在會用這個,直到我找到更好的工作。 – dajavax

回答

0

運行腳本時顯示。爲什麼您必須使用FORFILES

/MINAGE開關ROBOCOPY有幫助嗎?

這應該設置%_exists%變量,如果有年長超過1天的任何文件:

@ECHO OFF 

(SET _fold=%USERPROFILE%\MYDIRECTORY) 

SET "_exists=" 
FOR /F "DELIMS=" %%I IN (
    'ROBOCOPY /L /S /MINAGE:1 /NS /NC /NP /NDL /NJH /NJS "%_fold%" NULL *.*' 
    ) DO SET/A _exists+=1 
IF NOT DEFINED _exists EXIT/B 

REM Commands here if a file exists 
ECHO(Your command is running 

TIMEOUT -1 >NUl 
EXIT/B 

很顯然,我已經把一個命令第12行只是爲了它的地獄,你可能會改變這一點。

+0

我不必使用'FORFILES',它只是我找到的選項。你知道如果你使用'ROBOCOPY'的選項也有@aschipfl提到的限制,它只檢查日期但不關心時間嗎? – dajavax

+0

我也需要它來檢查子目錄,而不是當前目錄,這個解決方案並沒有做到這一點,據我所知,但應該很容易改變。 – dajavax

+0

**/S **選項的確如此! – Compo

相關問題