【问题标题】:Exporting info from PS script to csv将信息从 PS 脚本导出到 csv
【发布时间】:2011-01-28 23:22:56
【问题描述】:

这是一个 powershell/AD/Exchange 问题......

我正在针对多个用户运行一个脚本来检查他们的一些属性,但是我无法将其输出到 CSV。该脚本运行良好,完全符合我的需要,屏幕上的输出很好,我只是无法将其直接导出到 csv。

输入是一个逗号分隔的用户名txt文件(例如“username1,username2,username3”)

我已经尝试过创建自定义 ps 对象,添加到它们然后导出它们,但它不起作用....

任何建议都非常感谢..

谢谢

乔治

$array = Get-Content $InputPath

#split the comma delimited string into an array
$arrayb = $array.Split(",");

foreach ($User in $arrayb)
{
    #find group memebership
    Write-Host "AD group membership for $User"
    Get-QADMemberOf $User

    #Get Mailbox Info
    Write-Host "Mailbox info for $User"
    Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress

    #get profile details
    Write-Host "Home drive info for $User"
    Get-QADUser $User| select HomeDirectory,HomeDrive

    #add space between users
    Write-Host ""
    Write-Host "******************************************************"


}

Write-Host "End Script"

已编辑.... 我尝试过的方法(仅显示 for 循环/导出代码) 方法1

$AllData = @()  

foreach ($User in $arrayb)
{
    #set title for this user
    #Write-host "Details for $User"

    #find out their group memebership
    Write-Host "AD group membership for $User"
    $AdMemberOf = Get-QADMemberOf $User 
    Write-Host "ad completed"
    Write-Host ""
    Write-Host ""


    #Get Mailbox Info
    Write-Host "Mailbox info for $User"
    $ExInfo = Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress
    Write-Host "ex completed"
    Write-Host ""
    Write-Host ""


    #get profile details
    Write-Host "Home drive info for $User"
    $HomeInfo = Get-QADUser $User| select HomeDirectory,HomeDrive
    Write-Host "home drive completed"

    #add space between users
    Write-Host ""
    Write-Host "******************************************************"


    $ReturnedObj = New-Object PSObject
    $ReturnedObj | Add-Member NoteProperty -Name "AD Group Membership for $User" -Value $AdMemberOf
    $ReturnedObj | Add-Member NoteProperty -Name "Exchange details for $User" -Value $ExInfo
    $ReturnedObj | Add-Member NoteProperty -Name "Home drive info for $User" -Value $HomeInfo


    Write-Host $ReturnedObj

    $AllData += $ReturnedObj


}
Write-Host "starting csv export"
Write-Output $AllData |export-csv -Path $OutputPath -notype -force
Write-Host "End Script"

方法二

$ExportInfo = @()


foreach ($User in $arrayb)
{
    $UserInfo = New-Object System.Object

    #set title for this user
    $ExportInfo += "Details for $User"

    #Get Mailbox Info
    $ExportInfo += Get-Mailbox $User

    #find out their group memebership
    $ExportInfo += Get-QADMemberOf $User 

    #get profile details
    $ExportInfo += Get-QADUser $User| select HomeDirectory,HomeDrive

    #add space between users
    $ExportInfo += ""
    $ExportInfo += ""   


}

$ExportInfo | Export-Csv -Path $OutputPath ;

已编辑:

感谢 Stej 的建议,我现在有了下面的代码......仍然无法正常工作。我添加了一个检查以确认用户也存在于 AD 中。第一个问题是获取用户 AD 组成员身份 - 如果我设置一个断点并查看特定用户 AD 成员身份的值,变量中的值是错误“无法处理参数,因为参数“obj”的值是空。将参数“obj”的值更改为非空值。不知道是什么原因造成的,所以我暂时忽略了它,并为 AD 成员注释了这些行,以便专注于让其余的工作。

注释掉这些行后,脚本再次运行良好,底部有一个断点,我可以查看 $ExportInfo 的值,它们看起来都很好,即它们都已正确保存到变量中。但是,它不会输出。如您所见,我输入了一个命令以将 $ExportInfo 写入屏幕,但没有显示任何内容。当它尝试执行导出行(即“Export-Csv $ExportInfo -Path $OutputPath”)时,它会出错: “无法将'System.Object []'转换为参数'Delimiter'所需的类型'System.Char'。不支持指定的方法。 在 :line:80 字符:10 + 导出-Csv

我将该行更改为“$ExportInfo | Export-Csv -Path $OutputPath”,现在它导出为 CSV...不知道为什么?但是有两个问题......如上所述,AD 组不起作用,并且字段电子邮件地址(应该返回类似 { SMTP:j.smith@domain.com, smtp: j.smith@domain.com.au, smtp: smithj@exchange.domain.com.au 和 SIP:j.smith@domain.com.au})只是在 CSV 中显示为“Microsoft.Exchange.Data.ProxyAddressCollection”。再次检查 $ExportInfo,地址就在那里....

谢谢

$ExportInfo = @()

