使用指令碼安裝佈建套件中的傳統型應用程式

本逐步解說說明如何在 Windows 用戶端布建套件中包含腳本,以安裝 Win32 應用程式。 您也可以執行安裝應用程式以外的文稿作業。 However, some care is needed to avoid unintended behavior during script execution (see Remarks below).

組合應用程式資產

  1. 在您要撰寫套件的裝置上,將所有資產放在已知的位置。 每個資產必須有獨特的檔名,因為所有檔案將複製到裝置上相同的暫存目錄。 許多應用程式通常會有名為 『install.exe』 或類似的安裝程式,因此可能會有名稱重疊。 若解決這個問題,您可以使用下個步驟中所述的技術,包含完整的目錄結構,再展開到裝置上的暫存目錄。 最常使用的是包括每個應用程式的子目錄。

  2. 如果您需要包含檔案的目錄結構,您必須封包資產,以便輕鬆包含在布建套件中。

打包資產應用程式

  1. 如下所示建立 .DDF 檔案,將 file1file2 取代為您要封裝的檔案,並新增檔案/目錄的名稱。

    ;*** MSDN Sample Source Code MakeCAB Directive file example
    ;
    .OPTION EXPLICIT  ; Generate errors on variable typos
    .set DiskDirectoryTemplate=CDROM  ; All cabinets go in a single directory
    .Set MaxDiskFileCount=1000; Limit file count per cabinet, so that
    ; scanning is not too slow
    .Set FolderSizeThreshold=200000   ; Aim for ~200K per folder
    .Set CompressionType=MSZIP
    ;** All files are compressed in cabinet files
    .Set Cabinet=on
    .Set Compress=on
    ;-------------------------------------------------------------------
    ;** CabinetNameTemplate = name of cab
    ;** DiskDirectory1 = output directory where cab will be created
    ;-------------------------------------------------------------------
    .Set CabinetNameTemplate=tt.cab
    .Set DiskDirectory1=.
    ;-------------------------------------------------------------------
    ; Replace <file> with actual files you want to package
    ;-------------------------------------------------------------------
    <file1>
    <file2>
    ;*** <the end>
    
  2. 使用 makecab 建立封包檔案。

    Makecab -f <path to DDF file>
    

建立指令碼以安裝應用程式

建立可執行安裝應用程式所需一切工作的指令碼。 以下提供的範例可協助開始製作 Orchestrator 指令碼,來執行所需的安裝程式。 事實上,Orchestrator 指令碼可能參照比這些範例中更多的資產。

您不需要建立協調器腳本。 您可以讓每個應用程式佔用一個命令列。 如有需要,您可以建立一個指令碼來記錄每個應用程式的輸出,如下所述 (而非為整個佈建套件建立一個 Orchestrator 指令碼)。

注意

指令碼執行的所有動作必須安靜自動,不顯示 UI 也不需要與使用者互動。

指令碼會在裝置上於系統內容中執行。

偵錯範例

細微記錄不是內建的,因此記錄必須內建在腳本本身。 以下是將 『Hello World』 記錄到記錄檔的範例腳本。 在裝置上執行時,記錄檔在佈建完成後即可使用。 如您在下列範例中所見,建議您記錄腳本執行的每個動作。

set LOGFILE=%SystemDrive%\HelloWorld.log
echo Hello, World >> %LOGFILE%

.exe 範例

此範例腳本示範如何在系統磁碟驅動器上建立記錄輸出檔案、從 .exe 安裝程式安裝應用程式,以及將結果回應至記錄檔。

set LOGFILE=%SystemDrive%\Fiddler_install.log
echo Installing Fiddler.exe >> %LOGFILE%
fiddler4setup.exe /S >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%

.msi 範例

這與先前的安裝程式相同,但是從 MSI 安裝程式安裝應用程式。 請注意,該 msiexec 是使用 /quiet flag 呼叫,以便符合指令碼在佈建套件中安靜無訊息執行的需求。

set LOGFILE=%SystemDrive%\IPOverUsb_install.log
echo Installing IpOverUsbInstaller.msi >> %LOGFILE%
msiexec /i IpOverUsbInstaller.msi /quiet >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%

PowerShell 範例

這是具有記錄的範例腳本,示範如何從布建命令設定執行PowerShell腳本。 此範例所參考的 PowerShell 腳本也必須包含在套件中,並遵守與布建套件內執行的所有腳本相同的需求:它必須以無訊息方式執行,而不需要用戶互動。

set LOGFILE=%SystemDrive%\my_powershell_script.log
echo Running my_powershell_script.ps1 in system context >> %LOGFILE%
echo Executing "PsExec.exe -accepteula -i -s cmd.exe /c powershell.exe my_powershell_script.ps1" >> %LOGFILE%
PsExec.exe -accepteula -i -s cmd.exe /c 'powershell.exe my_powershell_script.ps1' >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%

從 .CAB 解壓縮範例

