2016-01-01 54 views
1

我想在Windows中從睡眠狀態恢復後運行批處理文件。從外部文件讀取變量不能按計劃任務運行

如果我在命令行上啓動批處理文件,一切都按預期工作。

但批處理腳本不能按計劃任務正常運行。

我做了什麼:

外部配置文件AutoMountConf.bat包含set Pass = Test

本地腳本文件scheduleTask.bat包含

rem AutoMountConf.bat is in my intranet. 
call X:\AutoMountConf.bat 
start "" "C:\Program Files\TrueCrypt\TrueCrypt.exe" /auto favorites /p %Pass% /q 

在命令行TrueCrypt的容器安裝。 如果我從計劃任務運行腳本,我會獲得登錄屏幕以手動輸入密碼。

回答

2

有兩個甚至三個問題。

第一個是set Pass = Test而不是set "Pass=Test",因爲已經報告了。有關如何將值權分配給環境變量的更多詳細信息,請參閱Why is no string output with 'echo %var%' after using 'set var = text' on command line?


我回答第二個問題是由網絡驅動器,一旦用戶到驅動器盤符映射,並在註冊表想起造成的事實由Windows在用戶註銷時會自動斷開連接,並且只有在同一用戶再次登錄時纔會重新連接。

對於計劃任務是非常因此經常需要使用的文件和文件夾的UNC路徑上的共享文件夾的網絡或連接網絡驅動器,並在自己的計劃任務執行的批處理文件斷開。

無法使用UNC路徑調用批處理文件。 Windows不允許這樣做。因此,需要在批處理文件中手動連接和斷開網絡共享。我爲這個問題提供了2個解決方案。

第一種是使用命令網使用:只有在計劃任務無法與具有的權限來訪問該批處理文件的用戶帳戶執行

%SystemRoot%\System32\net.exe use X: \\ComputerName\ShareName password /user:Domain\UserName /persistent:no 
if not errorlevel 1 (
    call X:\AutoMountConf.bat 
    %SystemRoot%\System32\net.exe use X: /delete 
    start "" /wait "C:\Program Files\TrueCrypt\TrueCrypt.exe" /auto favorites /p %Pass% /q 
) 

password/user:Domain\UserName是必要的遠程機器。一般來說,使用正確的用戶帳戶定義計劃任務並確保此帳戶的密碼與任務一起更安全得多。 Windows存儲任務加密的密碼,就像它也爲用戶帳戶本身一樣。

在命令提示符窗口net use /?中運行以獲取有關必需選項和可選選項的詳細信息。 /persistent:no是避免記住Windows註冊表中的網絡共享以便在同一用戶登錄後自動重新連接。

第二個是使用命令PUSHDPOPD

pushd \\ComputerName\ShareName 
if not errorlevel 1 (
    call AutoMountConf.bat 
    popd 
    start "" /wait "C:\Program Files\TrueCrypt\TrueCrypt.exe" /auto favorites /p %Pass% /q 
) 

請執行在命令提示符窗口pushd /?和讀取輸出有助於理解爲什麼這個工程。

但是,此解決方案要求使用具有正確密碼的計劃任務的用戶帳戶對遠程計算機上的共享具有適當的權限。批處理文件本身不能使用此解決方案指定密碼和用戶名。

if not errorlevel 1表示前一個命令退出NOT的值是否大於或等於1意味着上一個命令的退出代碼是否爲0,因此命令執行成功。它始終可能發生,遠程機器當前在網絡上不可用,因此在連接到遠程機器上共享時檢查成功總是很好的。


還有就是爲什麼Pass沒有運行AutoMountConf.bat後定義也許一個理由。

AutoMountConf.bat包含SETLOCAL並執行該命令後,變量Pass定義和ENDLOCAL之前在同一批處理文件被執行或由命令處理器隱含調用在離開AutoMountConf.bat

SETLOCAL結果在創造總是複製現有的環境變量和環境變量的所有修改都在這個本地副本完成。在執行(匹配)endlocal時或者在達到批處理文件結束時會恢復以前的環境變量,在這種情況下,命令處理器會自動恢復以前的環境。

請在命令提示符窗口setlocal /?中執行並閱讀輸出幫助。

爲例子來理解的命令上Echoing a URL in BatchSETLOCALENDLOCAL甚至更​​好看答案和Why is my cd %myVar% being ignored?

+0

感謝您的詳細解釋! 解決的辦法是將批處理文件中的共享手冊映射爲網絡使用。 完美! – HansDampfHH

0
set Pass = Test 

將變量pass<space>與內容<space>Test。所以%pass%保持空。

使用此語法:

set "Pass=Test" 

,以避免任何意外的空間。

+0

這並不是解決問題的環境管理。與Windows日程安排任務相同的問題。只有命令行執行工作。 – HansDampfHH

+0

你確定,'%pass%'是在定時任務中定義的嗎? – Stephan