【问题标题】:How to get a PowerShell do-while loop to print on the first iteration before looping [duplicate]如何在循环之前的第一次迭代中打印 PowerShell do-while 循环 [重复]
【发布时间】:2019-09-14 00:29:39
【问题描述】:

问题:

我的问题是我有一个非常简单的do..while 循环。但是,它不会在第一次迭代时打印Get-ADPrincipalGroupMembership 查询的输出。例如,我运行脚本并输入用户名,然后单击 Enter。它不是打印成员资格的预期结果,而是循环并再次询问用户名,而不打印第一个输入的用户名的结果。一旦我在循环中第二次输入用户名并单击输入,它就会打印第一个输入的结果和第二个输入的结果。在第二次迭代之后的任何时候,脚本都可以正常工作,并且在我提供输入后实际上可以正确打印结果。以下是有问题的脚本。

预期结果:

下面的代码只是要求用户输入用户名,然后在 AD 中运行查询以列出给定用户的成员资格。在提供用户的成员资格后,脚本应该请求另一个用户并重复该过程,直到用户输入“exit”并且脚本退出。

代码片段:

do {
    $user = Read-Host -Prompt 'Enter the username of the user';
    Get-ADPrincipalGroupMembership $user | select name;
} while ($user -ne 'exit');

Stop-Process -Id $PID;

【问题讨论】:

  • 您在每行末尾添加的; 终止符是多余的。

标签: powershell


【解决方案1】:

刚从另一个论坛得到答案。最简单的解决方案是在“| select name”之后简单地添加“| Out-String”。更新后的示例如下。

do {
$user = Read-Host -Prompt 'Enter the username of the user' 
Get-ADPrincipalGroupMembership $user | select name | Out-String
} while ($user -ne 'exit')

stop-process -id $PID

【讨论】:

  • 您的回答是有效的,但值得解释为什么这种解决方法是必要的 - 请参阅linked post。简而言之:... | select name 显示 异步 显示行为;到Out-String 的管道强制同步显示。
【解决方案2】:

属性名称是字符串类型的对象:

name              Property              System.String name {get;}

所以你可以简化一下:

do {
    $user = Read-Host -Prompt 'Enter the username of the user' 
    (Get-ADPrincipalGroupMembership -Identity $user).name
} while ($user -ne 'exit')

stop-process -id $PID

最好的问候, 伊万

【讨论】:

  • 虽然这也意外绕过了 OP 的问题,但问题不在于 what (输出格式),而在于 when (输出发生的事实异步并且没有按预期出现) - 请参阅the linked post
猜你喜欢
  • 2020-04-26
  • 1970-01-01
  • 2016-06-19
  • 2016-12-21
  • 2014-10-02
  • 1970-01-01
  • 2018-05-14
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多