[英]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.