我想在我的 powershell 上实现缓存存储,以便在下一个 运行 时更快 运行

I want to implement a cache storage on my powershell for quicker runtime on next run

我是一名 Powershell 初学者和自学者。我终于制作了脚本以从 NestedGroup 获取 AD 用户。我现在想为他们创建一个缓存,以便在我第二次 运行 脚本时更快地获得结果。我完全迷失了自己在做什么,我想向这里的专业人士寻求一些方法。谢谢指导。

这是我的代码。

function Get-CachedGroupMembership($groupname){
    $groupName = "cached_$($groupName)"
    $cachedResults = Get-Variable -Scope Global -Name $groupName -ErrorAction SilentlyContinue
    if($null -ne $cachedResults){
     "found cached result"
     $existing = write-host "Check: i found existing"
     return $cachedResults,  $existing
    }
    else{
     $searching = write-host "Check: Searching"
     $results = get-adgroup $groupname -properties memberof, members
     Set-CachedGroupMembership -groupName $groupName -value $results
     
     return $searching
    }
 }

 Function Set-CachedGroupMembership($groupName,$value){
    Set-Variable -Scope Global -Name $groupName -Value $value
    return $value
}
  function Get-ADUsers_cached { 
    param ( 
        [Parameter(ValuefromPipeline = $true, mandatory = $true)][String] $GroupName
    ) 
    [int]$circular = $null

    # result holder
    $resultHolder = @()
        $table = $null 
        $nestedmembers = $null 
        $adgroupname = $null     

        # get members of the group and member of
        # $ADGroupname = get-adgroup $groupname -properties memberof, members
        $ADGroupname = Get-CachedGroupMembership -GroupName $groupName 

        # list all members as list (no headers) and save to var
        $memberof = $adgroupname | select -expand memberof 
       
        if ($adgroupname) {  
            if ($circular) { 
                $nestedMembers = Get-ADGroupMember -Identity $GroupName -recursive 
                $circular = $null 
            } 
            else { 
                $nestedMembers = Get-ADGroupMember -Identity $GroupName | sort objectclass -Descending
                # if get adgroupmember returns nothing, it uses the members for ordinary getADGroup
                if (!($nestedmembers)) {
                    $unknown = $ADGroupname |select -expand members
                    if ($unknown) {
                        $nestedmembers = @()
                        foreach ($member in $unknown) {
                            $nestedmembers += get-adobject $member
                        }
                    }
                }
            } 
            # loops through each member
            ForEach($nestedmember in $nestedmembers){ 
                # creates the properties into a custom object. 
                $Props = @{
                    Type            = $nestedmember.objectclass;
                    Name            = $nestedmember.name;
                    DisplayName     = "";
                    ParentGroup     = $ADgroupname.name;
                    Enabled         = "";
                    Nesting         = $nesting;
                    DN              = $nestedmember.distinguishedname;
                    Comment         = ""
                    EmployeeNumber  = "";
                    LastLogonDate   = "";
                    PasswordLastSet = "";
                } 
                # if member object is a user
                if ($nestedmember.objectclass -eq "user") { 
                    # saves all the properties in the table. 
                    $nestedADMember = get-aduser $nestedmember.Name -properties enabled, displayname, EmployeeNumber, LastLogonDate, PasswordLastSet
                    $table = new-object psobject -property $props 
                    $table.enabled = $nestedadmember.enabled
                    $table.name = $nestedadmember.samaccountname
                    $table.displayname = $nestedadmember.displayname
                    $table.EmployeeNumber = $nestedadmember.EmployeeNumber
                    $table.LastLogonDate = $nestedadmember.LastLogonDate
                    $table.PasswordLastSet = $nestedadmember.PasswordLastSet

                    #save all in 1 storage
                    $resultHOlder += $table | select type, name, displayname, parentgroup, nesting, enabled, dn, comment , EmployeeNumber, LastLogonDate, PasswordLastSet
                } 


                # if member object is group
                elseif ($nestedmember.objectclass -eq "group") {  
                    $table = new-object psobject -Property $props 
                    # if circular, meaning the groups member of list contains one of its members. 
                    # e.g. if group 2 is a member of group 1 and group 1 is a member of grou 2
                    if ($memberof -contains $nestedmember.distinguishedname) { 
                        $table.comment = "Circular membership" 
                        $circular = 1 
                    } 
                    # for circular output
                    #$table | select type, name, displayname, parentgroup, nesting, enabled, dn, comment 
                    #calling function itself
                    $resultHOlder += Get-ADUsers_cached -GroupName $nestedmember.distinguishedName                             
                } 
                else { 
                    if ($nestedmember) {
                        $table = new-object psobject -property $props
                        $resultHolder += $table | select type, name, displayname, parentgroup, nesting, enabled, dn, comment, EmployeeNumber, LastLogonDate, PasswordLastSet
                    }
                } 
            } 
        } 



    return   $resultHOlder 

}
function Get-NestedGroupUsers_cached {
    param ( 
        [Parameter(Mandatory = $true)][String]$FileName,
        [Parameter(Mandatory = $true)][String]$searchFileURL
    )
    $storageHolder = @()
    $groupList = Get-Content $searchFileURL 
    $groupList |  ForEach-Object { 
        $allusers = Get-ADUsers_cached -GroupName $_
        $storageHolder += $allusers  
       
    }
    $storageHolder | select ParentGroup, Name, EmployeeNumber, Enabled, LastLogonDate, PasswordLastSet  |Export-Csv -Path "C:\Users\***\Desktop$FileName.csv" -NoTypeInformation -Force
} 

您可以使用全局或模块范围的变量来存储信息。然后,在第二次执行时检查变量是否存在,如果存在,则从中提取。

例如,您对 AD 组的查询很适合缓存。

我会创建两个函数来简化此操作:


function Get-CachedGroupMembership($groupname){
   $groupName = "cached_$($groupName)"
   $cachedResults = Get-Variable -Scope Global -Name $groupName -ErrorAction SilentlyContinue
   if($null -ne $cachedResults){
    "found cached result"
    return $cachedResults
   }
   else{
    "need to cache"
    $results = get-adgroup $groupname -properties memberof, members
    Set-CachedGroupMembership -groupName $groupName -value $results
   }
}

然后为了缓存结果,我也会用这个函数。

Function Set-CachedGroupMembership($groupName,$value){
    Set-Variable -Scope Global -Name $groupName -Value $value
    return $value
}

最后,将对 $ADGroupname = get-adgroup $groupname -properties memberof, members 的调用替换为对 Get-CachedGroupMembership -GroupName $groupName 的调用。

如果您真的想保留缓存,您甚至可以将结果写出到 JSON 并修改这些函数以检索它们,但是您可能会遇到陈旧结果的问题。所以,你应该总是留下一种方法来强制更新缓存,例如你可以修改这些函数来添加一个 -Force 开关来更新你的缓存值。

稍加复制和粘贴,您也可以将这些函数修改为 Get-CachedADUser,并获得整个脚本缓存结果。