【问题标题】:Method invocation failed because X does not contain a method named 'op_Subtraction'方法调用失败,因为 X 不包含名为“op_Subtraction”的方法
【发布时间】:2020-04-05 13:34:08
【问题描述】:

我编写了一个脚本来分析我每天正在处理的广告。

过去几个月一直运行良好,没有错误,但今天早上出现了一个,我不知道为什么。

在执行过程中:

$adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_.enabled -ne $true}).count) - 2
Write-Host "ADMIN ACCOUNTS DISABLED : "$adm_disabled

我收到以下错误(我以前从未遇到过,顺便说一句,它是法语):

Échec lors de l’appel de la méthode, car [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] ne contient pas de méthode nommée « op_Subtraction ».
Au caractère D:\Users\pmonties\OneDrive - Professional\Documents\Scripts_PS_Test\ANALYSE_AD.ps1:29 : 1
+ $adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation : (op_Subtraction:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

翻译

Method invocation failed because [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] does not contain a method named 'op_Subtraction'.
At D:\Users\pmonties\OneDrive - Professional\Documents\Scripts_PS_Test\ANALYSE_AD.ps1:29 : 1
+ $adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation : (op_Subtraction:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

不明白,为什么减法突然不行了?

【问题讨论】:

  • 也许Get-ADUser | ?... 没有返回任何东西?

标签: powershell active-directory


【解决方案1】:

错误提示 “不可能从 [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] 类型的对象中减去”

当您尝试对不支持算术的事物进行算术运算时,总是会发生这种类型的错误:

# fails the same way:
@() - 2

在你的情况下,你这样做

(($something).count) - 2

独立于 $something 是什么,您的期望是 .Count 将是这些事物的计数,因此是一个数字。

但是如果$something 意外拥有一个名为Count自己的 属性会怎样?然后 PowerShell 会更愿意为您提供该属性,如果它不是数字,而是 ADPropertyValueCollection,则会出现上述错误。

$a = @{ some = "object" }
$b = @{ some = "object"; Count = 1,2,3 }

$a.Count - 2 # succeeds
$b.Count - 2 # fails with "[System.Object[]] does not contain a method named 'op_Subtraction'

为了防止这种情况,您可以使用Measure-Object,它返回一个MeasureInfo,它有一个数字Count

($something | Measure-Object).count - 2

【讨论】:

【解决方案2】:

忘记我之前的回复。我想我设法找到了根本原因。

我限制了 Get-ADUser 的结果,因此在 Where-filter 之后,我只剩下 1 个用户。并且该用户没有 count 属性,因为它只是 1 个对象。

#limit Get-ADUser using array notation [0..1]
$adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)")[0..1] | Where {$_.Enabled -ne $true}).Count - 2

通过简单地添加一个@-symbol,表明我正在使用一个数组,它又可以工作了。

$adm_disabled = @(Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_.Enabled -ne $true}).Count - 2

【讨论】:

  • 有效!我现在弄错了,这确实是因为我的 get-aduser 调用返回了一个用户。我将验证另一个答案,因为它更详细但效果很好!非常感谢
  • 我也更喜欢另一个答案 ;-)
猜你喜欢
  • 2023-02-03
  • 2018-11-27
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多