结合 Powershell cmdlet 问题
Combining Powershell cmdlets issue
我拼凑了一个脚本(抱歉记不起来源),return使用两个 cmdlet(获取用户和获取邮箱统计)的多个属性。如果我指定单个用户,代码会按预期工作,但是当对 return 所有用户使用通配符时,它仅 returns 来自 Get-user 的属性,我不知道为什么。
感谢任何解决此问题的帮助。
$outputCollection = @()
$users = Get-User -identity *
$mailboxes = Get-Mailboxstatistics -identity *
$users | Foreach-Object {
#Associate objects
$userObject = $_
$mailboxObject = $mailboxes
$emailObject = $mail
#Make a combined object
$outputObject = "" | Select FirstName,Lastname,sAMAccountName,windowsemailaddress,ItemCount,Totalitemsize,TotalDeletedItemSize,DatabaseName,ServerName,LastLogonTime,LastLogoffTime
$outputObject.FirstName = $userObject.FirstName
$outputObject.Lastname = $userObject.Lastname
$outputObject.sAMAccountName = $userObject.sAMAccountName
$outputObject.windowsemailaddress = $userObject.windowsemailaddress
$outputObject.itemcount = $mailboxObject.itemcount
$outputObject.Totalitemsize = $MailboxObject.Totalitemsize
$outputObject.TotalDeletedItemSize = $MailboxObject.TotalDeletedItemSize
$outputObject.DatabaseNAme = $mailboxObject.DatabaseName
$outputObject.ServerName = $mailboxObject.ServerName
$outputObject.lastlogontime = $mailboxObject.lastlogontime
$outputObject.lastlogofftime = $mailboxObject.lastlogofftime
#Add the object to the collection
$outputCollection += $outputObject
}
$outputCollection
为了帮助您理解,我尽量少改动。对于初学者,我会删除 $mailboxes = Get-Mailboxstatistics -identity *
行。然后,为了简单起见,更新下面的行
$mailboxObject = Get-Mailboxstatistics -identity $userObject.UserPrincipalName
您需要在每个循环过程中获取 一个 邮箱的统计信息。更改填充 $mailboxObject
的方式应该可以实现这一点,而无需更改任何其他内容。
您可以删除 $emailObject = $mail
,因为您似乎没有在任何地方使用它。
仅供参考,这没有经过测试,但应该可以。这也假设用户实际上有一个交换邮箱。如果不是,输出中将有空值。
关于效率
我想尝试让您更容易理解。但是请注意, 试图告诉您关于 not 运行 Get-Mailboxstatistics
的内容每次都是正确的。我的解决方案应该仍然有效。
基本问题是 $users
和 $mailboxes
之间没有相关性。
例如:为什么 $mailboxObject = $mailboxes
会自动选择正确的用户邮箱?答案是不会。它会 return $mailboxes
中的所有内容。所以 $mailboxObject.FirstName
没有任何意义,因为 $mailboxObject
是一个数组,就像 $mailboxes
一样。你可以说“$mailboxObject[0].FirstName”,但这不会正确关联。
您需要一个存在于两个对象中的关键字段,您可以使用 $mailboxObject = $mailboxes | Where-Object { $_.SomeKeyField = $userObject.SomeKeyField }
语句查找该字段。
或者,您可以等到 运行 Get-MailboxStatistics
直到进入循环,但这会显着增加 Exchange 系统的流量。
此外,请记住,以上所有假设每个 MailboxStatistic 都存在一个用户。如果不是这种情况,如果您希望所有结果都出现在结果中,您将不得不做更多的工作。
你可以试试这个!
正如 Bacon 所提到的,$users 或 $mailboxes 应该根据两者之间的关系进行过滤;就像一个外键。
**添加键值对时始终使用 Hash-Table,以便有更多操作选项和易于理解
# DECLARE HASHTABLE
$outputCollection = @{}
$users = Get-User -identity *
$mailboxes = Get-Mailboxstatistics -identity $userObject.UserPrincipalName
$users | Foreach-Object {
#Associate objects
$userCollection = $_
$mailboxCollection = $mailboxes | Where-Object { $_.SomeKeyField = $userCollection.SomeKeyField }
# ADD ELEMENTS TO HASH TABLE
# Add elements from userCollection
$outputCollection.add("FirstName",$userCollection.FirstName);
$outputCollection.add("Lastname",$userCollection.Lastname);
$outputCollection.add("sAMAccountName",$userCollection.sAMAccountName);
$outputCollection.add("windowsemailaddress",$userCollection.windowsemailaddress);
# Add elements from mailboxCollection
$outputCollection.add("itemcount",$mailboxCollection.itemcount);
$outputCollection.add("Totalitemsize",$mailboxCollection.Totalitemsize);
$outputCollection.add("TotalDeletedItemSize",$mailboxCollection.TotalDeletedItemSize);
$outputCollection.add("DatabaseNAme",$mailboxCollection.DatabaseNAme);
$outputCollection.add("ServerName",$mailboxCollection.ServerName);
$outputCollection.add("lastlogontime",$mailboxCollection.lastlogontime);
$outputCollection.add("lastlogofftime",$mailboxCollection.lastlogofftime);
}
$outputCollection
通过使用哈希 Table,您还可以为密钥使用不同的名称,示例您可以这样做,
outputCollection.add("Last Logoff Time",$mailboxCollection.lastlogofftime);
#Instead of
outputCollection.add("lastlogofftime",$mailboxCollection.lastlogofftime);
希望对您有所帮助!!
感谢大家的帮助。我终于设法使用以下代码对此进行了排序。
Get-MailboxServer | Get-Mailbox -resultsize 1 | foreach-object {$email = $_.primarysmtpaddress; $_ | Get-MailboxStatistics | Sort @{expression= "totalitemsize";descending=$true}}| select DisplayName, @{expression={$_.totalitemsize.value.ToMB()};label=”Size(MB)”}, @{expression={$_.TotalDeletedItemSize.value.ToMB()};label=”Deleted Size(MB)”}, ServerName, DatabaseName, itemcount, lastlogontime, lastloggedonuseraccount, @{Name="EmailAddress";expression={$email}}| Export-csv c:\Report.csv -notypeinformation
我拼凑了一个脚本(抱歉记不起来源),return使用两个 cmdlet(获取用户和获取邮箱统计)的多个属性。如果我指定单个用户,代码会按预期工作,但是当对 return 所有用户使用通配符时,它仅 returns 来自 Get-user 的属性,我不知道为什么。
感谢任何解决此问题的帮助。
$outputCollection = @()
$users = Get-User -identity *
$mailboxes = Get-Mailboxstatistics -identity *
$users | Foreach-Object {
#Associate objects
$userObject = $_
$mailboxObject = $mailboxes
$emailObject = $mail
#Make a combined object
$outputObject = "" | Select FirstName,Lastname,sAMAccountName,windowsemailaddress,ItemCount,Totalitemsize,TotalDeletedItemSize,DatabaseName,ServerName,LastLogonTime,LastLogoffTime
$outputObject.FirstName = $userObject.FirstName
$outputObject.Lastname = $userObject.Lastname
$outputObject.sAMAccountName = $userObject.sAMAccountName
$outputObject.windowsemailaddress = $userObject.windowsemailaddress
$outputObject.itemcount = $mailboxObject.itemcount
$outputObject.Totalitemsize = $MailboxObject.Totalitemsize
$outputObject.TotalDeletedItemSize = $MailboxObject.TotalDeletedItemSize
$outputObject.DatabaseNAme = $mailboxObject.DatabaseName
$outputObject.ServerName = $mailboxObject.ServerName
$outputObject.lastlogontime = $mailboxObject.lastlogontime
$outputObject.lastlogofftime = $mailboxObject.lastlogofftime
#Add the object to the collection
$outputCollection += $outputObject
}
$outputCollection
为了帮助您理解,我尽量少改动。对于初学者,我会删除 $mailboxes = Get-Mailboxstatistics -identity *
行。然后,为了简单起见,更新下面的行
$mailboxObject = Get-Mailboxstatistics -identity $userObject.UserPrincipalName
您需要在每个循环过程中获取 一个 邮箱的统计信息。更改填充 $mailboxObject
的方式应该可以实现这一点,而无需更改任何其他内容。
您可以删除 $emailObject = $mail
,因为您似乎没有在任何地方使用它。
仅供参考,这没有经过测试,但应该可以。这也假设用户实际上有一个交换邮箱。如果不是,输出中将有空值。
关于效率
我想尝试让您更容易理解。但是请注意,Get-Mailboxstatistics
的内容每次都是正确的。我的解决方案应该仍然有效。
基本问题是 $users
和 $mailboxes
之间没有相关性。
例如:为什么 $mailboxObject = $mailboxes
会自动选择正确的用户邮箱?答案是不会。它会 return $mailboxes
中的所有内容。所以 $mailboxObject.FirstName
没有任何意义,因为 $mailboxObject
是一个数组,就像 $mailboxes
一样。你可以说“$mailboxObject[0].FirstName”,但这不会正确关联。
您需要一个存在于两个对象中的关键字段,您可以使用 $mailboxObject = $mailboxes | Where-Object { $_.SomeKeyField = $userObject.SomeKeyField }
语句查找该字段。
或者,您可以等到 运行 Get-MailboxStatistics
直到进入循环,但这会显着增加 Exchange 系统的流量。
此外,请记住,以上所有假设每个 MailboxStatistic 都存在一个用户。如果不是这种情况,如果您希望所有结果都出现在结果中,您将不得不做更多的工作。
你可以试试这个!
正如 Bacon 所提到的,$users 或 $mailboxes 应该根据两者之间的关系进行过滤;就像一个外键。
**添加键值对时始终使用 Hash-Table,以便有更多操作选项和易于理解
# DECLARE HASHTABLE
$outputCollection = @{}
$users = Get-User -identity *
$mailboxes = Get-Mailboxstatistics -identity $userObject.UserPrincipalName
$users | Foreach-Object {
#Associate objects
$userCollection = $_
$mailboxCollection = $mailboxes | Where-Object { $_.SomeKeyField = $userCollection.SomeKeyField }
# ADD ELEMENTS TO HASH TABLE
# Add elements from userCollection
$outputCollection.add("FirstName",$userCollection.FirstName);
$outputCollection.add("Lastname",$userCollection.Lastname);
$outputCollection.add("sAMAccountName",$userCollection.sAMAccountName);
$outputCollection.add("windowsemailaddress",$userCollection.windowsemailaddress);
# Add elements from mailboxCollection
$outputCollection.add("itemcount",$mailboxCollection.itemcount);
$outputCollection.add("Totalitemsize",$mailboxCollection.Totalitemsize);
$outputCollection.add("TotalDeletedItemSize",$mailboxCollection.TotalDeletedItemSize);
$outputCollection.add("DatabaseNAme",$mailboxCollection.DatabaseNAme);
$outputCollection.add("ServerName",$mailboxCollection.ServerName);
$outputCollection.add("lastlogontime",$mailboxCollection.lastlogontime);
$outputCollection.add("lastlogofftime",$mailboxCollection.lastlogofftime);
}
$outputCollection
通过使用哈希 Table,您还可以为密钥使用不同的名称,示例您可以这样做,
outputCollection.add("Last Logoff Time",$mailboxCollection.lastlogofftime);
#Instead of
outputCollection.add("lastlogofftime",$mailboxCollection.lastlogofftime);
希望对您有所帮助!!
感谢大家的帮助。我终于设法使用以下代码对此进行了排序。
Get-MailboxServer | Get-Mailbox -resultsize 1 | foreach-object {$email = $_.primarysmtpaddress; $_ | Get-MailboxStatistics | Sort @{expression= "totalitemsize";descending=$true}}| select DisplayName, @{expression={$_.totalitemsize.value.ToMB()};label=”Size(MB)”}, @{expression={$_.TotalDeletedItemSize.value.ToMB()};label=”Deleted Size(MB)”}, ServerName, DatabaseName, itemcount, lastlogontime, lastloggedonuseraccount, @{Name="EmailAddress";expression={$email}}| Export-csv c:\Report.csv -notypeinformation