如何让PowerShell do while循环在循环之前的第一次迭代中打印

如何让PowerShell do while循环在循环之前的第一次迭代中打印,powershell,Powershell,问题: 我的问题是我有一个非常简单的do..while循环。但是,它不会在第一次迭代时打印Get ADPrincipalGroupMembership查询的输出。例如,我运行脚本并输入用户名,然后单击enter。与我期望的结果(打印成员资格)不同,它循环并再次请求用户名,而不打印第一个输入用户名的结果。在循环中第二次输入用户名并单击enter后,它将打印第一次输入的结果和第二次输入的结果。在第二次迭代之后的任何时候,脚本都可以正常工作,并在我提供输入后正确打印结果。下面是讨论中的脚本 预期结果:

问题:

我的问题是我有一个非常简单的
do..while
循环。但是,它不会在第一次迭代时打印
Get ADPrincipalGroupMembership
查询的输出。例如,我运行脚本并输入用户名,然后单击enter。与我期望的结果(打印成员资格)不同,它循环并再次请求用户名,而不打印第一个输入用户名的结果。在循环中第二次输入用户名并单击enter后,它将打印第一次输入的结果和第二次输入的结果。在第二次迭代之后的任何时候,脚本都可以正常工作,并在我提供输入后正确打印结果。下面是讨论中的脚本

预期结果:

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

代码段:

do{
$user=读取主机-提示“输入用户的用户名”;
获取ADPrincipalGroupMembership$user |选择名称;
}while($user-ne‘exit’);
停止进程-Id$PID;

刚从另一个论坛得到答案。最简单的解决方案是在“|选择名称”之后添加“| 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

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

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的问题,但问题不在于什么(输出的格式),而在于何时(事实上输出是异步发生的,并且在预期时没有出现)-请参阅。