如何用Inno Setup生成的EXE文件来安装打印机?

编程语言 2026-07-09

我正在尝试使用Inno Setup创建一个安装程序来安装打印机。用来安装驱动、打印端口和打印机的所有代码都放在一个PowerShell脚本里。

基本上,我有一个装满驱动的文件夹,以及一个PowerShell脚本。我的ISS与 PowerShell脚本如下所示:

[Setup]
AppName=Printer Installer
AppVersion=1.0
DefaultDirName={tmp}
DisableDirPage=yes
DisableProgramGroupPage=yes
Uninstallable=no
AlwaysRestart=no
ArchitecturesAllowed=x64compatible
ArchitecturesInstallIn64BitMode=x64compatible
PrivilegesRequired=admin
Compression=lzma2/ultra64
SolidCompression=yes
LZMADictionarySize=1048576
LZMANumBlockThreads=4
LZMAUseSeparateProcess=yes
WizardStyle=modern
OutputDir=output
OutputBaseFilename=Home_Canon_Color_imageCLASS_MF634Cdw

[Messages]
ReadyLabel1=Setup is now ready to begin installing the printer.
InstallingLabel=The print drivers are being unpacked and installed.  The printer will be configured shortly.  Grab yourself a Snickers; this could take a hot minute.

[Files]
Source: "Drivers\*"; \
DestDir: "{tmp}\Drivers"; \
Flags: recursesubdirs createallsubdirs ignoreversion deleteafterinstall

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
begin
  if CurStep = ssPostInstall then
  begin
    Exec(ExpandConstant('{sys}\WindowsPowerShell\v1.0\powershell.exe'),
      '-NoProfile -ExecutionPolicy Bypass -File "' + ExpandConstant('{tmp}\Drivers\Printer_Install.ps1') + '"', 
      '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
  end;
end;
$ErrorActionPreference = "SilentlyContinue"
$PrintDriverPath = ".\Driver\CNLB0MA64.INF"
$PrintDriverName = "Canon Generic Plus UFR II"
$PrinterPort = "192.168.20.118"
$PrinterName = "Canon Color imageCLASS MF634Cdw"
$PrinterLocale = "Loft"

$StartProcessParams = @{
  FilePath = "C:\Windows\System32\pnputil.exe"
  ArgumentList = "/Add-Driver `"$PrintDriverPath`" /install"
  Wait = $True
  NoNewWindow = $True
}

# Install the driver into the Windows Driver Store.
Start-Process @StartProcessParams

# Add the TCP/IP printer.
Add-PrinterDriver "$PrintDriverName"
Add-PrinterPort -Name "$PrinterPort" -PrinterHostAddress "$PrinterPort"
Add-Printer -Name "$PrinterName" -DriverName "$PrintDriverName" -PortName "$PrinterPort" -Location "$PrinterLocale"

据我所知,Inno Setup会执行PowerShell脚本,因为打印端口会被添加。不过,打印驱动从未出现,打印机当然也不会被安装。即使我认为ISS文件中的64位相关已经处理好,我猜这可能是64位与32位的问题,就像前面提到的通过7-Zip创建的文件时遇到的那样,因此我在PowerShell脚本中尝试了 FilePath 参数,分别用 "C:\Windows\SysNative\pnputil.exe""C:\Windows\System32\pnputil.exe" 进行测试,但都似乎没有效果。

我也以为这可能是PowerShell脚本路径与驱动文件夹路径之间的问题,然而如果我 cd 进入文件夹并运行PowerShell脚本,它工作正常,因为它能看到该文件夹。

解决方案

最后,我把PS代码改成你在下面看到的样子。关键是设置 WorkingDirectory。之后,使用上面ISS代码编译并运行可执行文件就能正常工作:

  1. 驱动程序通过 Start-Processpnputil 安装到Windows驱动程序商店。
  2. 打印机驱动随后通过 Add-PrinterDriver 提供用于安装打印机。
  3. 通过 Add-PrinterPort 配置了TCP/IP打印端口。
  4. 通过 Add-Printer 安装了打印机。

可工作的代码:

$ErrorActionPreference = "SilentlyContinue"
$PrintDriverPath = ".\Driver\CNLB0MA64.INF"
$PrintDriverName = "Canon Generic Plus UFR II"
$PrinterPort = "192.168.20.118"
$PrinterName = "Canon Color imageCLASS MF634Cdw"
$PrinterLocale = "Loft"

$StartProcessParams = @{
  FilePath = "$Env:WinDir\System32\pnputil.exe"
  ArgumentList = "/Add-Driver `"$PrintDriverPath`" /install"
  WorkingDirectory = "$PSScriptRoot"
  Wait = $True
  NoNewWindow = $True
}

# Install the driver into the Windows Driver Store.
Start-Process @StartProcessParams

# Add the TCP/IP printer.
Add-PrinterDriver "$PrintDriverName"
Add-PrinterPort -Name "$PrinterPort" -PrinterHostAddress "$PrinterPort"
Add-Printer -Name "$PrinterName" -DriverName "$PrintDriverName" -PortName "$PrinterPort" -Location "$PrinterLocale"
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章