最近遇見一個奇怪的現象,在做某系統的定期備份的時候使用到了非系統自帶Rsync命令,但是手動啟動沒問題,而且又非常期望批次化在多臺主機上進行,怎麼辦呢?Windows Server 2003下面這樣執行任務計劃沒問題,而就Windows Server 2008 R2下面出現意外。
正常情況下我們的任務計劃會有反饋數值,透過它可以判斷這個任務計劃上次是否執行正常(詳細連線:http://support.microsoft.com/kb/267031/)。
· 程式碼 0 或 0x0:操作成功完成。
· 程式碼 1 或 0x1:呼叫的函式不正確或呼叫了未知函式。
· 程式碼 10 或 0xa:環境不正確。
· 程式碼 0x8009000f:常規訪問被拒絕
Figure 1看到上次執行結果出現非0情況
這種非〇情況表示的是不能被接受的。
透過對這個批處理設定斷點,我看到了這樣的報錯資訊。
Figure 2在批處理中加入Pause 進行斷點,檢視錯誤資訊
很明顯,這個rsync不是系統自帶的程式和檔案,因此無法被系統直接呼叫,猜測和環境變數有關,仔細尋找Windows Server 2008 R2 下面的任務計劃選項,我看到了這個填空的地方。
Figure 3起始於(可選)項
我將這個填寫成了該條指令碼的所在的目錄,再次執行該任務計劃,得到返回成功的標記,並且在服務本分伺服器端受到相應的備份內容。
這裡回顧一下,兩個版本作業系統的任務計劃的不一樣,Windows Server 2003 下面可以選擇的內容,專案並不多,不過他預設的情況下會將起始於填寫進去,使用的就是所在指令碼的上一級目錄。
Figure 4 Windows Server 2003 下面的起始於,預設被填寫
因此設定Windows Server 2008 ,2012這樣的基於Nt6核心的系統的任務計劃的時候建議將起始於進行一下設定。
以下是其它網友提供的方法
第二種解決方法:
1、建立任務計劃時,要在常規選項卡里選中“不管使用者是否登入都要執行”、“使用最高許可權執行”、配置選帶有“Windows Server 2008 R2”這三個選項,
2、在操作選項卡里的“起始於(可選)”要填上bat批處理檔案所在目錄,windows 2003是在選擇bat批處理檔案自動帶上的,而2008不會,雖然它提示是可選的,但是不填的話,執行會失敗;
3、所有資訊都填寫完整後點確定時需要輸入執行此任務的使用者帳戶密碼;
第三種解決方法:
下面我貼一個完整的計劃任務圖示:
建立計劃任務
定製計劃任務執行時間
計劃任務操作一(此情況符合單個可執行程式或者指令碼不呼叫資料庫情況下)
計劃任務操作二(此情況符合執行程式需要呼叫目錄資料庫情況、PS:這個通吃吧貌似j
後面預設即可
其問題就在於編輯操作的選項裡面的起始於(可選)選項。
真正問題找出來覺得很諷刺呢
貼這個帖子是想給大家一個出現問題有據可查的建議。哈哈,自己也能做個標記以防忘記。
第四種解決方法:
今天在Windows Server 2008 裡新建了一個定時任務,透過定時任務執行的bat檔案中的sql命令結果檢視定時任務的歷史記錄,發現卡住了提示已經啟動定時任務,但是bat中的操作一直沒有執行剛開始懷疑bat檔案中有錯誤,換成了最簡單的開啟記事本的命令notepad,發現問題依然存在,後來發現有一個很有意思的地方,新建定時任務的時候,有2個選項:建立基本任務和建立任務之前是建立的基本任務,後來換成建立任務然後,問題就解決了
第五種解決方法:
新建一個管理員帳號,然後用新帳號執行就可以了。
第六種方法:其實就是第二種方法的補充
解決辦法:
如圖:編輯任務 把批處理檔案的起始位置加上如:在d:\aa.bat
那麼起始位置就是:d:\ 注:路徑中不能有引號
下面引用網上的東東:
批處理檔案肯定是沒有問題,加入到計劃任務中,發現沒能正常備份,也沒有複製到網路對映盤。
將bat檔案輸出到檔案,本想看看log的,結果居然沒有正常執行。
google了一下,發現很多網友都有類似的問題,但沒人給出答案。
很幸運的找到一篇微軟官方論壇上的網友討論的帖子,幾乎全部解決我的問題。
http://social.technet.microsoft.com/Forums/en-US/winservermanager/thread/d47d116e-10b9-44f0-9a30-7406c86c2fbe/ 很精彩的技術交流。
對我來說碰到了2個問題,
1, a.bat 是處理備份資料庫,b.bat 內容為 a.bat > D:/abc/1.log , 將b.bat 加入的計劃任務中,目的是想除錯計劃任務是否成功。(手動單獨執行,每次都成功的)結果,是1.log不輸出,計劃任務中返回2; www.jb51.net
2,a.bat 中有把備份好的資料複製到網路對映盤,比如Z盤,計劃任務每次都不執行,手動執行該指令碼也是好的。
按照上面論壇給的提示:
2) Make sure that the task is set to "start in" the folder that contains the batch file: open the task properties, click on the "actions" tab, click on the action and then the "edit" button at the bottom. In the "Edit Action" Window there is a field for "start in (optional)" that you set to the path to the batch file.
在“操作”->"編輯操作"->“起始於(可選)" 中一定要填入該批處理的路徑。 這一招解決了第一個問題。
NET USE W: /DELETE
NET USE W: //myserver/myfolder /PERSISTENT:YES
這個是解決第二個問題的關鍵,在執行複製,或者建立新資料夾之前,先要進行如上兩行命令。 細節:確保在我的電腦介面透過選單操作的網路對映盤式斷開的;Windows server 2008 使用者管理頁面有個網路密碼管理,如果填寫了,net use w: ... 這行命令就不需要輸入密碼和使用者名稱。
這一招解決第二個問題。
補充一點:批處理檔案中和 ”起始於(可選)“中的路徑都不要使用 雙引號""
第七種方法:
使用windows server 2008 R2 的任務計劃程式需要啟動服務 Task Scheduler 服務,windows server 2008 R2 預設狀態下Task Scheduler 服務是禁止的並且不可切換啟動型別,
解決方法:修改登錄檔HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Schedule 下的start項數值為2
修改後重啟伺服器,任務計劃程式就可新增使用。
第八種方法:
網路環境:windows2003+windows2008.
描述:在win2003內使用對映驅動器Z:對映win2008的一個目錄,
在win2003中建立bat 檔案copy Z:中的檔案,並做任務計劃bat定時執行.
命令列直接執行bat沒有問題,執行任務計劃失敗.
最終的解決方法是參考下面的文章,在bat檔案中新增:
NET USE Z: \\XXX.XXX.XXX.XXX\D$\XXXX "Password" /User:"Administrator"
----
另:win7下對映驅動器Z:,新增任務計劃執行bat檔案 Copy Z:\...沒問題,
不存在需要手工新增命令net use的bug.
重啟Win7後,任務計劃消失,但其他程式建立的任務計劃存在,
最後透過排除法檢查發現是由於360軟體作怪!需要把bat 檔案和job檔案同時都加入白名單.
任務計劃無法正常執行批處理檔案的幾種解決方法
Windows 任務計劃與 BAT 批處理檔案都是我們經常使用的工具,一個可以幫助我們定期執行計劃的任務、一個可以幫助我們一次執行一系列預先編好的命令。在 Windows 系統的維護工作中,我們經常需要將任務
計劃與批處理配合起來使用,即透過設定任務計劃定期執行批處理檔案定義的一系列命令與操作。
有時候,我們可能會遇到任務計劃與批處理無法正常協同工作的情況。例如,一個同樣的批處理檔案,我們可能手動執行它時一切正常(說明批處理檔案的內容沒有錯誤),但將這個批處理檔案新增為任務計劃後卻無法按照預期執行。筆者在微軟中文論壇收集了幾種解決任務計劃與批處理無法協同工作的方法,希望可以幫助大家在遇到類似問題時參考。
1. 在任務計劃中正確設定執行批處理的使用者身份與許可權。
當我們在任務計劃中新增新任務時,其中有一個步驟是指定執行此任務的使用者帳戶,並需要輸入使用者帳戶的密碼進行確認。如果任務計劃設定的使用者帳戶身份或許可權,與我們手動執行批處理檔案時的使用者帳戶不同,
就可能會出現以任務計劃方式執行批處理的結果與手動執行同樣的批處理時結果不同的現象。
例如,假設一個批處理涉及的命令需要管理員許可權或者特定使用者帳戶的配置檔案才可以正常執行,如果執行此批處理的任務計劃被指定為一個非管理員帳戶或不具備相應使用者配置的使用者帳戶,那麼此批處理很可能在以任務計劃的方式執行時無法得到其預期的效果。因此,當我們在新增任務計劃並希望以另一個使用者帳戶的身份與許可權執行批處理時,一定要在新增新任務嚮導中檢查執行批處理的使用者帳戶身份與許可權是否滿足執行
此批處理的要求。
2. 透過快捷方式為批處理指定起始位置。
有些批處理檔案需要我們為其設定好特定的“起始位置”才可以正常執行,否則可能會遇到批處理無法找到指定路徑的錯誤。當我們手動執行批處理時,無論是在資源管理器中用滑鼠雙擊執行批處理,還是首先開啟命令提示符視窗、然後再在命令提示符中執行批處理,資源管理器當前開啟的資料夾位置與命令提示符當前所在的提示符位置都已經自動為我們設定好了執行批處理時的起始位置。
然而,當我們以任務計劃方式執行批處理時,任務計劃卻無法自動指定執行批處理時所需的起始位置,這樣也可能會造成以任務計劃方式執行批處理時無法得到預期的效果。
為了解決這一問題,我們可以首先為批處理檔案建立一個快捷方式,然後修改快捷方式的屬性,在“常規”選項卡中設定正確的“起始位置”,接下來我們再新增任務計劃,將新任務指定為這個快捷方式檔案而不是批處理本身。這樣,任務計劃會在任務指定的時間自動執行指向批處理的快捷方式,對應的批處理在執行時
就具有正確的起始位置了。
3. 儘量避免在批處理內容中出現過多的引號。
如果在批處理檔案的內容裡出現了過多的引號,即批處理中有一條或多條命令及引數被引號擴起來,這不僅可能在編寫批處理命令時容易出錯,而且可能會造成特定版本 Windows 的任務計劃無法正確識別批處理中包含的命令。特別是在一個父級引號中還有子級的引號時,尤其容易出現此類問題。
根據微軟知識庫 KB951246 提供的資訊,這個問題主要存在於 Windows Vista/Server 2008 系統。
4. 將批處理檔案轉換為可執行檔案或指令碼後再新增任務計劃。
有時當任務計劃無法正確執行批處理檔案的部分內容時,我們還可以嘗試將批處理轉換為其它格式的可執行檔案或指令碼,然後再新增至任務計劃。轉換格式雖然執行的命令與任務不變,但將批處理轉換為可執行檔案或指令碼可以改變任務執行的順序與方式,有時說不定可以解決問題。
批處理常見的格式轉換包括將 .BAT 檔案轉換為 .EXE 或 .COM 可執行檔案,或者轉換為 .VBS 指令碼,這類轉換可以透過 BAT2EXE、BAT2COM、BAT to EXE Converter、批處理加密轉換器等第三方軟體實現。
5. 在批處理中新增為正常執行後續命令所需的先決命令。
如果我們遇到了一些比較極端的批處理與任務計劃無法協同工作的問題,無論怎樣在任務計劃的執行環境中設定都不能解決,那麼可以考慮將一些正確完成批處理命令所需的先決命令新增在原批處理內容的最前面,在批處理自身的層面加以解決。
例如,筆者最近在微軟中文論壇見到一則問題:有位使用者編寫了一個備份開發程式碼的批處理,並將其新增為任務計劃,希望在每天凌晨時自動執行。但是,這個批處理涉及的檔案備份與複製操作需要訪問 $IPC 網路對映地址。
經測試,使用者編寫的批處理內容沒有問題,如果手動執行批處理,可以正確地訪問目標地址並且完成備份;但如果將此批處理新增為任務計劃就無法正確執行備份與複製操作。設定任務計劃的使用者許可權、設定起始位置、對批處理進行格式轉換等方法均無法解決。最終解決這個問題的方法是在批處理內容的前面新增了一條:
NETUSE Z:\\XXX.XXX.XXX.XXX\D$ "Password" /User:"Administrator"
將批處理正常訪問對映地址的先決命令寫在原批處理檔案內容的前面,最終這個批處理檔案就可以透過任務
計劃方式正常執行了。