以批次指令碼自訂企業桌面部署

以批次指令碼自訂企業桌面部署

發佈日期: 2006 年 3 月 15 日

由 Ralph Ramos

Ralph Ramos

學習使用批次檔案來自訂您的桌面部署。TechNet 強力推薦您也造訪指令碼中心,學習使用 Microsoft Visual Basic Scripting Edition (VBScript)、Windows Script Host (WSH) 和其他各種指令碼技術,來建立自訂解決方案。

使用批次指令碼進行自訂作業

Microsoft Solution Accelerator for Business Desktop Deployment (BDD) 不但靈活,自訂性也相當強。Solution Accelerator for BDD 含有多種工具協助您入門,但是針對您的需求而自訂 Solution Accelerator 的功能,才是它最大的長處。我很喜歡使用批次指令碼,我將在本文提供幾個範例,告訴您使用這些指令碼來自訂 Solution Accelerator for BDD 有多麼簡單。

批次 (或 Shell) 指令碼是一份命令清單,儲存在副檔名為 .bat 或 .cmd 的純文字檔中。比方說,您可以將公司專屬的設定步驟儲存在一個批次指令碼中,然後再執行這個指令碼,這樣就不必以互動方式一一輸入所有的命令。許多系統管理員忽視了批次指令碼,以為它們的整體功能只限於與其他指令碼語言相關的功能。這一點我不同意:就像每一種工具都有自己專屬的用法一樣,指令碼語言也是。

由於批次指令碼相當單純,因此您可以輕鬆地用它來自訂 Solution Accelerator for BDD,並且將安裝過程自動化 (事實上,Solution Accelerator for BDD 有很大一部分都是批次指令碼)。這些指令碼不見得很複雜。Solution Accelerator for BDD 最適合使用這些指令碼來執行單一作業,以方便您選擇個別作業。

若要充分發揮批次指令碼,請建立指令碼,將重複且經常執行的作業自動化。例如,使用者設定以及遠端存取的設定 (遠端桌面和遠端協助)。這些案例的一般目的,是要經由一致且可以重複的方法提供自動化功能,將人為錯誤減至最低。

批次指令碼的基本功能

大部分的資訊技術 (IT) 專業人員,多半都很熟悉批次指令碼的基本原則。您只要建立一個文字檔,將副檔名取為 .bat 或 .cmd,然後在其中輸入命令清單即可。

其實批次指令碼的功能不只如此。首先,批次指令碼中有各種命令列工具可以使用。如果您在說明及支援中心搜尋「批次檔」或「命令列」,還會找到可用命令的其他相關資訊。如需特定命令的相關資訊,請輸入該命令,後面再加上 /?。您可以在命令列參照中 (英文),找到一份命令清單及其說明和語法。Microsoft Windows Desktop Deployment Resource Kit (英文) 中也有批次指令碼的討論以及一個命令附錄。

第二,批次指令碼支援控制執行作業的命令。這些命令包含條件式命令和迴圈命令,讓批次指令碼的功能更加強大。在本文中,我將著重說明一些可以在指令碼產生立即結果的命令 (不過,我不會討論每一個命令的語法)。[表 1] 說明了比較有趣的批次指令碼命令。若要學習每一個命令的語法,請在命令提示輸入命令名稱,後面加上 /?。

[表 1] 命令批次指令碼命令

命令

用途

範例

call

呼叫另一個指令碼,再回到下一個陳述式。

  • 呼叫另一個檔案中的批次指令碼。

  • 呼叫目前檔案中的一個副程式。

for

重複一個命令,列出檔案或字串清單。

  • 重複一個命令,列出儲存在文字檔中的檔案清單。

  • 重複一個命令,列出另一個命令所輸出的檔案清單。

  • 重複一個命令,列出以逗號分隔的字串清單。

goto

前往批次指令碼的另一個部分。

  • 無條件的分支到批次指令碼的另一個部分。

if

有條件的執行命令。

  • 測試檔案是否存在。

  • 測試環境變數是否含有特定的值。

  • 測試命令列選項是否存在,或者是否含有特定的值。

  • 測試之前執行的命令,找出錯誤。

setlocal

設定擴充命令和延遲擴充。

  • 啟用或停用擴充命令。

  • 啟用或停用延遲環境變數擴充。

