参数为 null 或为空:调用 msiexec.exe 进行卸载时出现启动进程错误

问题描述 投票:0回答:2
Get-Process | ? {$_.ProcessName -eq "DellCommandUpdate"} | Stop-Process -Force

$Params = @(
    "/qn"
    "/norestart"
)

Start-Process "msiexec.exe" -ArgumentList $Params -Wait

我正在尝试从一些旧版本的笔记本电脑上卸载 Dell Command Update。我收到此错误,如下?

powershell windows-installer parameter-passing start-process
2个回答
2
投票

Msiexec.exe
需要您要安装或卸载的程序的路径
您还需要
/x
标志来指定它是卸载,否则您将作为安装运行它。试试这个:

$MSIExec = "msiexec.exe"
$Parameters = "/x /qn /norestart <Path to package.msi>"
& "$MSIExec" $Parameters

我倾向于认为这是一个与更通用的“如何在 Powershell 中运行带有参数的可执行文件”问题重复的问题,该问题在这里有类似的答案:https://stackoverflow.com/a/22247408/1618897

但是,考虑到这是一个新帐户,并且您清楚地展示了您所做的事情,我认为这仍然有效。


0
投票
  • 您的屏幕截图与您的代码不一致,因为它意味着您将(包含)

    $null
    空数组
    @()
    )(包含的变量)传递给了
    -ArgumentList
    Start-Process
    参数

  • 所示的代码将技术上工作 - 从某种意义上说,

    Start-Process
    将成功启动msiexec.exe
    ,但是 - 正如
    Tanaka Saito的回答所指出的那样 - 传递给msiexec.exe
    的参数由于缺少指定目标 
    /x
     文件的 
    .msi
    (卸载)参数,因此不形成完整的命令。

  • 将此缺失的信息添加到

    $Parameters

     将使您的 
    Start-Process
     通话正常工作:
    [1]

    $Params = @( '/qn' '/norestart' '/x' 'someInstaller.msi' # specify the .msi file here )
    
    
  • 但是,有一种

    更好的方法可以从 PowerShell 调用

    msiexec.exe
    ,即:

    由于使用直接调用,
    • 在语法上更简单。

    • 自动在

      自动$LASTEXITCODE变量中反映安装程序的

      退出代码
      (使用Start-Process
      ,您必须添加
      -PassThru
      才能接收和捕获其
      .ExitCode
      属性的进程信息对象你必须查询)。

      # Executes synchronously due to the `| Write-Output` trick, # reflects the exit code in $LASTEXITCODE. msiexec /qn /norestart /x someInstaller.msi | Write-Output
      
      
    • 注:

      • 管道传输到

        Write-Output

        是确保
        GUI子系统应用程序(例如msiexec.exe同步
        执行的简单方法:涉及
        管道,这种方式使PowerShell等待应用程序终止并报告其退出代码.

      • 在某些情况下,从 PowerShell 将属性值传递到

        msiexec.exe

         会导致问题,即当值包含 
        空格 时,因此需要 部分引用(例如 FOO="bar baz"
        )。在这种情况下,您可以通过 
        cmd.exe /c
         使用以下替代方案:

        # Executes synchronously, # reflects the exit code in $LASTEXITCODE. # '...' encloses the entire msiexec command line # Use "..." if you need string interpolation, and `" for embedded " cmd /c 'msiexec /qn /norestart /x someInstaller.msi'
        
        
      • 请参阅

        此答案了解详情。


[1] 然而,由于长期存在的错误,最终最好将所有参数编码在单个字符串中,因为它使得对嵌入式双引号的情况需要显式 - 请参阅this回答

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