Wix 安装程序在尝试运行 bat 文件时抛出错误

问题描述 投票:0回答:1

我正在使用 Bootstrapper WIX 安装程序为我的应用程序制作 exe。我正在尝试备份当前的 SQL Server 2014 并在安装后恢复到 SQL Server 2022。这是我的链元素在 Bundle.wxs 文件中的样子。

    <Chain>
      <ExePackage  SourceFile="..\prerequisites\BackupDatabase2014.bat" DisplayName="Backing up 2014 Database.."  Compressed ="yes" Vital ="no" Permanent ="yes" />
      <ExePackage  SourceFile="..\prerequisites\RemoveDatabase2014.bat" DisplayName="Uninstalling 2014 database.."  Compressed ="yes" Vital ="no" Permanent ="yes" />
      <ExePackage  SourceFile="..\prerequisites\RemoveFiles.bat" DisplayName="Removing Existing Database Keys.."  Compressed ="yes" Vital ="no" Permanent ="yes" />
      <PackageGroupRef Id="Sql2022Express"/>
      <ExePackage  SourceFile="..\prerequisites\RestoreDatabase2014.bat" DisplayName="Restoring 2014 Database records.."  Compressed ="yes" Vital ="no" Permanent ="yes" />
    </Chain>

我遇到的问题是 Backup2014Database.bat 文件,当我单独运行该文件时,它成功地进行了备份,没有任何错误。但是在运行使用 WIX 安装程序生成的 exe 文件时,我收到此错误。

Applying execute package: BackupDatabase2014.bat, action: Install, path: C:\ProgramData\Package Cache\812A85A2036657975578443EC126F48F631CEC9E\BackupDatabase2014.bat, arguments: '"C:\ProgramData\Package Cache\812A85A2036657975578443EC126F48F631CEC9E\BackupDatabase2014.bat"'
 Error 0x80070001: Process returned error: 0x1
 Error 0x80070001: Failed to execute EXE package.
 Error 0x80070001: Failed to configure per-machine EXE package.

这是BackupDatabase2014.bat文件

@echo off
SETLOCAL EnableExtensions

rem Check if the script is running with administrative privileges
net session >nul 2>&1
if %errorLevel% neq 0 (
    echo This script requires administrative privileges. Please run it as an administrator.
    exit /b 1
)

echo Checking for SQL Server instance XYZInstance...
reg query "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" /v XYZINSTANCE | findstr /i "MSSQL12.XYZINSTANCE" > nul 2>&1
if %errorlevel% neq 0 (
    echo XYZInstance instance not found in the registry. Exiting...
    exit /b 1
)

echo Setting backup folder path...
set "BackupFolderPath=C:\Database2014Backup"
echo Checking if the backup folder exists...
if not exist "%BackupFolderPath%" (
    echo Creating backup folder...
    mkdir "%BackupFolderPath%"
    if %errorlevel% neq 0 (
        echo Failed to create the backup folder. Exiting...
        exit /b 1
    )
)

echo Granting permissions...
icacls "%BackupFolderPath%" /grant "NT AUTHORITY\SYSTEM":(OI)(CI)F
if %errorlevel% neq 0 (
    echo Failed to grant permissions to the backup folder. Exiting...
    exit /b 1
)

echo Setting variables for backup...
set "ServerName=%COMPUTERNAME%\XYZInstance"
set "DatabaseName=XYZInstance"
set "BackupFileName=%DatabaseName%_Backup_%date:~4,2%-%date:~7,2%-%date:~10,4%.bak"
set "BackupFilePath=%BackupFolderPath%\%BackupFileName%"

echo Checking if the database exists...
sqlcmd -S %ServerName% -Q "IF EXISTS(SELECT 1 FROM sys.databases WHERE name = '%DatabaseName%') SELECT 1 ELSE SELECT 0;" -h-1 -s" " -W > nul
if %ERRORLEVEL% EQU 0 (
    echo Performing database backup...
    sqlcmd -S %ServerName% -Q "BACKUP DATABASE [%DatabaseName%] TO DISK='%BackupFilePath%'"
    if %errorlevel% neq 0 (
        echo Database backup failed. Exiting...
        exit /b 1
    )

    echo Checking if the backup was successful...
    if exist "%BackupFilePath%" (
        echo Database backup completed successfully.
    ) else (
        echo Database backup failed. Backup file does not exist.
        exit /b 1
    )
) else (
    echo Database %DatabaseName% does not exist. Skipping backup.
)

exit /b 0

我想在这里实现的顺序是:

  1. 备份
  2. 删除 SQL Server 2014 的当前实例
  3. 删除相关注册表项
  4. 安装 SQL Server 2022 实例。
  5. 将2014年备份恢复到2022年实例

我尝试更改BackupDatabase2014.bat文件代码以确保不存在权限问题,并且exe是以管理员权限执行的。代码中有更多bat文件,运行没有任何问题。我研究了有关堆栈溢出和其他互联网平台的多个答案,但没有一个与此处的情况相符。

我被困在这里请帮忙,我也知道使用bat文件不是这里的最佳实践,但由于之前安装代码的编写方式,它是强制性的。

sql-server windows batch-file installation wix
1个回答
0
投票

批处理文件不是可执行文件。您指示 Burn 将文本文件作为可执行文件启动,但它无法告诉您文本文件不是可执行文件。

批处理文件由cmd.exe解释。但是,Burn 不支持将 cmd.exe 作为可执行文件运行,因为正如您所指出的,批处理文件不是一个好的做法。

您需要以不同的方式处理问题。

© www.soinside.com 2019 - 2024. All rights reserved.