我一直在使用Office365许可证跟踪。实际上它看起来不错,但是完成这个过程需要太多时间。大部分时间都花在Get-MsolUser上,可以改进并行计算它们(同时处理用户1你已经获取用户2的数据等等......)顺便说一下,我们有大约3000+用户如何改进剧本的速度?
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="item" match="Item" use="@key" />
<xsl:template match="/Orders">
<!-- first pass -->
<xsl:variable name="first-pass">
<xsl:for-each select="Order">
<Order>
<xsl:copy-of select="Reference"/>
<xsl:for-each select="Item">
<Item key="{concat(../Reference, '|', ID)}" extPrice="{Quantity * UnitPrice}">
<xsl:copy-of select="*"/>
</Item>
</xsl:for-each>
</Order>
</xsl:for-each>
</xsl:variable>
<!-- output -->
<SAPOrders>
<xsl:for-each select="exsl:node-set($first-pass)/Order">
<xsl:copy>
<xsl:copy-of select="Reference"/>
<!-- for each unique item in this order -->
<xsl:for-each select="Item[count(. | key('item', @key)[1]) = 1]">
<!-- list the items in this group -->
<xsl:for-each select="key('item', @key)">
<Item>
<xsl:copy-of select="Quantity | UnitPrice"/>
<!-- add the subtotal of this group -->
<xsl:if test="position()=last()">
<Total>
<xsl:value-of select="sum(key('item', @key)/@extPrice)" />
</Total>
</xsl:if>
</Item>
</xsl:for-each>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</SAPOrders>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
在Powershell中为您提供并行性。
我希望您完成PS工作流程。
我们有 -parallel ,可以帮助您并行通话。
除此之外,我们还有一个 Invoke-Parallel
的功能这是它的链接:Invoke-Parallel Function
注意:函数本身内部提到了示例。编译后,您也可以使用该函数的get-help。
答案 1 :(得分:0)
使用管道,尽早过滤,并避免附加到数组应该已经大大加快了速度:
Get-MsolUser -All | Where-Object {
$_.IsLicensed
} | ForEach-Object {
$upn = $_.UserPrincipalName
Get-ADUser -Filter "UserPrincipalName -eq '$upn'" -Properties whenCreated, Enabled, lastlogondate
} | Where-Object {
$_.Enabled
} | ForEach-Object {
$O365Stats = Get-MailboxStatistics $_.DisplayName -ErrorAction SilentlyContinue
$O365Smtp = Get-Recipient $_.DisplayName -ErrorAction SilentlyContinue
if ($O365Stats -and $O365Smtp) {
New-Object -Type PSObject -Property @{
'CollectDate' = Get-Date
'ADUserUPN' = $_.UserPrincipalName
'O365UserUPN' = $_.UserPrincipalName
'ADUserCreated' = $_.whenCreated
'ADUserEnabled' = $_.Enabled
'ADLastLogonDate' = $_.LastLogonDate
'O365Licensed' = $true
'O365LastLogonTime' = $O365Stats.LastLogonTime
'O365SMTPAddress' = $O365Smtp.PrimarySMTPAddress
}
}
} | Sort-Object -Property ADUserCreated | Export-Csv -Path $OutputFile -NoType
另外,为什么每个人都如此迷恋子表达?在需要的地方使用它们。当它们不必要时,不要用它们混淆你的代码。