PowerShell模块参数无法通过管道传输ADUser数组

cvxl0en2  于 2023-01-13  发布在  Shell
关注(0)|答案(2)|浏览(80)

我有以下情况:我试图创建一个PS模块,以将ADUser导出到Excel文件(作为.xlsx文件),作为自己的函数。当我将Get-ADUser命令通过管道传输到我的参数时,我没有获得所有用户,我只获得最后一个用户。我已将inputvariable声明为ADAcount对象和数组。
这里是我的代码在额外的短格式:

Function Export-Excel
{
   [cmdletBinding()]
   param(
       [parameter(ValueFromPipeline)]
       [Microsoft.ActiveDirectory.Management.ADAcount[]] $Users  

   )

   Write-Host $Users.count



...........

}

当我现在通过powershell调用这个函数时,它看起来像:

Get-ADUser -Filter * -Properties * | Export-Excel

# Output: 1
# And this one is an ADUser Object, the last created one / the last one in the array...

# When i do this:
$user = Get-ADUser -Filter * -Properties *
Write-Host $user.count

# Output: 2500

希望你能理解我的问题:)
非常感谢,祝你圣诞快乐:)

hl0ma9xz

hl0ma9xz1#

如果要通过管道传输所有用户对象、导入并处理总计(用于报告),则需要使用BeginProcessEnd关键字,如get-help about_functions中所述,例如:

Function Export-Excel {
    [cmdletBinding()]
    param(
        [parameter(ValueFromPipeline)]
        [Microsoft.ActiveDirectory.Management.ADUser[]]$Users
    )
    begin {
        $usersArray = @()
    }
    process {
        foreach ($user in $Users) {
            $usersArray += $user
        }
    }
    end {
        Write-Host $usersArray.count
    }
   
}

Get-ADUser -Filter * -Properties * | Export-Excel
ltskdhd1

ltskdhd12#

我做了点调查,发现:Powershell Array parameter from pipline
然后我修改了你的剧本,一点点,因为我没有广告:

Function EE
{
   [cmdletBinding()]
   param(
       [parameter(Mandatory=$true, ValueFromPipeline=$true)]
       #[Microsoft.ActiveDirectory.Management.ADAcount[]] $Users  
       [string[]]$Users   
   )

   process {
       write-Host $Users
   }

}

Get-LocalUser | EE

解释是:对于管道中的每个项目,“进程”块运行一次。
这将为我提供所有本地用户的列表。

相关问题