簡體   English   中英

PowerShell反復調用函數

[英]PowerShell Repeatedly calling a function

當前的任務是比較源文件夾和目標文件夾的權限,並比較所有子文件夾的權限。 我已經創建了在一個文件夾中執行此檢查的函數,該文件夾返回$True$False

我想知道是否有可能創建一個調用自身的函數,該函數將在找到的每個調用Test-ACLequalHC子文件夾上執行。 這樣,當由於權限問題或其他原因而阻止或錯誤出現在一個子文件夾中時,它仍然可以繼續處理其他子文件夾。

如果有的話,就像是爬蟲。 理想情況下,如果可以並行運行,那就太好了。 我讀到一個Workflow最適合此操作,但是我以前從未使用過它。

不幸的是,不可能只執行$AllSubFolders = Get-ChildItem -Recurse后跟foreach ,因為根文件夾下有成千上萬的文件和文件夾。 因此它必須是動態的,以便我們可以對找到的每個文件夾進行額外的處理,例如說如果Test-ACLequalHC在一個文件夾中導致$False ,我們仍然可以調用其他函數來設置正確的權限或將結果添加到CSV。

權限測試:

Function Test-ACLequalHC {
    [CmdletBinding(SupportsShouldProcess=$True)]
    Param(
        [parameter(Mandatory=$true,Position=0)]
        [ValidateScript({Test-Path $_})]
        [String]$Source,
        [parameter(Mandatory=$true,Position=1)]
        [ValidateScript({Test-Path $_})]
        [String]$Target,
        [parameter(Mandatory=$true,Position=2)]
        [ValidateSet('Access','Owner','All')]
        [String]$Type
    )
    Begin {
        $Props = Switch ($Type) {
            'Access' {'Access', 'AreAccessRulesProtected'}
            'Owner'  {'Owner'}
            'All'    {'sddl'}
        }
    }
    Process {
        $CompParams = @{
            Property         = $Props
            ReferenceObject  = Get-Acl $Source #| Sort-Object
            DifferenceObject = Get-Acl $Target #| Sort-Object
            PassThru         = $True
        }
        $Result = Compare-Object @CompParams 
        if ($Result -ne $null) {
            Write-Output $false
        }
        else {
            Write-Output $True
        }
    }
}

如果可以檢查文件是否繼承,並且不添加任何額外權限,那就太好了。 但是,如果我能找到使這種crawler深入文件夾結構的方式,我會在以后自己添加這些內容。

謝謝您的幫助。

好的,我認為您對Get-ChildItem -Recurse的厭惡是您需要克服的。 如果僅查看目錄,請使用-directory開關獲取Get-ChildItem。 這是提供商級別的開關,因此可以大大加快處理速度。

接下來,我認為您需要考慮的是Ad--Member cmdlet。 像這樣:

$Source = C:\GoodFolder
$AllFolders = GCI C:\ -Directory -Recurse
$AllFolders | ForEach{Add-Member -InputObject $_ -NotePropertyName "ACLGood" -NotePropertyValue (Test-ACLequalHC $source $_.fullname all)}

然后,您可以針對存在問題的文件夾進行篩選,並根據需要解決。

$AllFolders | Where{!$_.ACLGood} | ForEach{ Do stuff to fix it }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM