String 向MSI传递参数时有关字符串转义的新手查询

String 向MSI传递参数时有关字符串转义的新手查询,string,powershell,String,Powershell,请帮忙。我正在尝试做一件看起来很简单的事情,但就我的一生而言,我无法让它工作 我正在尝试运行MSI并传入一些参数,但参数中的空格会导致问题,我尝试的所有操作都失败: $CONN_STRING = "Data Source=DATABASE_INSTANCE;Initial Catalog=DATABASE_NAME;Integrated Security=True;Persist Security Info=True" $InstallLocation = "C:\Data\My Web" m

请帮忙。我正在尝试做一件看起来很简单的事情,但就我的一生而言,我无法让它工作

我正在尝试运行MSI并传入一些参数,但参数中的空格会导致问题,我尝试的所有操作都失败:

$CONN_STRING = "Data Source=DATABASE_INSTANCE;Initial Catalog=DATABASE_NAME;Integrated Security=True;Persist Security Info=True"
$InstallLocation = "C:\Data\My Web"

msiexec.exe /qb /i MyInstaller.msi TARGETDIR=$InstallLocation CONNECTION_STRING=$CONN_STRING
任何想法都会很有帮助。网上没有一个例子能解决我的问题

好的,为了简化问题,我删除了所有参数的引用,以证明什么是有效的:

msiexec.exe /qb /i North.GLN.Installer.msi TARGETDIR="'C:\Data\My Web'" 
这不管用

msiexec.exe /qb /i North.GLN.Installer.msi "TARGETDIR='C:\Data\My Web'" 
这不管用

msiexec.exe /qb /i North.GLN.Installer.msi "TARGETDIR='C:\Data\MyWeb'" 
msiexec.exe /qb /i North.GLN.Installer.msi TARGETDIR="C:\Data\MyWeb" 
这两个都没有我的网络空间,但我的安装路径有一个空间

更新


我的问题似乎与powershell有关,因为如果直接在命令行中运行相同的命令,则可以正常工作。

从powershell中运行旧的exe应用程序可能会很棘手

试试这个:

 $CONN_STRING = "Data Source=DATABASE_INSTANCE;Initial Catalog=DATABASE_NAME;Integrated Security=True;Persist Security Info=True"
$InstallLocation = '"C:\Data\My Web"'
    $Arguments = @(
        "/qb",
        "/i",
        "MyInstaller.msi",
        "TARGETDIR=$InstallLocation",
        "CONNECTION_STRING=$CONN_STRING"
    )
    $Proc = Start-Process -FilePath msiexec.exe -ArgumentList $Arguments -PassThru -Wait
    While(-Not($Proc.HasExited)){Start-Sleep -Seconds 1}
    if($Proc.ExitCode -ne 0) {
        Throw ('Installation failed with errorcode: {0}' -f $Proc.ExitCode)
    }

另外,我建议您使用msi包的完整路径。

尝试引用property=value设置:

$CONN_STRING = "Data Source=DATABASE_INSTANCE;Initial Catalog=DATABASE_NAME;Integrated Security=True;Persist Security Info=True"
$InstallLocation = "C:\Data\My Web"
msiexec.exe /qb /i MyInstaller.msi "TARGETDIR=$InstallLocation" "CONNECTION_STRING=$CONN_STRING"

最后,我放弃了powershell,转而使用批处理文件。不理想,但我不能再花时间去做最基本的事情了

我使用的命令如下:

SET DATABASE_INSTANCE=SERVERNAME
SET DATABASE_NAME=DBNAME
SET INSTALL_DIRECTORY=INSTALLLOCATION
SET CONN_STRING=Data Source=%DATABASE_INSTANCE%;Initial Catalog=%DATABASE_NAME%;Integrated Security=True;Persist Security Info=True

msiexec.exe /qb /i MyInstaller.msi 
TARGETDIR="%INSTALL_DIRECTORY%" 
CONNECTION_STRING="%CONN_STRING%"

不能把单引号也放在双引号里吗
$InstallLocation=“'C:\Data\My Web'”
也应该起作用,这样在变量展开时,单变量仍然存在。另外,最好向我们展示您尝试过的不起作用的内容,这样社区就不会覆盖同一领域。这似乎造成了同样的问题,因为MSI帮助窗口弹出,表明我的参数格式不正确,这就是我遇到的问题。我明白了,对不起,我误解了这个问题。您正在安装的是哪个程序?我认为您必须参考该产品的手册以了解哪些选项可用,或者您可以在不使用/qb的情况下安装MSI软件包,并使用
开关:/L*V myinstall.log
生成详细日志。然后搜索此日志以找出使用了哪个连接字符串。忽略连接字符串一秒钟后,我可以使用不带空格的路径传递TARGETDIR,并且应用程序使用空白连接字符串正确安装。当我的路径有一个带空格的字符串时,问题就出现了。完全删除对变量的所有依赖关系。我明白了,这是通过将路径括在引号中修复的:$InstallLocation='“C:\Data\My Web”不是必需的(请参见我的答案)。