start

啟動外部程式,控制其執行。

  • 以高優先順序執行程式。

  • 在最小化視窗中執行程式。

wmic

查詢 Windows Management Instrumentation (WMI) 資料。

  • 在環境載入 WMI 資料;然後在批次指令碼中使用那些資料。

注意:  大多數執行衍生性作業的批次指令碼,都必須具備管理員權限以防止錯誤發生。在大部分的情況下,您在登錄或檔案系統中設定的項目,都必須具備這些較高權限,尤其在鎖定環境中。

以批次指令碼建立自訂動作

Solution Accelerator for BDD 中的自訂動作,只是您在建置磁碟影像時所完成的作業。而我就是利用批次指令碼來完成這些作業。下面各例所示範的,是可以當作自訂動作使用的批次指令碼。

範例 1:自訂命令提示視窗屬性

[列表 1] 中的指令碼,是使用 reg 命令來自訂 [命令提示] 視窗屬性。這個簡單的範例,將告訴您如何從批次指令碼編輯設定。

[列表 1] Reg.exe

@echo OFFREM Configuring command promptreg add HKCU\Console /v "QuickEdit" /t REG_DWORD /d 1 /f

reg 命令是使用批次指令碼來編輯登錄的最佳方法。您可以使用 reg 命令,以登錄編輯器執行任何作業。舉個例來說,您可以讀寫值、刪除值以及載入和卸載群組檔案。如果您想進一步瞭解 Microsoft Windows XP 作業系統所附隨的這個命令,請在命令提示輸入 reg /?

範例 2:自訂登錄搜尋/儲存值供日後使用

[列表 2] 是另一個使用 reg 命令的範例。它會查詢登錄,並且使用傳回的值,有條件的執行其他作業。在這個範例中,指令碼會識別它是否在 Tablet PC 上執行,然後加以分支。

[列表 2] 執行條件式作業的 Reg.exe

@echo offrem Test for a Tablet PC registry key reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Tablet PC\Ident" >NUL && set TABLETPC=YES if %TABLETPC%==YES goto TABLET goto OTHER :TABLET rem Do Tablet PC configuration goto :EOF :OTHER rem Do other configuration goto :EOF

第 3 行的命令可以分成兩部分:

  • reg 命令,該命令執行

    query

作業。這個指令碼會搜尋 Ident 登錄子機碼。如果子機碼不存在,reg 命令便會傳回錯誤。

  • 條件的測試。這些

    &&

符號表示已經順利完成前一個命令。如果 reg 命令找到登錄子機碼 (因而沒有導致錯誤發生),便會執行 set 命令。如果 reg 命令找不到這個子機碼 (因而導致錯誤發生),就不會執行 set 命令。

您現在已經定義一個可稍後用在指令碼中的變數。下一個命令會決定

TABLETPC

的值是否等於 YES。

範例 3:自訂複製檔案到本機系統

[列表 3] 的範例比較複雜。它將 WMI 資料載入到環境中,以便讓您將之用在批次指令碼中。首先,指令碼將 wmic 命令與 for 命令搭配使用,以載入環境變數。wmic 命令會針對每一個值,以 name=value 格式分別輸出一行。指令碼再使用 for 命令,針對輸出的每一行重複 set 命令,將輸出附加在 set 命令後面,充分利用這個格式。這麼一來,所有的 Win32_OperatingSystem 值都在

OS.Name

變數中,而所有的 Win32_SystemEnclosure 值都在 FakePre-1e7c8690be524540998817ca62c03ce2-49d889fd4ce64610be8aef00fa316431 變數中。能夠從批次指令碼使用 WMI 值,是相當強大的功能。

[列表 3] 讀取和使用 WMI 值

@echo offrem Test for a Tablet PC registry key rem Dump WMI values in the environment. for /f "delims=/" %%i in ('wmic PATH Win32_OperatingSystem GET /VALUE') do set OS.%%i >NUL for /f "delims=/" %%i in ('wmic PATH Win32_SystemEnclosure GET /VALUE') do set ENC.%%i >NUL goto %ENC.ChassisTypes% echo "This is an unknown chassis." goto :EOF :{3} :{4} :{5} :{6} :{7} :{15} echo "This is a desktop chassis." goto :EOF :{8} :{10} :{12} :{14} :{18} :{21} echo "This is a laptop chassis." goto :EOF :{23} echo "This is a server chassis." goto :EOF

