Powershell invoke-expression不适用于过滤器开关

时间:2019-05-24 17:46:35

标签: powershell

我正在尝试编写一个程序,使用户可以在Active Directory上执行各种查询。我想以一种方式让他们选择要在输出中显示的属性,并以几种方式过滤输出。 正如我在编写代码时不知道它们将选择多少个属性一样,这似乎是从属性列表中生成字符串并使用invoke-expression调用字符串的最简单方法。这种方式与属性完美搭配,但与过滤器完全搭配。

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

此:

<div class="panel panel-default">
  <div class="panel-heading">
        <h3 class="panel-title">Repos</h3>
  </div>
  <div class="panel-body" *ngFor="let repo of repos">
        <p class="clearfix">
            <span class="repo-title">{{repo.name}}</span>
            <a href="{{repo.html_url}}" class="btn btn-sm btn-warning pull-right" 
               target="_blank">Veja este projeto no Github</a>
        </p>
       <p>{{repo.description}}</p>
       <p><img class="star" src="../../../assets/img/star.png" alt="">{{repo.stargazers_count}}</p>
  </div>
</div>

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

$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

为什么从字符串中调用其他命令却不能正常工作呢?还有其他方法可以过滤结果吗?首先,我想坚持在查询之前进行过滤,而不是在where子句中使用,但是如果过滤不起作用,我也将尝试这样做。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我有类似的情况,但是我的是特定于$true $false的{​​{1}}参数,如果$true不存在,则$false输入[switch]。我从不需要重写默认参数,因为这些参数最初是用于从命令行进行一次性使用/手动调用的。

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

[params]

当在.ps1文件中调用时,这将不起作用:

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

post(正上方)具有解决方案,后退标记

`

这在命令控制台和.ps1内部均有效:

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

PS:比实际答案花费更多的时间来弄清楚如何逃避此处的滴答声。

相关问题