2009-12-27 48 views
4

我有一批下面的代碼(CMD):跳過當錯誤發生時

for /f "delims=" %%f in ('dir /b /s Example') do (
command 
if %errorlevel%==1 (
command 
SKIP 
) 
command 
) 

編輯: 爲了讓事情變得更加清晰: for /f...搜索名爲「樣本」目錄,並循環到搜索爲更多的目錄比一個。 第一個command是一個刪除命令,它刪除目錄中的所有文件。 command發生錯誤時發生,是一個echo命令,它將關於錯誤的一些信息寫入文本文件。 現在洞skip東西;有時,由於access deniedthis file is in use by...,文件無法刪除。通常,如果沒有跳過的東西會發生什麼,它會停止命令並掛起。所以,我想要做的是防止這種情況發生。或者,我想使用類似skip的東西,所以它可以跳過該文件並繼續。所以我認爲這個命令需要在delete命令中傳送。

我希望現在很清楚。

在此先感謝。

+0

調用dir是非常愚蠢的,因爲可以爲你走一個目錄樹 – Anders 2009-12-27 21:31:18

+1

請更好地解釋你需要什麼。我嘗試用我的答案猜測你的意圖,但顯然沒有成功。那麼,「跳過」是什麼意思?也許你可以在該目錄結構上提供一個示例目錄結構和批處理腳本的預期行爲。 – atzz 2009-12-28 11:00:56

+1

您對「跳過」一詞的使用非常模糊。 – Alan 2010-01-04 19:32:14

回答

3

是否這樣?

for /f "delims=" %%f in ('dir /b /s Example') do (
    command 
    if not errorlevel 1 (
    command-for-success 
) else (
    command-for-error 
) 
) 
+4

或者:'command &&(success)|| (error)' – Joey 2009-12-27 19:24:27

+0

@Johannes - 哇,我不知道「||」!看起來像一個簡潔的方式來寫短的選擇。 – atzz 2009-12-27 20:19:50

+0

這並不是我想要的。我想讓它跳過它,然後繼續。該命令執行什麼操作,它會查找「示例」,然後刪除該目錄中的所有內容。問題是你不能很容易'跳過'它。 – 2009-12-28 10:09:35

0

我相信這是你想要

for /f "delims=" %%f in ('dir /b /s Example') do (
    command 
    if not errorlevel 1 (
    command 
) else (
    command 
    goto :eof 
) 
) 
+0

這和@atzz一樣,再次閱讀評論,我不喜歡那種東西。 – 2010-01-03 18:58:49

+2

這是我嘗試瞭解「skip」意思的最佳嘗試。努力改進你的解釋,因爲如果你不這樣做,你就會懷疑你真正重視的數量是否是一個好答案。你對獲得理解的興趣缺乏興趣只能與你的無禮相抗衡。 – 2010-01-04 16:12:28

2

創建兩個命令文件並運行delex.cmd什麼。未刪除的文件和目錄將記錄到delex.txt。那些掛起來的,將會有一個最小化的cmd窗口打開,在使用ping之後會延遲死亡(感謝Doc Brown的建議)。

delex2.cmd 
---------- 
@echo off 
del /q %1 
if exist %1 echo %1 not deleted!>>delex.txt 
exit 

delex.cmd 
--------- 
@echo off 
if exist delex.txt del delex.txt 
for /f "delims=" %%f in ('dir /s /b example') do start "delextaskkill" /min delex2.cmd "%%f" 
ping 127.0.0.1 -n 3 -w 1000> nul 
taskkill /fi "Windowtitle eq delextaskkill"> nul 

測試了:

\example 
| file1 
| file2 
| file3 
| file4 
| file5 
| 
\---example 
     file1 
     file2 
     file3 
     file4 
     file5 
+0

我認爲這個可以改進,以便在給定的超時後關閉所有'懸掛'窗口。爲'開始'命令添加一個特殊的窗口標題。使用http://malektips.com/dos0017.html來模擬一個「等待」命令(例如,等待10秒後),並使用taskkill/fi「Windowtitle eq 」來終止所有掛起的窗口。 – 2010-01-07 07:28:09

