批處理一閃即逝的幾種情況分析
此問題在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_MACHINESOFTWAREPoliciesMicrosoftWindowsSaferCodeIdentifiers Paths{403cf677-e149-45df-bf2d-b320958e5ada}
裡面內容為
將這個項{403cf677-e149-45df-bf2d-b320958e5ada}整個刪除即可
推薦閱讀:
※科研必備技能之『批處理』批量刪除文本文件前 n 行
※[轉載]windows批處理命令教程
※批處理語句學習
※MPP與批處理設計(翻譯)