foreach ($User in $arrayb)
{
    $CheckUser = Get-QADUser -Name $User

    if (!$CheckUser)
    {
        $CountUser++
        Write-Warning "############################################"
        Write-Warning "$user not found in AD"
        Write-Warning "############################################"
    }
    else
    {
        $CountUser++

        $UserInfo = New-Object System.Object



        #find out their group memebership
        Write-Host "AD group membership for $User"
        #$Temp = Get-QADMemberOf $User 
        #$UserInfo | Add-Member NoteProperty -Name "AD Group Membership" -Value $Temp.Name

        #set title for this user
        #Write-host "Details for $User"

        #Get Mailbox Info
        Write-Host "Mailbox info for $User"
        $Temp = Get-Mailbox $User #| select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress
        $UserInfo | Add-Member NoteProperty -Name "ServerName" -Value $Temp.ServerName
        $UserInfo | Add-Member NoteProperty -Name "Database" -Value $Temp.Database
        $UserInfo | Add-Member NoteProperty -Name "Email Addresses" -Value $Temp.EmailAddresses
        $UserInfo | Add-Member NoteProperty -Name "Primary SMTP" -Value $Temp.PrimarySmtpAddress
        $UserInfo | Add-Member NoteProperty -Name "Windows Email Address" -Value $Temp.WindowsEmailAddress
        #$ReturnedObj | Add-Member NoteProperty -Name





        #get profile details
        Write-Host "Home drive info for $User"
        $Temp = Get-QADUser $User #| select HomeDirectory,HomeDrive
        $UserInfo | Add-Member NoteProperty -Name "Home Directory Location" -Value $Temp.HomeDirectory
        $UserInfo | Add-Member NoteProperty -Name "Home Drive Mapped To" -Value $Temp.HomeDrive

        #add space between users
        Write-Host ""
        Write-Host "******************************************************"

        $ExportInfo += $UserInfo
    }#end else

}
Write-Host "blah"
Write-Host $ExportInfo
Export-Csv $ExportInfo -Path - $OutputPath

Write-Host "Number of Users processed: $CountUser"

【问题讨论】:

  • 不起作用遇到麻烦是什么意思?有任何错误信息吗?文件是空的吗?你能分享你用于 csv 导出的代码吗?

标签: powershell csv loops export for-loop


【解决方案1】:

有任何错误信息吗? $error[0] 有什么东西吗? 不工作是什么意思?


编辑: 在您的第二种方法中,您创建 $UserInfo 对象,但您不使用它。我猜它打算添加到$ExportInfo。取而代之的是,您将裸字符串添加到 $ExportInfo,这就是为什么您在 csv 文件中提供了如此奇怪的内容。

应该如何正确完成:

$UserInfo = New-Object System.Object

$ReturnedObj | Add-Member NoteProperty -Name "User Name" -Value $user.Name
$ReturnedObj | Add-Member NoteProperty -Name "User otherValue" -Value $user.othValue

#Get Mailbox Info
$mailBox = Get-Mailbox $User
$ReturnedObj | Add-Member NoteProperty -Name "User Mail box size" -Value $mailBox.Size
$ReturnedObj | Add-Member NoteProperty -Name "User Mail box -count of messages" -Value $user.countOfMessages

... # and so on
$ExportInfo  += $ReturnedObj

请注意,您要导出到 csv 的对象必须具有字符串、整数、布尔值等类型的属性。而不是像 $UserGet-Mailbox $User 返回的对象那样的组合对象。 csv 中的值必须是原始的。就是这个原因。

这适用于您添加值为$AdMemberOf 的NoteProperty 的第一个示例。那是无法导出到 csv 的对象本身。您必须为$AdMemberOf 的每个有趣属性创建一堆属性。

【讨论】:

  • 我的错误,第二个方法现在更正了......非常基本的错误,但不幸的是,这只是因为我一直在摆弄代码。上述两个输出都是:#TYPE System.String长度 8 这是导出的 csv 中的单元格 A1、2、3。
【解决方案2】:

原来我需要使用一些 foreach 循环来获取我需要的信息......所以:

foreach($user in $array)
{
$temp = Get-QADUser -Name $User

if (!$temp)
{
    $log += "????????????????" + "`n"
    $log += "$user not found in AD" + "`n"
    $log += "????????????????" + "`n"
}
else
{
    #find out their group memebership
    $log += "AD group membership for $User" + "`n"
    $temp = Get-QADMemberOf $User 

    foreach ($drive in $temp)
    {
        $temp2 = $drive
        $temp2 = $temp2.Substring(6)
        $log += "`t" + $drive + "`n"
}#end foreach for drive loop

$temp = Get-Mailbox $User

if ($temp.RecipientType -like "UserMailbox")
{
    $log += "Mailbox info for $User" + "`n"
    #$log += Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress
    $log += "Email Server: " + $temp.ServerName + "`n"
    $log += "Email Database: " + $temp.Database + "`n"
    $log += "Primary SMTP: " + $temp.PrimarySmtpAddress + "`n"
    $log += "Windows Email Address: "+ $temp.WindowsEmailAddress + "`n"
    #$log += "`n"

    foreach ($e in $temp.EmailAddresses)
    {
        $log += "`t" + "Email Addresses: " + $e + "`n"
    }

}
else
{
    $log += "########" + "`n"
    $log += "$User is not a MailboxUser, IE no Exchange Mailbox" + "`n"
    $log += "########" + "`n"
}


$log += "Home drive info for $User" + "`n"
$temp = Get-QADUser $User| select HomeDirectory,HomeDrive
$log += "Home Directory: " + $temp.HomeDirectory + "`n"
$log += "Home Drive Letter: " + $temp.HomeDrive + "`n"

$tempvar = [string] $temp.HomeDirectory

if ($tempvar -eq "")
{
    $noHomedirectory += $User + "`n"
    $countNoHOmeDirectory ++
}
}#end of the main if/else to determine if the AD account exists

$OutputPath = "C:\SomeFolder\"+"User_Report_"+([datetime]::Now).tostring("yyyyMMddhhmmss")+".txt"

$log | Out-File -FilePath $OutputPath

然后我将所有特定日志(例如 $noHomeDirectory 等)转储到电子邮件正文中,附上上面导出的完整日志并将其发送给我自己。

感谢以上大家的建议,抱歉回复迟了……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 2017-01-02
    • 2021-01-04
    • 2019-11-11
    • 2016-02-11
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多