我正在提取以前创建的文本文件,该文件只列出了所有当前安装的Windows更新的KB编号。我正在尝试将此文件拉入并调用wusa.exe
并将其传递给KB编号以执行卸载。
$a = Get-Content c:\hotfixid.txt
foreach ($kb in $a) {
$command = 'cmd /c wusa.exe /uninstall /kb:' + $kb.Trim().Substring(2) + ' /quiet /norestart'
#Write-Host $command
Write-Host "Currently uninstalling $kb"
Invoke-Expression -Command:$command
}
如果我使用
Write-Host $command
并将其直接复制到Windows中的运行对话框,它成功完成。
在PowerShell脚本中运行它时会发生的事情是它只在大约2秒内一个接一个地输出Write-Host部分。我没有看到任何命令窗口打开,我看不到它实际上做了什么。我使用不受限制的执行策略运行PowerShell脚本“作为管理员”。我还尝试在$command
添加'runas',每次都使用管理权限调用CMD窗口,但没有任何区别。通过Invoke-Command
调用它也没有任何区别。
答案 0 :(得分:2)
PowerShell可以直接运行大多数命令而不会有太多麻烦。
使用Invoke-Expression
只会使问题复杂化,Invoke-Command
或Start-Process
也是如此,因为您需要正确引用,并以稍微不自然的方式传递参数。
您甚至可以在大多数情况下跳过cmd.exe
。
尝试以下方法:
wusa.exe /uninstall "/kb:$($kb.Trim().Substring(2))" /quiet /norestart