以下脚本运行良好,但需要几天才能完成。有没有人有任何调整或提示来缩短执行时间?
共享目录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}
感谢您的帮助。 萨拉
答案 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