我制作了一个脚本来分析我每天处理的广告。
过去几个月来它一直运行良好,没有错误,但是今天早上出现了,我不知道为什么。
在执行过程中:
$adm_disabled = ((Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_.enabled -ne $true}).count) - 2
Write-Host "ADMIN ACCOUNTS DISABLED : "$adm_disabled
然后出现以下错误(我以前从未遇到过,它是法语btw):
É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
我不明白,为什么减法突然不起作用?
答案 0 :(得分:3)
错误表明“不可能从类型[Microsoft.ActiveDirectory.Management.ADPropertyValueCollection]
的对象中减去” 。
当您尝试对不支持算术的事物进行算术运算时,总是会发生此类错误:
# fails the same way:
@() - 2
以您的情况为例
(($something).count) - 2
独立于$something
是什么,您的期望是.Count
将是这些事物的计数,因此是一个数字。
但是,如果$something
偶然具有名为Count
的 own 属性,会发生什么?然后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
答案 1 :(得分:1)
忘记我的先前回复。我想我找到了根本原因。
我限制了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
只需添加一个@符号,表明我正在处理数组,它又可以工作了。
$adm_disabled = @(Get-ADUser -LDAPFilter "(admincount=1)" | Where {$_.Enabled -ne $true}).Count - 2