使用Get-WmiObject卸载

时间:2016-01-08 14:39:57

标签: powershell batch-file wmi

我试图在批处理脚本中运行PowerShell命令。我试图从客户端PC中删除旧RMM工具的所有痕迹,并且在我的生命中不能让这条线正常运行。

我们的想法是搜索供应商名称中具有N-Able的软件,并将GUID传递给$nableguid变量,然后针对上面找到的GUID传递msiexec.exe

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {$nableguid = (Get -WmiObject Win32_Product -Filter "vendor LIKE '%N-able%'" | Select -ExpandProperty IdentifyingNumber); foreach ($nguid in $nableguid){ & MsiExec.exe /X$nguid /quiet} }";

当前错误如下

Get-WmiObject : A positional parameter cannot be found that accepts argument ''. 
At line:1 char:18
+ & {$nableguid = (Get-WmiObject Win32_Product -Filter vendor LIKE '' | Select -Ex ...
+                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetWmiObjectCommand

我知道这归结为操作的顺序和当前的报价组织,但是在弄清了一个小时的订单后,我仍然无法让它正常工作。

2 个答案:

答案 0 :(得分:1)

检查这个片段,它正在使用WMI,但以另一种方式,几乎从未让我失望:

function Uninstall-Application($computer, $target) {
    $productInfo = Get-WmiObject Win32_Product -Filter "Name LIKE '%$target%'" -ComputerName $computer
    $pin = $productInfo.IdentifyingNumber
    $pn = $productInfo.Name
    $pv = $productInfo.Version

    if($pn -ne $null) {
        $classKey = "IdentifyingNumber=`"$pin`",Name=`"$pn`",version=`"$pv`""

        $uninstallReturn = ([wmi]"\\$computer\root\cimv2:Win32_Product.$classKey").uninstall()
        if($uninstallReturn.ReturnValue -ge 0) { Write-Host "Uninstall complete" }
        else { $uninstallReturn | Out-Host }
    } else {
        Throw "Product not found"
    }
}

使用示例:

Uninstall-Application "127.0.0.1" "firefox"

答案 1 :(得分:0)

您收到该错误,因为您在双引号字符串中使用未转义的百分比字符和双引号:

"& {... -Filter "vendor LIKE '%N-able%'" ...}"

执行PowerShell命令时,上面评估为-Filter vendor LIKE '',即只有令牌vendor作为参数传递给参数-FilterLIKE''作为单独的位置参数传递。

您必须转义嵌套双引号以保留PowerShell命令:

"& {... -Filter \"vendor LIKE '%N-able%'\" ...}"

您还必须将%字符加倍(这是它们在批处理/ CMD中的转义方式),否则%N-able%将被解释为批处理变量并在执行之前扩展为空字符串powershell命令行。

"& {... -Filter \"vendor LIKE '%%N-able%%'\" ...}"

说到这一点,通常在PowerShell脚本中实现PowerShell代码要简单得多:

$nableguid = Get -WmiObject Win32_Product -Filter "vendor LIKE '%N-able%'" |
             Select -ExpandProperty IdentifyingNumber)

foreach ($nguid in $nableguid) {
  & MsiExec.exe /X$nguid /quiet
}

并通过-File参数运行该脚本(如果您必须首先从批处理文件运行它):

powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\path\to\script.ps1"

更好的方法是完全删除批处理脚本并在PowerShell中实现所有内容。