使用脚本安装预配包中的桌面应用

适用于

  • Windows 10
  • Windows 11

本演练介绍如何在客户端预配包Windows脚本以安装 Win32 应用程序。 还可以执行除安装应用外的其他脚本化操作。 但是,需要谨慎以避免脚本执行期间出现意外 (请参阅下面的) 。

整合应用程序资源

  1. 在创建程序包的设备中,将所有资源放置到已知位置。 每个资源必须具有一个唯一的文件名,因为所有文件都将复制到设备上的同一临时目录中。 通常,许多应用都将安装程序命名为“install.exe”或类似名称,因此,名称可能会重叠。 若要解决此问题,你可以使用下一步骤中描述的技术包含一个完整的目录结构,然后将其展开到设备上的临时目录中。 这一技术最常用的情况就是,包含每个应用程序的子目录。

  2. 如果需要包含文件的目录结构,你将需要 cab 资源,以便更轻松地包含在预配包中。

Cab 应用程序资源

  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 创建 cab 文件。

    Makecab -f <path to DDF file>
    

创建脚本,安装应用程序

创建脚本执行安装应用程序所需的所有工作。 提供以下示例,帮助创作 orchestrator 脚本的入门,此脚本将执行所需的安装程序。 实际上,相比这些示例中的脚本,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 标志一起调用。

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%

调用包中的多个脚本

你的预配包可以包含多个 CommandLines。

每个预配包允许有一个 CommandLine。 以上所示批处理文件是 orchestrator 脚本,可管理安装并调用预配包中包含的任意其他脚本。 orchestrator 脚本是应从包中指定的 CommandLine 调用的内容。

下表使用上文中的 PowerShell 示例描述了此关系:

ICD 设置 描述
ProvisioningCommands/DeviceContext/CommandLine cmd /c PowerShell_Example.bat 调用 orchestrator 脚本所需的命令行。
ProvisioningCommands/DeviceContext/CommandFiles PowerShell_Example.bat 由处理调用所需的安装程序或执行任意其他操作(例如,展开 cab 文件)的命令行引用的单个 orchestrator 脚本。 此脚本必须进行所需的日志记录。
ProvisioningCommands/DeviceContext/CommandFiles my_powershell_script.ps1 orchestrator 脚本引用的其他资源。 此示例中只有一个,但此处引用了很多资源。 一个常见的用例是,使用 orchestrator 调用一系列 install.exe 或 setup.exe 安装程序,从而安装多个应用程序。 每个安装程序都必须作为资源包含在其中。

将脚本添加到预配包中

当写入批量文件并准备好包含引用的资源时,你可以在 Windows 配置设计器中将其添加到预配包。

使用 Windows 配置设计器,指定如何在预配包的 CommandLine 设置中运行脚本的完整详细信息。 这包括标志或通常键入命令行的任何其他参数。 因此,例如,如果包中包含名 install.exe 的应用安装程序和名为 InstallMyApp.bat 的用于自动化安装的脚本,应将 ProvisioningCommands/DeviceContext/CommandLine 设置配置为:

cmd /c InstallMyApp.bat

在 Windows 配置设计器中如下所示:

所选自定义项中的命令行。

你还需要为此命令行添加相关资源,包括 orchestrator 脚本和它引用的任意其他资源,例如安装程序或 .cab 文件。

在 Windows 配置设计器中,通过添加 ProvisioningCommands/DeviceContext/CommandFiles 设置下的文件完成此操作。

所选自定义项中的命令文件。

完成后,请生成包

备注

  1. 不支持通过 ProvisioningCommands 进行交互或控制台输出。 所需工作都需要以静默方式完成。 如果你的脚本尝试进行以下任一操作,将导致未定义的行为。并且,如果在设置或全新体验期间执行,可能使设备处于无法恢复的状态:a. 回显至控制台 b。 在屏幕 c 上显示任意内容。 用对话框或安装向导提示用户

  2. 当在首次启动中应用时,预配会在启动序列的早期和建立用户上下文之前运行;必须格外小心,仅包含可在此时运行的安装程序。 可通过管理工具预配其他安装程序。

  3. 如果由于脚本错误而使设备进入不可恢复的状态,可以使用客户端 中的恢复选项Windows重置

  4. 已将 CommandFile 资源部署到设备的临时文件夹中,每个包的临时文件夹都是唯一的。

    1. 对于在开箱使用体验期间添加的程序包,这通常位于 %WINDIR%\system32\config\systemprofile\appdata\local\Temp\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

      0Commands\ 引用安装顺序,并指示要安装的第一个应用。 针对包中的每个应用,该数字将会递增。

    2. 对于通过双击已部署的设备添加的包,其将位于供用户执行预配包的临时文件夹中: %TMP%\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

  5. 将使用将 CommandFiles 作为工作目录部署的目录执行命令行。 这意味着,你无需将完整路径特定于命令行或任意脚本中的资源。

  6. 运行时预配组件将尝试运行位于尽可能最早点的预配包中的脚本,具体取决于添加 PPKG 时所处的阶段。 例如,如果在全新体验期间添加了包,则会在应用包后(全新体验仍然在发生时)立即运行。 这发生在用户帐户配置选项呈现给用户之前。 将显示旋转进程对话框,并在屏幕上显示“请稍后”。

    备注

    此时会有 30 分钟的预配置进程超时。 需要在这期间完成所有脚本和安装。

  7. 脚本会在其余预配继续运行时在后台执行。 对于使用双击安装在现有系统中添加的包,没有已完成预配或脚本执行的通知。