【问题标题】:Powershell invoke-expression doesn't work with filter switchPowershell 调用表达式不适用于过滤器开关
【发布时间】:2020-11-30 23:03:36
【问题描述】:

我正在尝试编写一个程序,让用户在 Active Directory 上执行不同类型的查询。我想以一种让他们选择要在输出中显示的属性的方式来制作它,并以多种方式过滤输出。 由于我在编写代码期间不知道他们会选择多少个属性,这似乎是从属性列表中生成一个字符串并使用 invoke-expression 调用该字符串的最简单方法。这种方式与属性完美结合,但完全不适用于过滤器。

我发现了几种过滤器语法,但是当我将它们放在一个字符串中并尝试使用“Invoke-expression”调用它时,它们都不起作用

这个:

$time = (Get-Date).Adddays(-(19))
Get-ADUser -Filter {LastLogonTimeStamp -gt $time} -SearchBase 'CN=Users,DC=home,DC=local' -Properties samAccountname, LastLogonDate | Select-Object @{n='Felhasználónév'; e='samAccountName'}, @{n='Utolsó bejelentkezés'; e='LastLogonDate'} | Out-String

给我想要的结果。 虽然这样:

$time = (Get-Date).Adddays(-(19))
$out = "Get-ADUser -Filter {LastLogonTimeStamp -gt $time} -SearchBase 'CN=Users,DC=home,DC=local' -Properties samAccountname, LastLogonDate | Select-Object @{n='Felhasználónév'; e='samAccountName'}, @{n='Utolsó bejelentkezés'; e='LastLogonDate'} | Out-String"

Write-Host $out
Invoke-Expression $out

给我以下结果:

Get-ADUser -Filter {LastLogonTimeStamp -gt 05/05/2019 19:05:46} -SearchBase 'OU=Testing,DC=home,DC=local' -Properties samAccountname, LastLogonDate | Select-Object @{n='Username'; e='samAccountName'}, @{n='Last Logon'; e='LastLogonDat
e'}
Get-ADUser : Error parsing query: 'LastLogonTimeStamp -gt 05/05/2019 19:05:46' Error Message: 'Operator Not supported: ' at 
position: '26'.
At line:1 char:1
+ Get-ADUser -Filter {LastLogonTimeStamp -gt 05/05/2019 19:05:46} -Sear ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ParserError: (:) [Get-ADUser], ADFilterParsingException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingException,Microsoft 
   .ActiveDirectory.Management.Commands.GetADUser

为什么在从字符串调用它们时,所有其他命令都能完美运行,而这个却不行?有没有其他方法可以过滤结果?一开始我想在查询之前坚持过滤,而不是使用 where 子句,但如果过滤不起作用,我也会尝试。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    回答我自己的问题感觉很愚蠢,但我想我找到了答案。 在变量之前放置转义字符就可以了。

    $time = (Get-Date).Adddays(-(19))
    $out = "Get-ADUser -Filter {lastlogontimestamp -gt `$time} -SearchBase 'CN=Users,DC=home,DC=local' -Properties samAccountname, LastLogonDate | Select-Object @{n='Felhasználónév'; e='samAccountName'}, @{n='Utolsó bejelentkezés'; e='LastLogonDate'} | Out-String"
    
    Write-Host $out
    $expr = Invoke-Expression $out
    $expr
    

    返回

    Felhasználónév Utolsó bejelentkezés  
    -------------- --------------------  
    Administrator  2019. 05. 24. 18:18:28
    

    【讨论】:

      【解决方案2】:

      我也遇到过类似的情况,但我的特定于$true $false 参数,如果存在$true,如果[switch] 不存在$false,则输入[params]。我从来不需要覆盖默认参数,因为它们最初是用于从命令行进行一次性/手动调用的。

      Invoke-Expression 将调用 .ps1 文件简化为子例程,但这将直接从命令行控制台工作

      \temp\00405-LoadW.ps1 -skipinit -showbanner:$false | Out-File -filepath 'c:\temp\today\00405-LoadW.log'

      虽然这在 .ps1 文件中调用时不起作用:

      Invoke-Expression "\temp\00405-LoadW.ps1 -skipinit -showbanner:$false | Out-File -filepath 'c:\temp\today\00405-LoadW.log'"

      这个post(正上方)有解决方案,back-tick

      `

      这既适用于命令控制台,也适用于 .ps1 内部:

      Invoke-Expression "\temp\00405-LoadW.ps1 -skipinit -showbanner:`$false | Out-File -filepath 'c:\temp\today\00405-LoadW.log'"

      PS:这里花费的时间比实际答案更多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 2022-08-18
        • 2021-10-05
        • 2011-12-17
        • 2013-05-01
        • 2016-04-22
        相关资源
        最近更新 更多