此範例腳本顯示從布建命令腳本擴充 .cab,以及安裝展開的 setup.exe

set LOGFILE=%SystemDrive%\install_my_app.log
echo Expanding installer_assets.cab >> %LOGFILE%
expand -r installer_assets.cab -F:* . >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%
echo Installing MyApp >> %LOGFILE%
setup.exe >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%

呼叫套件中的多個指令碼

您的布建套件可以包含多個 CommandFiles

每個布建套件都允許您使用一個 CommandLine 。 上述批次檔案是 Orchestrator 指令碼,可管理安裝和呼叫佈建套件包含的任何其他指令碼。 協調器腳本是應該從封裝中指定的 CommandLine 叫用的專案。

以下是使用上述 PowerShell 範例描述此關聯性的表格:

ICD 設定 說明
ProvisioningCommands/DeviceContext/CommandLine cmd /c PowerShell_Example.bat 命令列需要叫用 Orchestrator 指令碼。
ProvisioningCommands/DeviceContext/CommandFiles PowerShell_Example.bat 命令列所參照的單一 Orchestrator 指令碼,處理呼叫到所需的安裝程式或執行任何其他動作,例如展開封包檔。 這個指令碼必須執行所需的記錄。
ProvisioningCommands/DeviceContext/CommandFiles my_powershell_script.ps1 Orchestrator 指令碼參照的其他資產。 在此範例中,只有一個,但這裡可能參考許多資產。 一個常見使用案例是 Orchestrator 呼叫一系列 install.exe 或 setup.exe 安裝程式安裝數個應用程式。 那些安裝程式的每一個在此都必須包含為資產。

新增指令碼到佈建套件

當您寫入批處理檔,且參考的資產已準備好包含時,您可以將它們新增至 Windows 組態 Designer 中的布建套件。

使用 Windows 設定設計工具,指定指令碼在佈建套件的 CommandLine 設定中的執行方式的完整詳細資料。 這包括旗標或任何其他通常會在命令列中輸入的參數。 例如,如果套件包含名稱 install.exe 的應用程式安裝程式與用來將稱為 InstallMyApp.bat 的安裝自動化的指令碼,ProvisioningCommands/DeviceContext/CommandLine 設定應設為︰

cmd /c InstallMyApp.bat

在 Windows 設定設計工具中如下所示:

[選取的自定義] 中的命令行。

您也需要新增該命令列的相關資產,包括 Orchestrator 指令碼和所參照的任何其他資產,如安裝程式或 .cab 檔。

在 Windows 設定設計工具中,這可透過在 ProvisioningCommands/DeviceContext/CommandFiles 設定下新增檔案達成。

[選取的自定義] 中的命令檔。

當您完成時, 請建置套件

備註

  1. 不會透過 ProvisioningCommands 支援使用者互動或主控台輸出。 所有工作必須在幕後進行。 如果您的文稿嘗試執行下列任何一項動作,則會導致未定義的行為,而且如果在安裝期間或「現成體驗」期間執行,則可能會讓裝置處於無法復原的狀態:

    1. 回應至主控台
    2. 在螢幕上顯示任何專案
    3. 提示使用者對話方塊或安裝精靈
  2. 在第一次開機套用時,佈建會在開機順序中提早以及使用者內容建立之前執行;要小心僅包含可在這時執行的安裝程式。 其他安裝程式可透過管理工具佈建。

  3. 如果裝置因為文稿錯誤而進入無法復原的狀態,您可以使用 Windows 用戶端中的復原選項來重設它。

  4. CommandFile 資產會部署到裝置上每一個套件專屬的暫存資料夾。

    1. 針對在現用體驗期間新增的套件,這通常位於 %WINDIR%\system32\config\systemprofile\appdata\local\Temp\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

      Commands\後面的 0 會參考安裝順序,並指出要安裝的第一個應用程式。 數字將隨著套件中的每個應用程式而遞增。

    2. 針對按兩下已部署裝置所新增的套件,這會位於執行布建套件之使用者的暫存資料夾中: %TMP%\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

  5. 命令列將會執行且部署 CommandFiles 所在的目錄會做為工作目錄。 這表示您不需要在命令列中或從任何指令碼指定資產的完整路徑。

  6. 執行階段佈建元件會依據新增 PPKG 時的階段,嘗試盡早從佈建套件執行指令碼。 例如,若套件是在全新體驗期間新增,它會在套用套件後立即執行,同時全新體驗仍會發生。 這是在向使用者顯示使用者帳戶設定選項之前。 旋轉的進度對話框隨即出現,畫面上會顯示「請稍候」。

    注意

    此時的佈建程序會有 30 分鐘的逾時時間。 所有指令碼和安裝需要在這時間內完成。

  7. 指令碼會在背景中執行,而剩餘的佈建會繼續執行。 對於使用按兩下以安裝在現有系統上新增的套件,沒有布建或腳本執行已完成的通知