共用方式為


搭配其他驅動程式導入方法使用時,$WinPeDriver$ 的限制

本文提供將驅動程式納入 WinPE 的指引,以及要安裝的作業系統,讓驅動程式可在安裝的 WinPE 部分取得,最後也會出現在完成的作業系統安裝中。

適用於: Windows 7 Service Pack 1、Windows Server 2012 R2、Windows Server 2008 R2 Service Pack 1
原始 KB 編號: 2686316

摘要

將驅動程式新增至安裝媒體時,請勿混合版本。 在整個媒體中使用每個驅動程式的相同版本。

有數種不同的方法可將現成的驅動程式納入 Winpe (boot.wim) 和目標安裝作業系統 (install.wim)。 如果驅動程式版本不相符,則不論 PNP 排名規則為何,都會使用載入記憶體中的第一個驅動程式。 其他版本可能會標示為「不良」驅動程式,以防止 PNP 稍後選取這些驅動程式。 這包括在開機至 WinPE (Winpe 階段) 安裝期間載入記憶體的任何驅動程式。 範例可能包括透過 DISM.exe 將驅動程式插入 boot.wim,或使用 Drvload.exe 載入驅動程式以手動載入驅動程式。

目的

請考慮下列案例:您要建立自定義 Windows 預安裝環境 (WinPE) 映射,以安裝需要現成儲存控制器驅動程式的 Windows 操作系統,再執行 Setup.exe 以操作磁碟。 此外,您想要提供「最新」驅動程式,以透過安裝程式的 \$WinPEDriver$ 資料夾功能包含,以包含相同驅動程式的更新版本。

$WinPEDriver$ 功能是用來在安裝時間提供驅動程式的方法。 不過,這是Setup.exe的功能,因此在Setup.exe啟動之前,不會叫用這類功能。 使用 DISM 手動插入 WinPE boot.wim 驅動程式存放區的驅動程式會在開機時載入記憶體。 這兩種機制是分開的,而且有一些注意事項一起使用它們。

WinPE 沒有內建機制可卸載已載入記憶體的驅動程式,因此一旦setup.exe啟動時,任何已載入裝置的驅動程式都不會重載,因為已載入裝置的驅動程式已經載入。 此錯誤會導致安裝程式將 $WinPEDriver$ 資料夾中的驅動程式標示為錯誤的驅動程式,即使它比插入 WinPE 的驅動程式版本還新,也不會超過它。 安裝程式沒有明確瞭解已載入 boot.wim 的驅動程式。

此行為是設計方式;不過本文會識別容納此案例的方法,因此這些驅動程式仍可包含在可部署的操作系統中。

其他相關資訊

在上述案例中,將 WinPE 放在可開機的 USB 快閃裝置 (UFD) 硬碟或拇指棒上是最偏好的。

在本檔中,我們將反白顯示插入驅動程式和啟動視窗的方法。 下圖簡短顯示包含驅動程式的方法和結果。

WinPE (內建原生或插入) ($WinPEDriver$的現裝司機) 結果 (OS 後)
如果 WinPE 包含透過 Dism.exe 插入的驅動程式版本 X1 包含具有相同驅動程式名稱的 X2 驅動程式版本 X1 會在 OS 安裝後進行,且將會忽略 X2
如果 WinPE 使用 Drvload.exe 從 $WinPEDriver$ 安裝驅動程式 X2 包含具有相同驅動程式名稱的 X2 驅動程式版本 X2 將在 OS 安裝後進行
如果 WinPE 包含的驅動程式 X1 不是開機關鍵(內建原生) 不包含驅動程式 將會使用內建原生驅動程式 X1。 操作系統安裝后,該裝置將無法使用現成可用的驅動程式

驅動程式限制

請記住,有一些驅動程式可以包含和/或載入,在安裝 WinPE 部分期間可能無法運作。 這包括,但不限於;視訊驅動程式、無線適配卡驅動程式和音訊驅動程式。 本檔所述的行為不是 BootCritical 驅動程式專屬的(開機期間需要驅動程式,例如控制器驅動程式才能存取硬碟),而且會在安裝/部署期間載入的所有驅動程式生效。

