我需要一种方法来删除 MSFT Security Essentials,以便能够在客户端上安装 Forefront。我更希望有一个登录脚本,该脚本会传递管理员凭据来删除该程序。如果这不可能,那么我可以在启动时运行的脚本也是可以接受的。
我有其他人从网上提供的以下 PS 脚本,但运行它时出现错误。
$UninstallString = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ?{$_.GetValue("DisplayName") -like "Microsoft Security Essentials" } | ForEach-Object -Process {$_.GetValue("UninstallString") }
$uninstallCmd=$UninstallString.split('/')[0].Trim()
$uninstallParam='/' + $UninstallString.split('/')[1].Trim()
$uninstallParamSilent="/s"
& $uninstallCmd $uninstallParam $uninstallParamSilent
当按原样运行时(即使我知道它看起来是错误的)我收到以下错误:
Method invocation failed because [System.Object[]] doesn't contain a method named 'split'.
At C:\Users\administrator\Desktop\remove Security essentials.ps1:2 char:37
+ $uninstallCmd=$UninstallString.split <<<< ('/')[0].Trim()
+ CategoryInfo : InvalidOperation: (split:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Method invocation failed because [System.Object[]] doesn't contain a method named 'split'.
At C:\Users\administrator\Desktop\remove Security essentials.ps1:3 char:45
+ $uninstallParam='/' + $UninstallString.split <<<< ('/')[1].Trim()
+ CategoryInfo : InvalidOperation: (split:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
The expression after '&' in a pipeline element produced an invalid object. It must result in a command name, script blo
ck or CommandInfo object.
At C:\Users\administrator\Desktop\remove Security essentials.ps1:5 char:2
+ & <<<< $uninstallCmd $uninstallParam $uninstallParamSilent
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
将最后一行移到前一行也会导致错误:
Unexpected token '&' in expression or statement.
At C:\Users\administrator\Desktop\remove Security essentials.ps1:4 char:29
+ $uninstallParamSilent="/s" & <<<< $uninstallCmd $uninstallParam $uninstallParamSilent
+ CategoryInfo : ParserError: (&:String) [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken
我对 PS 了解不够,不知道代码哪里错了,但如果能提供任何帮助我将非常感激。
此外,如果有人有可以在 XP 和 Win7 上运行的东西,而无需在 XP 机器上安装 PS,那就太好了。
答案1
在我看来,cmdlet 返回了多个产品Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ?{$_.GetValue("DisplayName") -like "Microsoft Security Essentials" }
,而您的脚本却失败了,因为它只需要一个。
尝试这个修改后的脚本,它循环遍历每个返回的对象并执行产品的卸载命令。我还将开关更改/s
为msiexec
,/quiet
因为它看起来与更多版本的 Windows 兼容。
$UninstallString = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ?{$_.GetValue("DisplayName") -like "Microsoft Security Essentials" } | ForEach-Object -Process {$_.GetValue("UninstallString") }
foreach($ThisProduct in $UninstallString)
{
$UninstallCmd = $ThisProduct.split('/')[0].Trim()
$UninstallParam = '/' + $ThisProduct.split('/')[1].Trim()
$UninstallParamQuiet = "/quiet"
& $UninstallCmd $UninstallParam $UninstallParamQuiet
}
免责声明:此答案来自非常多在聊天中来回寻找真正的问题,即某个 PowerShell 命令返回了多个项目。
答案2
$UninstallString
确实是string
?如果不是,你可能需要将其转换为string
。另外,我不知道思考是的null
,但是您可能想验证它是否包含您认为在第一步之后它所做的事情。
答案3
@ECHO OFF
CLS
C:
CD\
CD Program Files\Microsoft Security Client
setup.exe /x /s
EXIT
这在 XP 客户端上有效,尚未在 Win7 上测试过,但由于这只是一个批处理脚本,所以应该没问题。这里必须说“太简单了,一个 $BRAINDEADBIPED 就能做到!”