我有一个简单的菜单,可让您选择要对Active Directory中的用户执行的任务。我想要执行的任务之一是显示用户组成员身份。为此,我使用以下代码。我的问题是,在DO部分,显示组成员资格的选项3中,当您浏览菜单时输出似乎是空白的。如果我只运行该选项中的代码选择,它就可以正常工作。
function Show-Menu
{
param (
[string]$Title = 'My Menu'
)
Clear-Host
Write-Host "================ $Title ================"
Write-Host "1: Unlock User"
Write-Host "2: Disable User"
Write-Host "3: Show Groups"
Write-Host "Q: Press 'Q' to quit."
}
cls
#User Lookup
write-host 'First, lets look up the user you want to work with'
$user = Read-Host 'Enter the name of the user you want to search for!'
$w = "*"
$search = $w + $user + $w
Get-ADUser -F 'name -like $search' | FT SamAccountName -A
#User Selection
$target_user = Read-Host 'Which user do you want to work with?'
cls
do
{
Show-Menu
$selection = Read-Host "Please make a selection"
switch ($selection)
{
'1' {unlock-ADAccount -Identity $target_user}
'2' {Disabled-ADAccount -Identity $target_user}
'3' {Get-ADPrincipalGroupMembership $target_user | select name}
}
pause
}
until ($selection -eq 'q')
clear
答案 0 :(得分:0)
如果停止脚本,您将看到选项3的调用输出。
以下作品:
'3' {Get-ADPrincipalGroupMembership $target_user | select name | Out-Host }
或有点令人惊讶
'3' {Get-ADPrincipalGroupMembership $target_user | select name | ft }
问题是select-object写入stdout
和pause
写入控制台,这是两个不同且冲突的输出(如果stdout
转到控制台)。 GroupMembership cmdlet生成输出到stdout
,但Powershell缓冲stdout
,因为它已通过Show-Menu
检测到控制台的输出。可能它会首先显示几个KiB的直接模式控制台输出,然后通过stdout
写入向控制台显示间接输出。或者它将在脚本完成时显示stdout
缓冲输出,并将直接输出杀死到控制台缓冲区,并刷新stdout
次写入。
所以,这里的解决方案是直接写给Host
。当然,这样做的缺点是无法将stdout
流上的输出重定向到另一个脚本。