我试图在批处理脚本中运行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
我知道这归结为操作的顺序和当前的报价组织,但是在弄清了一个小时的订单后,我仍然无法让它正常工作。
答案 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
作为参数传递给参数-Filter
。 LIKE
和''
作为单独的位置参数传递。
您必须转义嵌套双引号以保留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中实现所有内容。