我在 PowerShell 脚本中偶然发现了一个奇怪的错误,该脚本为我返回特定 OU(和子 OU)中 Active Directory 中的计算机,这些计算机在特定日期内启用并登录。
以下代码段确实有效:
$date = (get-date).AddDays(-100)
Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt $date)} -Properties lastLogonTimestamp -SearchBase "CN=Computers,DC=some,DC=domain,DC=com"
...但是我最初尝试这样做是一行:
Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt $((get-date).AddDays(-100)))} -Properties lastLogonTimestamp -SearchBase "CN=Computers,DC=some,DC=domain,DC=com"
...但我反复收到以下错误(这让我尝试了上面的两行示例):
Get-ADComputer : Cannot process argument because the value of argument "path" is not valid. Change the value of the "path" argument and run the operation again.
At line:1 char:1
+ Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt $((ge ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-ADComputer], PSArgumentException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.Management.Automation.PSArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
我已经在 Windows 8 和 Windows Server 2008 R2 上运行了该脚本 - 两者都使用 PowerShell v3。我假设两个操作系统上的 RSAT 工具安装的 Active Directory 模块的版本也可能略有不同。
数据方面,我已经得到了我需要的东西,但我很难理解为什么单线器不起作用。Get-Date 或 Get-AdComputer cmdlet 都不需要参数“path”,但作为尝试,我还确保我的工作目录是 C:。
我很感兴趣是否有人能够提供一些关于为什么会这样的见解 - 我之前在非 ActiveDirectory 模块 cmdlet 中使用过这种类型的语法,所以我倾向于假设因为查询在“过滤器”参数可能会错误地传递给 Get-AdComputer cmdlet 本身(这是我们所有人都必须忍受的东西)。