簡體   English   中英

%errorlevel%在循環命令中返回0

[英]%errorlevel% returning 0 in loop command

好的,我已經安裝了Dropbox,但是它與我要查找的內容不符,因此我用Revo Pro卸載了它。 但是,當我打開taskmanager時,仍然有與之相關的進程在我的計算機上運行,​​因此我決定進行批處理以查找並刪除與之相關的所有文件。

    @echo off
    cd c:\
    :a
    set /p a=Phrase that might be realted to it 

    for /r %%d IN (*.*) DO (
        (
        findstr /i /m /c:%a% "%%d"
        if "%errorlevel%"=="0" del "%%d"
        echo %errorlevel%
        )
    )

    pause

問題是:即使在分析文件中變量“%a%”沒有匹配的情況下,我也使用循環運行findstr時,%errorlevel%的返回值為0。但是當我單獨使用findstr時,沒有匹配項%ERRORLEVEL對於匹配,%返回為1和0。 如果使用它,我將刪除我所有的PC文件。 代碼有什么問題?

在帶括號的語句系列中,遇到控制該語句序列(或block )的動詞時,任何%var%都將由該變量的值替換。

在這里,塊是由for控制的語句的整個序列。 %errorlevel%被狀態替換errorlevel的時間for遇到,所以大概0

如果您使用

    findstr /i /m /c:%a% "%%d"
    if not errorlevel 1 del "%%d"
    echo %errorlevel%

然后使用errorlevelrun-time時值(即,隨着循環操作的變化而變化),並且該命令的意思是“如果errorlevel不是(1 或大於1 ),請執行此操作……”

findstr將錯誤errorlevel設置為: found為0, not found1not found file not found (IIRC)為2 ,因此NOT(1或大於1)僅選擇0。 請注意,在某些神秘的情況下,錯誤errorlevel可能會變為負值,但是在findstr我相信0..2是允許的范圍。

不確定代碼有什么問題,但是您可以使用&&操作數跳過它。

 findstr /i /m /c:%a% "%%d" && del "%%d" echo %errorlevel%

感謝Stephan糾正示例。

每當Windows命令解釋器遇到(被解釋為命令塊的開始,它將解析整個命令塊直至匹配)標記該命令塊的結尾並將所有%variable%替換%variable%的當前值。

這意味着在這種情況下,在第一次執行命令FOR之前,已經處理了(DO之后到last )所有內容,並將所有%variable%引用替換為相應變量的當前值。 然后將已預處理的塊執行一次(在IF上 )或多次(在FOR上 )。

通過調試批處理文件,可以看到此行為。 要調試批處理文件@echo off必須先刪除@echo off或使用REM命令將其注釋掉,或更改為@echo on 然后,必須打開命令提示符窗口,並通過在命令提示符窗口中鍵入其名稱(如果路徑或名稱包含空格字符)並用雙引號引起來的完整路徑來執行批處理文件。 Windows命令解釋器現在顯示在執行之前在預處理之后的所有命令行和命令塊,當然,如果批處理文件中出現語法錯誤,則當然會顯示命令或Windows命令解釋器本身輸出的標准消息和錯誤消息。

打開命令提示符窗口意味着運行帶有選項/K cmd.exe ,以在執行命令或批處理腳本后使窗口保持打開狀態。 雙擊批處理文件也會啟動cmd.exe來處理批處理文件,但是批處理終止后,參數/C會自動關閉窗口,這與原因無關-成功完成或發生錯誤。

在運行批處理文件之前打開的命令提示符窗口在成功完成批處理或出現錯誤之后保持打開狀態,除了批處理文件包含不帶參數/B EXIT命令。 因此,批處理代碼專家總是通過在命令提示符窗口中運行它們而不是雙擊它們來編寫測試批處理文件。

在同一命令塊中設置或修改和引用的變量需要延遲變量擴展,如在命令提示符窗口set /?運行時通過命令SET輸出的幫助所說明的那樣set /?

@echo off
setlocal EnableDelayedExpansion
cd /D C:\
:a
set /P "a=Phrase that might be realted to it: "

for /r %%d in (*) do (
    %SystemRoot%\System32\findstr.exe /i /m /c:"%a%" "%%d"
    if "!errorlevel!" == "0" del "%%d" >nul
)
endlocal

但檢查前一個命令的退出代碼也有if errorlevel語法由微軟支持的文章介紹測試對於在批處理文件中一個特定的錯誤級別

@echo off
setlocal EnableDelayedExpansion
cd /D C:\
:a
set /P "a=Phrase that might be realted to it: "

for /r %%d in (*) do (
    %SystemRoot%\System32\findstr.exe /i /m /c:"%a%" "%%d" >nul
    if not errorlevel 1 del "%%d" >nul
)
endlocal

if errorlevel X測試在修改errorlevel變量時,先前命令或應用程序的退出代碼是否大於或等於X 通過使用if not errorlevel X來檢查最后一個退出代碼是否小於X ,這是對退出代碼是否為0的測試。

為了了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並非常仔細地閱讀每個命令顯示的所有幫助頁面。

  • cd /?
  • del /?
  • echo /?
  • for /?
  • if /?
  • set /?

也請參見

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM