Get-Process | ? {$_.ProcessName -eq "DellCommandUpdate"} | Stop-Process -Force
$Params = @(
"/qn"
"/norestart"
)
Start-Process "msiexec.exe" -ArgumentList $Params -Wait
我正在尝试从一些旧版本的笔记本电脑上卸载 Dell Command Update。我收到此错误,如下?
Msiexec.exe
需要您要安装或卸载的程序的路径。/x
标志来指定它是卸载,否则您将作为安装运行它。试试这个:
$MSIExec = "msiexec.exe"
$Parameters = "/x /qn /norestart <Path to package.msi>"
& "$MSIExec" $Parameters
我倾向于认为这是一个与更通用的“如何在 Powershell 中运行带有参数的可执行文件”问题重复的问题,该问题在这里有类似的答案:https://stackoverflow.com/a/22247408/1618897
但是,考虑到这是一个新帐户,并且您清楚地展示了您所做的事情,我认为这仍然有效。
您的屏幕截图与您的代码不一致,因为它意味着您将(包含)
$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等待应用程序终止并报告其退出代码.
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回答。