批處理一閃即逝的幾種情況分析

一、批處理文件名中包含「&」、「^」

此問題在Win7所有版本中都會出現,具體表現為使用右鍵以管理員身份運行時批處理一閃即逝,雙擊運行則正常。這個問題是本人在去年12月的時候發現的,應該是Win7的一個BUG,當時還發了幾條微博。

假設文件名為「A&B.bat」,系統會認為「&」前後是兩條語句,所以會執行「A」和「B.bat」。

假設文件名為「A^B.bat」,系統會忽略「^」,所以實際上運行的是「AB.bat」。

但是一般情況下當前文件夾中並沒有「A」、「B.bat」、「AB.bat」這幾個文件,於是就自動退出了。這裡說明一下,運行「A」時,系統不會運行無擴展名的「A」,而是會按照環境變數%PATHEXT%裡面的值「.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC」按順序進行查找「A.COM」、「A.EXE」……

為此我們可以進行驗證,在某個文件夾中新建這6個文件A、A&B.bat、A.bat、A^B.bat、AB.bat、B.bat。

除A&B.bat和A^B.bat外,內容均為

12 @Echo %~nx0@Pause

其中%~nx0表示當前批處理(0)的文件名(n)及擴展名(x)。A&B.bat和A^B.bat需要把%~nx0換成A^&B.bat和A^^B.bat,因為「&」和「^」都需要轉義才能顯示

雙擊直接運行A&B.bat:

右鍵管理員身份運行A&B.bat:

你還可以將A.bat、B.bat刪除其中一個或者都刪除再看看運行結果,我就不截圖了。A^B.bat的結果和A&B.bat類似,也不截圖了。

二、環境變數%PATH%有問題

批處理中調用了系統目錄下的程序,但是PATH有問題導致找不到文件。這個問題的起因,可能是你手工修改失誤,也可能是安裝了什麼軟體對PATH進行了修改,最常見的是MacType這個軟體。

雖然FlyingSnow說MacType的這個BUG早已修復,但是本人Win7 x64親測這個BUG在目前最新版2010.1231.0中依然存在,之前沒有安裝過任何舊版本MacType。

目前導致這個問題的具體原因還不太清楚,因為PATH看上去是正確的,一種可能有效的解決辦法是在PATH最後加一個「;」再保存,如果不行可以再把最後的「;」刪掉再保存。

三、批處理本身編寫有誤

拼寫錯誤、忘記加pause這些低級錯誤我就不說了。說一個稍微高級一點兒的關於for的錯誤。

在批處理中for語句的變數都要寫兩個%,比如%%i,而在CMD中只需一個,這是一個比較容易出錯的地方,如果在批處理中寫成了%i,在運行到這條語句時就會提示錯誤然後自動退出。

下面介紹一種方法可以看到一閃即逝的錯誤,方便找到原因:

先Win+R打開運行窗口,輸入CMD回車,打開CMD窗口,然後將批處理文件拖入CMD窗口,此時文件的路徑會出現在屏幕上,然後按回車即可。

當然為了方便你也可以為bat文件添加一個右鍵菜單,具體步驟我就不講了,Google有的是,命令行這樣寫

1 "C:WindowsSystem32cmd.exe" /k "%1"

四、CMD被禁用

這個問題一般不會導致一閃即逝,而是會提示「命令提示符已被系統管理員停用」。

既可以在組策略中修改也可以在註冊表中修改

  • 組策略中的位置:
  • Win+R打開運行窗口輸入gpedit.msc回車打開組策略

    左側選擇用戶配置 – 管理模板 – 系統,然後右側找到「阻止訪問命令提示符」,選擇未配置即可

  • 註冊表中的位置:
  • DisableCMD鍵值的位置在

    HKEY_CURRENT_USERSoftwarePoliciesMicrosoftWindowsSystem

    DisableCMD為1表示禁用命令提示符和批處理文件,2表示只禁用命令提示符,改成0或者刪除就可以解禁了

    UPDATE: 如果修改後依然提示被禁用,可能是你中過病毒,修改了註冊表

    HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsSaferCodeIdentifiersPaths{403cf677-e149-45df-bf2d-b320958e5ada}

    裡面內容為

  • LastModified = AA 7A 59 05 D2 2C CC 01
  • Description = 「」
  • SaferFlags = 0×00000000
  • ItemData = 「cmd.exe」
  • 將這個項{403cf677-e149-45df-bf2d-b320958e5ada}整個刪除即可


    推薦閱讀:

    科研必備技能之『批處理』批量刪除文本文件前 n 行
    [轉載]windows批處理命令教程
    批處理語句學習
    MPP與批處理設計(翻譯)

    TAG:處理 | 批處理 | 分析 |