PowerShell反复调用函数

时间:2014-10-24 11:50:34

标签: function powershell workflow

手头的任务是将源文件夹中的权限与目标文件夹进行比较,并将其与所有子文件夹进行比较。我已经创建了对一个文件夹执行此检查的函数,该文件夹返回$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东西,我会在以后添加这些内容。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

好吧,我认为你厌恶做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 }