將自訂動作加到自動安裝資料夾中

如《電腦影像系統功能小組指南 (英文)》中所討論的,您可以使用自訂動作來自訂影像。您可以在電腦影像系統的 Master $OEM$\$1 或 $$ 資料夾任何地方加入自訂動作,不過它們通常都儲存在 Master $OEM$\$OEM$\$1\Local 資料夾中。

為了方便疑難排解批次指令碼,不妨考慮將資訊記錄在 %SYSTEMROOT%\Setuplog1.log 的 Solution Accelerator for BDD 記錄檔中。您可以在這個記錄檔加入任何有用的資訊,包括錯誤碼和追蹤資訊在內。若要將命令結果輸出到記錄檔,只要在在命令結尾附加 >>%SYSTEMROOT%\Setuplog1.log 就行了。此舉會將命令輸出重新導向記錄檔,而不是顯示在畫面上。比方說,若要將文字傳送到記錄檔,請將下面這一行

echo “This is log file text” >>%SYSTEMROOT%\Setuplog1.log

加到批次指令碼中。

當建立一個您希望作為自訂動作使用的批次指令碼之後,必須利用電腦影像系統的 [執行] 頁,將它加到建置中。若要存取電腦影像系統的 [執行] 頁,請按一下 [執行] 索引標籤。[圖 1] 所示的 [執行] 頁含有三個區域。

Bb490247.29042_figure1(zh-tw,TechNet.10).jpg

[圖 1] [執行] 頁面

最上面是所有目前定義的動作清單。每一個動作都附有指示符號,指示它啟用與否,以及完成動作之後,系統是否要重新啟動。接下來是一列按鈕,您可以使用這些按鈕來建立或刪除動作,或者將所選的動作在清單中上下移動。動作清單將循序處理。最下面的區域,則是提供目前所選動作的詳細資料:動作名稱命令列工作目錄重新開機以及已啟用

若要針對批次指令碼建立自訂動作,請執行下列步驟:

  1. 按一下 [新動作]。

  2. 在 [動作名稱] 方塊中,輸入自訂動作的名稱。

  3. 在 [命令列] 方塊中,輸入命令來執行您的批次指令碼。

  4. 必要時,請在 [工作目錄] 方塊中修改路徑 ,或是接受預設路徑 C:\Local (C:\Local 是目標電腦上 Master $OEM$\$1\Local 資料夾的最終位置)。

  5. 必要時,請勾選 [重新開機] 核取方塊。

  6. 勾選 [啟用] 核取方塊,針對目前的部署安裝工作階段,啟用所選的動作。

  7. 將指令碼複製到建置系統的 Master $OEM$\$1\Local 中。

實驗批次指令碼

我非常鼓勵您對批次指令碼進行實驗,其實批次指令碼可以減輕系統管理員的負擔,只是沒有被充分利用罷了。一個正常運作、經過適當測試的指令碼,可以幫助您減少錯誤、提高效率,並且節省寶貴的時間,用在其他工作上。

Microsoft 網站、說明及支援中心以及命令列說明都有許多資源可以使用,這些資源都會提供資訊,幫助您進一步瞭解批次指令碼。除了屬於 Windows XP 作業系統的命令之外,您還可以在 Windows XP 安裝 CD 的 Support Tools 資料夾中,找到其他命令列工具。

更多信息

討論桌面部署 (英文)
請提出此處的桌面部署問題。與同儕討論部署祕訣和最佳作法,並且針對桌面部署中心的文章提出意見。

關於作者 (英文)
Ralph Ramos 是微軟認證系統工程師 (MCSE),他是美國俄亥俄州辛辛那提市一家軟體開發公司的全職系統工程師。他專精 Microsoft Windows 產品系列,目前正在從事各種指令碼技術的實驗。他是 Microsoft Windows Registry Guide (Microsoft Press, 2005) (英文) 和 Microsoft Windows Desktop Deployment Resource Kit (Microsoft Press, 2004) (英文) 的論文評審委員。您可以透過 rdramos@cinci.rr.com 與 Ralph 聯絡。