PowerShell脚本需要数天才能完成

时间:2016-03-18 12:39:06

标签: powershell

以下脚本运行良好,但需要几天才能完成。有没有人有任何调整或提示来缩短执行时间?

共享目录Images \ Equipment包含超过5500个文件夹,每天都在增长。

# If the Admin folder for Equipment Images does not exist, make a new one and set the correct permissions.
$Location = "E:\Images\Equipment\*\"
$file = "E:\Images\Equipment\*\Admin"
foreach ($_ in (Get-ChildItem E:\Images\Equipment\*\)){if(($_.PSIsContainer -AND $_.name -eq "Admin")-eq $false)    
   {
        New-Item -Path $location -Name "Admin" -ItemType directory
        $errorActionPreference = "continue"}}
$folder = "E:\Images\Equipment\*\Admin"
Get-ChildItem E:\Images\Equipment\ -Directory -Filter "admin" -Recurse | ForEach-Object {

  $acl = Get-Acl $_.FullName

if ($acl.AreAccessRulesProtected) { $acl.Access | % {$acl.purgeaccessrules($_.IdentityReference)} }
else {
        $isProtected = $true 
        $preserveInheritance = $false
        $acl.SetAccessRuleProtection($isProtected, $preserveInheritance) 
     }
$account="recoequip\folder sales group"
$rights=[System.Security.AccessControl.FileSystemRights]::FullControl
$inheritance=[System.Security.AccessControl.InheritanceFlags]"ContainerInherit,ObjectInherit"
$propagation=[System.Security.AccessControl.PropagationFlags]::None
$allowdeny=[System.Security.AccessControl.AccessControlType]::Allow

$dirACE=New-Object System.Security.AccessControl.FileSystemAccessRule ($account,$rights,$inheritance,$propagation,$allowdeny)
$ACL.AddAccessRule($dirACE)

Set-Acl -aclobject $ACL -Path $folder
Write-Host $folder Permissions added}

感谢您的帮助。 萨拉

2 个答案:

答案 0 :(得分:1)

好的,为了尝试加快你的脚本,我会在开头创建一次ACE,如mjolinor在上面的评论中所建议的那样。我不打算寻找缺少Admin子文件夹的文件夹,只是在每个文件夹中创建Admin子文件夹,并使用-force参数。这不会删除和重新创建,但它会做的是返回每个文件夹的文件夹对象,即使它已经存在。收集变量中的所有文件夹。然后遍历这些文件夹并为它们应用正确的权限。

# If the Admin folder for Equipment Images does not exist, make a new one and set the correct permissions.

#Define ACE to apply
$account="recoequip\folder sales group"
$rights=[System.Security.AccessControl.FileSystemRights]::FullControl
$inheritance=[System.Security.AccessControl.InheritanceFlags]"ContainerInherit,ObjectInherit"
$propagation=[System.Security.AccessControl.PropagationFlags]::None
$allowdeny=[System.Security.AccessControl.AccessControlType]::Allow
$dirACE=New-Object System.Security.AccessControl.FileSystemAccessRule ($account,$rights,$inheritance,$propagation,$allowdeny)

#Make sure all Equipment Images folders have an 'Admin' subfolder, and store the folder objects for later
$Folders = Get-ChildItem E:\Images\Equipment\* -Directory | %{New-Item -Path ($_.FullName + "\Admin") -ItemType directory -ErrorAction Continue -Force}

ForEach($Folder in $Folders){

    $acl = Get-Acl $Folder.FullName

    if ($acl.AreAccessRulesProtected) { $acl.Access | % {$acl.purgeaccessrules($_.IdentityReference)} }
    else {
        $isProtected = $true 
        $preserveInheritance = $false
        $acl.SetAccessRuleProtection($isProtected, $preserveInheritance) 
     }

    $ACL.AddAccessRule($dirACE)

    Set-Acl -aclobject $ACL -Path $folder
    Write-Host $folder Permissions added
}

这假设您使用的是PSv3或更高版本,并且可以访问-Directory cmdlet的Get-ChildItem开关。如果您没有安装v3,我建议您升级您的PowerShell版本。我意识到这并不总是一个选择,所以你可以将第12行更改为:

$Folders = Get-ChildItem E:\Images\Equipment\* -Attributes Directory | %{New-Item -Path ($_.FullName + "\Admin") -ItemType directory -ErrorAction Continue -Force}

    $Folders = Get-ChildItem E:\Images\Equipment\* | ?{$_.PSIsContainer} | %{New-Item -Path ($_.FullName + "\Admin") -ItemType directory -ErrorAction Continue -Force}

如果你必须使用其中一个,我会建议第一个,因为它只过滤FileSystem Provider级别的目录,而不是返回所有文件夹和文件,然后使PowerShell过滤掉文件。

答案 1 :(得分:0)

这很长时间才能添加评论。 这是在为某些Admin文件夹分配权限之间反复出现的错误。

Get-Acl:无法验证参数'Path'的参数。参数为null或空。提供非null或的参数 为空,然后再次尝试该命令。 在行:15 char:20 + $ acl = Get-Acl $ _。FullName + ~~~~~~~~~~~     + CategoryInfo:InvalidData:(:) [Get-Acl],ParameterBindingValidationException     + FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetAclCommand

您无法在空值表达式上调用方法。 在行:21 char:9 + $ acl.SetAccessRuleProtection($ isProtected,$ preserveInheritance) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~     + CategoryInfo:InvalidOperation:(:) [],RuntimeException     + FullyQualifiedErrorId:InvokeMethodOnNull

您无法在空值表达式上调用方法。 在行:24 char:5 + $ ACL.AddAccessRule($ dirACE) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo:InvalidOperation:(:) [],RuntimeException     + FullyQualifiedErrorId:InvokeMethodOnNull

Set-Acl:无法将参数绑定到参数'AclObject',因为它为null。 在线:26 char:24 + Set-Acl -aclobject $ ACL -Path $文件夹 + ~~~~     + CategoryInfo:InvalidData :( :) [Set-Acl],ParameterBindingValidationException     + FullyQualifiedErrorId:ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SetAclCommand