方法调用失败,因为 X 不包含名为“op_Subtraction”的方法

Day*_*opo 0 powershell active-directory

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

\n\n

过去几个月它工作得很好,没有错误,但今天早上出现了一个错误,我不明白为什么。

\n\n

这是在执行期间:

\n\n
$adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_.enabled -ne $true}).count) - 2\nWrite-Host "ADMIN ACCOUNTS DISABLED : "$adm_disabled\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_.enabled -ne $true}).count) - 2\nWrite-Host "ADMIN ACCOUNTS DISABLED : "$adm_disabled\n
Run Code Online (Sandbox Code Playgroud)\n\n

已翻译

\n\n
\xc3\x89chec lors de l\xe2\x80\x99appel de la m\xc3\xa9thode, car [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] ne contient pas de m\xc3\xa9thode nomm\xc3\xa9e \xc2\xab\xc2\xa0op_Subtraction\xc2\xa0\xc2\xbb.\nAu caract\xc3\xa8re D:\\Users\\pmonties\\OneDrive - Professional\\Documents\\Scripts_PS_Test\\ANALYSE_AD.ps1:29 : 1\n+ $adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_ ...\n+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    + CategoryInfo          : InvalidOperation : (op_Subtraction:String) [], RuntimeException\n    + FullyQualifiedErrorId : MethodNotFound\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不明白,为什么减法突然不起作用了?

\n

Tom*_*lak 5

该错误表示“从类型的对象中进行减法[Microsoft.ActiveDirectory.Management.ADPropertyValueCollection]是不可能的”

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

# fails the same way:
@() - 2
Run Code Online (Sandbox Code Playgroud)

就你而言,你做

(($something).count) - 2
Run Code Online (Sandbox Code Playgroud)

与实际情况无关$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'
Run Code Online (Sandbox Code Playgroud)

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

($something | Measure-Object).count - 2
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下,您可以直接使用 LDAP 查询来查询“禁用与否”,这比获取所有用户并使用“Where-Object”更有效:/sf/ask/3260253531/ -从 ldap 查找禁用用户 (2认同)