大型用户的PowerShell处理速度非常慢 - 有更好的方法吗?

时间:2017-01-10 08:11:27

标签: powershell office365 exchange-server export-to-csv

我一直在使用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>

2 个答案:

答案 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

另外,为什么每个人都如此迷恋子表达?在需要的地方使用它们。当它们不必要时,不要用它们混淆你的代码。