如何用Inno Setup生成的EXE文件来安装打印机?
我正在尝试使用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代码编译并运行可执行文件就能正常工作:
- 驱动程序通过
Start-Process和pnputil安装到Windows驱动程序商店。 - 打印机驱动随后通过
Add-PrinterDriver提供用于安装打印机。 - 通过
Add-PrinterPort配置了TCP/IP打印端口。 - 通过
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。