我正在尝试编写一个程序,使用户可以在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子句中使用,但是如果过滤不起作用,我也将尝试这样做。
答案 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:比实际答案花费更多的时间来弄清楚如何逃避此处的滴答声。