+0

偉大的建議Doc - 它的作品! – fupsduck 2010-01-07 11:36:23

+0

+1讓我的額外建議工作! – 2010-01-07 11:56:01

0

也許這是更先進的比使用剛剛建成,在cmd中處理來完成。爲什麼不考慮使用Windows腳本宿主(vbscript/jscript)甚至PowerShell?兩者都可能爲您提供您所要求的控制級別。

1

當使用del,並且「訪問被拒絕」或「此文件正在使用...」時,%errorlevel%爲0,因此測試%errolevel%是無用的。也許下面這個簡單的解決方案適用於您的情況:

for /f "delims=" %%f in ('dir /b /s Example') do (
    del %%f 
    if exist %%f (
     echo "file not deleted" 
    ) else (
     echo "file deleted" 
    ) 
) 
+0

但它不會跳過,是嗎? – 2010-01-04 15:09:46

+0

我嘗試了3個文件在一個目錄'Example'中,一個寫保護,兩個正在使用,我得到3次「文件未被刪除」。如果這不是'skip'的意思,請給出一個更好的例子或解釋。 – 2010-01-04 15:42:04

+0

+1您的建議。 – fupsduck 2010-01-07 11:37:08

0

試試這個批處理文件:

@echo off 
REM For each directory named 'Example' ... 
for /f "delims=" %%f in ('dir /b /s Example') do (
    REM .. enter the directory and delete all the files found there. 
    pushd . 
    cd %%f 
    del /q * 
    for /f "delims=" %%z in ('dir /b') do (
     REM Any files that still exist must have been inaccessable. Log an error. 
     echo Unable to delete file %%z > C:\logfile.txt 
    ) 
    popd 
) 

與下面的目錄結構進行測試:

folder\ 
|------Example\ 
|  |-------file1 (write-protected) 
|  |-------file2 
|  |-------file3 
|------deeper\ 
     |-------Example\ 
       |-------file4 
       |-------file5 (write-protected) 
       |-------file6 

運行批處理文件後,只留下了file1file5。爲遇到的每個寫保護文件打印「訪問被拒絕」消息;如果這很煩人,請重新指導批處理文件的輸出,如script.bat > NUL以隱藏它。

0

所以畢竟現有的答案並不能滿足你,你絕對需要你的批處理文件中跳躍,我會再試試:

@echo off 
setlocal 

for /f "delims=" %%f in ('dir /b /s batch') do call :DoSomething %%f 
goto end 

:DoSomething 
echo Here i am: %1 
if %errorlevel%==1 goto :eof 

echo No error occured 
goto :eof 

:end 
endlocal 

訣竅是,for循環調用子函數在同一個文件中,並給它所需的參數。這個新的調用運行在一個新的上下文中,並且只能訪問按給定順序在do call :DoSomething之後定義的變量。

所以,你必須與%1這裏訪問的變量,%2,等等。如果你要離開這個環境下,你必須做出一個goto :eof跳轉到文件的末尾(此標記在批處理模式預定義的,應不會發生在你的文件中),什麼離開了上下文並返回到for循環。

經過整個循環後,我們跳轉到:end標記,稍作清理並完成。

0

下面的外觀爲您遞歸希望「目錄名稱」目錄樹下,針對該文件名執行commandstuff.bat的文件擴展:

用於/ R%我在(C:\目錄名\ *。 .EXT)做 commandstuff 「%I」

Commandstuff.bat看起來是這樣的:

@ECHO OFF
德爾%1
IF(%ERRORLEVEL%== 0)轉到結束
:ERROR
回聲錯誤刪除%1

:END
回聲端

這將運行commandstuff.bat爲你刪除你想要的文件。當出現錯誤時,它將簡單地回顯文件詳細信息並繼續處理下一個文件。