逐步解說從 StartNet.cmd 載入驅動程式

這隻是將相同驅動程式納入 Windows 預安裝環境 (WinPE) 的其中一種方法,並讓它可供安裝作業系統使用;其他方法可以使用本文件中進一步的資訊。

  1. 設定技術人員的電腦:

    1. 將 OPK/AIK 安裝到支援的技術人員電腦。
    2. 將 Windows 位複製到本機 HDD c:\bin。
    3. 找出/下載/擷取要包含在媒體的驅動程式。
  2. 準備每個網頁的USB裝置,請務必將裝置命名為「INSTALL_WIN7」。 此名稱稍後會使用,如果您變更此名稱,則必須變更步驟 #6 中所述的範例腳本名稱,以及下列範例(網頁連結列在檔尾處)

  3. 建立 WinPE 檔案以複製到 USB 裝置,開啟系統管理命令提示字元並執行:

    1. Copype.cmd <arch> <path>
    2. Copy <pathto> winpe.wim to \ISO\sources\boot.wim
  4. 掛接 boot.wim:

    1. Dism /get-wiminfo /wimfile:\<pathto>\boot.wim
    2. Dism /mount-wim /wimfile:<pathto>\boot.wim /index:1 /mountdir:<pathto>\Mount
  5. 開啟系統管理命令提示字元,然後編輯 \mount\windows\system32\startnet.cmd (使用 Notepad.exe 或類似版本)。

  6. 下列範例腳本會識別USB裝置,並使用 Drvload.exe 在WinPE期間提供驅動程式。 將腳本剪下並貼到您已開啟的startnet.cmd檔案中。

    注意

    您可能想要先將腳本複製到notepad.exe或其他一些文本編輯器,以移除格式設定。

    wpeinit
    :ChkVar
    :: Locating USB Device
    IF NOT DEFINED usbdrv (  
    ECHO list vol | diskpart | find "INSTALL_WIN7" > pt.txt  
    FOR /F "tokens=3" %%a IN (pt.txt) DO (  
    SET usbdrv=%%a^:  
    )  
    del pt.txt /f /q  
    IF EXIST %usbdrv%\InstallOS.bat call InstallOS.bat  
    
  7. 儲存StartNet.cmd並關閉它。

  8. 使用下列命令卸除並認可 boot.wim 的變更:

    Dism /unmount-wim /mountdir:<pathto>mount /commit
    
  9. 將 \ISO 資料夾中的所有檔案複製到USB快閃裝置(應格式化 FAT32 並標示為作用中)。

  10. 在名為 $WinpeDriver$ 的 USB Flash 裝置根目錄上建立資料夾。

  11. 將驅動程式複製到此資料夾(例如 <USB_drv>\$WinpeDriver$\DriverX)。

  12. 開啟 [系統管理 Cmd] 提示字元,並建立檔案 <USB_drv>\InstallOS.bat,將下列這一行剪下並貼到批處理檔中:
    drvload %usbdrv%\$winpedriver$\<device>\filename。INF

  13. 若要從 DVD 包含 Windows OS 安裝來源檔案:

    1. 在 USB 遊戲桿上建立下列資料夾: <USB_drv>\<OS>\Sources(例如 e:\Win2008r2x64\Sources)。
    2. 選取並複製 DVD\sources\* 以 <USB_drv>\<OS>\sources(您可能會排除 boot.wim)
    3. 若要在開機至 WinPE 時手動啟動setup.exe,請選取 <[USB_drv>\OS>\<Sources\Setup.exe,並視需要新增任何適當的參數。
    4. 如需完全自動化的部署,請將下列這一行新增至 InstallOS.bat 檔案,並新增任何適當的參數:
      %usbdrv%\<OS>\Sources\Setup.exe
  14. 在測試電腦上開機至 USB 裝置以進行測試

讓驅動程式可供 WinPE 使用的方法

將驅動程式納入 WinPE 的方法包括:

  1. 映射建置時間插入透過 DISM.exe - 將驅動程序放在 WinPE 映射的 Driverstore 中,並在 WinPE 開機時間透過 隨插即用 加以選取。 它不會傳播至已安裝的OS。 針對此方法,您必須掛接 WIM 檔案以進行存取、插入驅動程式,然後儲存並認可 WIM 的變更。

    收集資訊、掛接、插入和取消掛接 WIM 的步驟:

    1. DISM /get-wiminfo /wimfile:<pathto>boot.wim
    2. DISM /mount-wim /wimfile:<pathto>boot.wim /index:n /mountdir:<pathto>mount
    3. DISM /add-driver /image:<pathto>mount / driverpath:<pathto>driverINF [如有需要,則相反 /remove-driver 地]
    4. DISM /unmount-wim /commit /mountdir:<pathto>mount
  2. 透過 Drvload.exe 載入執行時間驅動程式 - 將驅動程式載入記憶體並啟動裝置。 不會將驅動程序傳播到已安裝的OS。

  3. 透過 Devcon.exe 載入運行時間驅動程式 - Devcon 是透過 Windows 設備驅動器套件 (DDK)/Windows 驅動程式套件 (WDK) 中的範例原始程式碼提供。 您必須建立並編譯自己的複本。 Devcon 可用來操作驅動程式,例如將驅動程式載入記憶體和啟動裝置。 不會將驅動程序傳播到已安裝的OS。 (參考區段中的連結)

  4. $WinPEDriver$ 資料夾- Setup.exe會嘗試將所有驅動程式載入 $WinPEDriver$ 目錄中的記憶體中,也會排程將它們插入安裝 OS。

  5. 您必須在 unattend.xml 中提供具有 DriverPath 的運行時間回應檔案 (unattend.xml - 路徑和認證)。 它用來存取中央存放庫中可位於網路共用或本機的檔案。 安裝程式會嘗試載入unattend.xml中提供的驅動程式存放區中的所有驅動程式,也會排程它們插入已安裝的OS。

啟動 Windows 安裝

有數種方法可從 WinPE 啟動作業系統安裝,包括:

  1. 將安裝套件插入 boot.wim。
    1. 自定義 WinPE 可以修改為自動啟動 Windows Setup.exe。
    2. 也可用於語言套件和腳本支援。
  2. 從startnet.cmd或winpeshl.ini啟動setup.exe。
    1. 找出 USB 隨身碟/Hdd
    2. 啟動 \path\setup.exe </switches>
  3. 自定義前端以取代cmd.exe(請參閱參考一節中的 Windows RE 連結)。
  4. 從一般 Windows 安裝程式媒體開機,其會先開機至 WinPE (Boot.wim),而且可以從連接的 USB 裝置或網路記憶體取得輸入。 本文不會討論這個方法。

將驅動程式新增至 Windows 的方法

接下來,遵循從安裝到包含全新驅動程序的進度,有一些方法可在 Windows 中包含現成可用的驅動程式:

  1. Dism.exe
    1. Dism /get-wiminfo /wimfile:<pathto>Install.wim
    2. Dism /mount-wim /wimfile:<pathto>Install.wim /index:n /mountdir:<pathto>mount
    3. Dism /add-driver [and conversely /remove-driver] /image:<pathto>mount /driverpath:<pathto>driverINF
    4. Dism /unmounts-wim /commit /mountdir:<pathto>mount
  2. \$WinPEDriver$
  3. 在自動安裝期間執行腳本
    1. 在 WinPE 和稽核模式中unattend.xml (驅動程式存放區)(詳細資訊位於 [參考與連結] 區段中)。
    2. Setupcomplete.cmd可用於驅動程式插入,但建議不要因為用戶體驗不佳而造成第一次開機的延遲。
  4. Drvload.exe
    1. 只會將驅動程式插入目前執行的作業系統,如果有 WinPE 通常是 RAM 磁碟。
    2. Drvload <pathto。INF> (可在 startnet.cmd 中編寫文稿 (請參閱範例)

注意

如果使用的驅動程式的名稱與內建驅動程式相同(原生包含在映射中),則開機操作系統不會使用這些新插入的驅動程式,您應該連絡驅動程式製造商以取得更新的驅動程式。 (如果熟悉 Windows 標誌套件(WLK),請參閱 Devfund0005)

如果在 WinPE 傳遞期間載入驅動程式(初始開機),則沒有任何原生機制可移除該驅動程式,直到操作系統重新啟動為止。

將驅動程式新增至 Windows 的每個步驟都有多個方法。 方法會提供可延伸且可進行部署案例。 您會想要判斷下列哪一種方法最適合特定情況。

在 WinPE 中包含現用驅動程式的詳細指示

必要的設定/工具:

  • 技術人員計算機 - 用來建置/操作安裝媒體的計算機
  • 已安裝 OPK / AIK
  • USB/UFD 或 DVD

使用 DISM.exe:

  1. 安裝 OEM 預安裝套件 (OPK) 或 Windows 自動化安裝套件 (Windows AIK)
  2. 按兩下 [啟動>程式>] Windows OPK (或 Windows AIK),然後開啟 [系統管理部署工具] 命令提示字元。
  3. 將boot.wim 複製到硬碟(例如 c:\Bin)。 您也可以使用 Copype.cmd 產生新的 WinPE;不過,這不會自動啟動setup.exe而不需額外的自定義。
  4. 使用 DISM 來識別 boot.wim 中的索引數目。 如果您要從安裝媒體複製 boot.wim,則會有兩個索引。 一般而言,我們將修改索引 #2;否則為 index #1。
    dism /get-wiminfo /wimfile:<wim_file>

    注意

    插入至一個索引的檔案將無法供其他索引使用。

  5. 建立 'Mount' 資料夾(例如 c:\Bin\mount)
  6. 使用 DISM 掛接 wim。
    DISM /mount-wim /wimfile:c:\bin\boot.wim /index:1 /mountdir:c:\bin\mount
  7. 將驅動程式放在locatable資料夾中(例如 c:\bin\driver)。
  8. 使用 DISM 將驅動程式新增至掛接的 WIM 映像。
    dism /image:c:\bin\mount /Add-Driver /driverpath:<path to INF>
  9. 檢查 DISM 記錄檔或確保 DISM 在命令提示字元傳回完成,以確認成功。
  10. 將變更卸除並認可至 Boot.wim。 在執行此命令之前,請關閉所有可能開啟於 c:\bin\mount 下方的開啟視窗(也請確定命令提示字元位於 c:\bin 目錄結構上方)。
    dism /unmount-wim /mountdir:c:\bin\mount /commit
  11. 一旦 DISM 成功卸除 WIM,我們可以設定移至 USB/DVD 的專案。 如果您在卸除期間收到錯誤,您可能想要重新掛接 wim 以確認已插入套件。 DISM 參數 /cleanup-wim/get-packages 在這裡可能很有説明。 如需在光學或 USB 快閃磁碟驅動器上建立可開機 WinPE 媒體的指示,請參閱本文件結尾的參考和連結一節。

使用 \$WinpeDriver$

$WinpeDrivers$ 是Setup.exe尋找的額外資料夾結構,如果找到,則會剖析以提取其他驅動程式。 安裝程式會遞歸剖析此 \$WinpeDriver$ 資料夾底下的檔案和資料夾,以尋找 *。INF 檔案,並嘗試將這些探索到的驅動程式安裝到驅動程式存放區。

資料夾結構在 USB 裝置的根目錄上看起來會像這樣:

\$WinpeDriver$
\\WiFi
•\Wireless1
•Wireless.INF
└Wireless.SYS
Wireless.CAT (作業系統需要)

注意

如果您查看 \Windows\Panther\Setupact.log可以看到此資料夾的參考:PnPIBS: 檢查預先設定的驅動程序路徑...
PnPIBS:檢查預先設定的驅動程序目錄 C:$WinPEDriver$。
PnPIBS:檢查預先設定的驅動程序目錄 D:$WinPEDriver$。
PnPIBS:檢查預先設定的驅動程序目錄 E:$WinPEDriver$。
PnPIBS:檢查預先設定的驅動程序目錄 X:$WinPEDriver$。

使用自動回應檔案 (unattend.xml/autounattend.xml)

如果檔案命名為 autounattend.xml,Windows 可以在掛接的磁碟驅動器根目錄自動尋找自動響應檔案。 Windows 也會在使用參數以 Setup.exe 啟動時,挑選自動響應檔案。 此回應檔案可以提供安裝作業系統的資訊,例如磁碟驅動器設定、產品密鑰、計算機名稱和驅動程式存放區路徑、OEM 公司資訊,以及其他許多專案。 如需如何將驅動程式新增至unattend.xml的檔,請參閱一節的結尾。

以下是 AIK Unattend.chm 中具有 Drvstore AutoUnattend.xml的範例代碼段。 XML 輸出會指定設備驅動器之其他位置的 UNC 路徑,以及用來存取網路路徑的認證。

<DriverPaths>
<!-- First PathAndCredentials list item -->
   <PathAndCredentials wcm:action="add" wcm:keyValue="1">
        <Path>\\myFirstDriverPath\DriversFolder</Path>
        <Credentials>
                <Domain>MyDomain</Domain>
                <Username>MyUsername</Username>
                <Password>MyPassword</Password>
        </Credentials>
   </PathAndCredentials>
<!-- Second PathAndCredentials list item -->
   <PathAndCredentials wcm:action="add" wcm:keyValue="2">
      <Path>C:\Drivers</Path>
      <Credentials>
         <Domain>MyComputerName</Domain>
         <Username>MyUsername</Username>
         <Password>MyPassword</Password>
      </Credentials>
   </PathAndCredentials>
</DriverPaths>

使用 Drvload.exe

Drvload 是 WinPE 中的工具,一旦您開機進入內建的 WinPE 命令提示字元,即可用來新增驅動程式。 使用Drvload時,驅動程式必須識別並放置在某處。 WinPE 的startnet.cmd可用來編寫 Drvload 腳本,以及在開機或開機至 WinPE 時執行下列其中一個動作:

  1. 執行文稿至:
    1. 識別安裝媒體,通常是USB裝置。
    2. 新增現用的驅動程式
    3. 設定硬碟和復原磁碟分區
    4. 視需要啟動setup.exe或套用 WIM。
  2. WIM 驗證的部署/應用程式之後,若開發人員想要建立自己的工具來插入或操作驅動程式,DevCon.exe可能是有用的公用程式。 如需DevCon.exe的詳細資訊,請參閱參考和連結一節。

範例startnet.cmd

若要編寫/自動化安裝腳本,必須識別 USB 裝置,因為這是其他驅動程式的位置。 此範例會使用 WinPE 中的腳本,在啟動時自動執行以偵測 USB 磁碟驅動器。 此文稿會啟動另一個腳本,以在安裝程式的 WinPE 階段中使用Drvload.exe來安裝驅動程式。 腳本位於 WIM 檔案之外,因此可以輕鬆地加以修改。

使用 WinPE Startnet.cmd識別安裝媒體的方法(預設 WinPE 中啟動的第一個檔案):

  1. 首先,必須有一種方法,才能自動識別 WinPE Startnet.cmd中的安裝媒體,這是在預設 WinPE 組態中啟動的第一個檔案。 有兩種方式之一可以執行這項操作:

    • 使用磁碟區卷標 「INSTALL_WIN7」 建立可開機的 WinPE USB 快閃磁碟驅動器。 然後將下列幾行放在startnet.cmd開頭,以尋找「INSTALL_WIN7」磁碟區卷標:

      "INSTALL_WIN7" disk volume label:
      :ChkVar
      :: Locating USB Device
      IF NOT DEFINED usbdrv (
      ECHO list vol | diskpart | find "INSTALL_WIN7" > pt.txt
      FOR /F "tokens=3" %%a IN (pt.txt) DO ( 
      SET usbdrv=%%a^:
      )
      del pt.txt /f /q
      
    • 在媒體上建立「標記」檔案作為比較的替代磁碟驅動器位置方法:

      :SetOSvar
      @echo off
      IF NOT DEFINED usbdrv (
      ECHO locating OS drive
      FOR %%b IN ( C D E F G H I J K L M N O ) DO (
      IF EXIST %%b:\<specialfilename1> IF EXIST %%b:\ <specialfilename2>  (
      SET usbdrv=%%b^:
      )
      )
      )
      

      注意

      您必須確定 <specialfilename1和specialfilename2> 存在於USB Flash裝置上的指定位置。

  2. 將檔案包含在startnet.cmd中使用的boot.wim中。 這接著會將檔案放入 X: 磁碟驅動器,以便透過 X:\<file name> 存取。 當您將檔案新增至boot.wim時,這會增加 WIM 記憶體使用量。

  3. 一旦知道 USB 驅動器號,就可以啟動用於插入驅動程式的其他腳本。 由於很難經常修改 boot.wim(您每次都必須掛接/卸除並認可變更),因此在startnet.cmd以外執行腳本會比較容易。 例如,如果我們在 USB 快閃磁碟驅動器的根目錄建立名為 『InstallOS.bat』 的腳本,我們可以輕鬆地修改此檔案,視需要變更開機/自動化程式。

    以下是startnet.cmd檔案中尋找 『InstallOS.bat』 和找到時,啟動它所需的文字範例:

    IF EXIST %usbdrv%\InstallOS.bat call InstallOS.bat  
    Echo %time% %date%
    

    注意

    如其名稱所示,InstallOS.bat可以執行更多動作,而不只是將驅動程式新增至 WinPE。 不過,為了本檔的目的,將不會討論其他腳本詳細數據。

  4. 此時 ,%usbdrv% 是使用 USB 快閃裝置的驅動器號來定義,因此可以透過InstallOS.bat中的腳本插入 %usbdrv%\$WinpeDriver$ 資料夾中的驅動程式。

    例如,在 InstallOS.bat 新增 Drvload.exe %usbdrv%\$winpedriver$\<device>\filename.INF

使用此方法時,第一次由WinPE挑選及使用操作系統可用的驅動程式。

Windows 復原環境 (WinRE)

WinRE 通常會在硬碟上是靜態的,可能是在安裝期間自動安裝,或由 OEM 針對復原案例建立/自定義。 如果 WinRE 用來將機器復原為原廠預設值,則實際上沒有任何方法可將驅動程式動態更新為最新版本。 您必須使用插入的驅動程式建立映像,以將驅動程式插入所有相關的WIM檔案,例如 WinRE.wim/Boot.wim,以及要套用至操作系統的映像。 請確定這些驅動程式都是相同的版本。

推論

如果您的需求是在執行 setup.exe 之前,先建立載入現成驅動程式的 WinPE 環境,請遵循本檔中所述的指導方針,最終產生所產生已安裝操作系統的驅動程式。 撰寫利用 startnet.cmd 啟動Drvload.exe來載入 USB 快閃磁碟驅動器上 $WinPeDriver$ 資料夾中特定驅動程式的腳本,是可用的最具彈性的方法。 這個方法可讓您在 WinPE 階段載入驅動程式,該階段會傳遞到已安裝的作業系統。 此外,它允許維護驅動程式的中央存放庫,以允許彈性地更新這些驅動程式(以便維護驅動程式存放區中的最新驅動程式)。

資料收集

若您需要 Microsoft 支援,建議您按照使用 TSS 收集部署相關問題的資訊所述步驟來收集資訊。

注意

您需要帳戶才能從 OEM 網站下載檔案。