如何将文件共享设为只读并排除指定子文件夹?PowerShell脚本异常
问题原因与修复方案
为什么加-Recurse后Exclude失效?
Get-ChildItem的-Exclude不支持完整路径匹配:当使用-Recurse递归遍历时,-Exclude仅匹配当前层级的项名称(比如当前文件夹里的文件名/文件夹名)。你写的"\Sub-Folder1\*"是带路径的格式,递归到子目录时,子项的名称不会包含上级路径,自然匹配不上,排除规则直接失效。- 路径通配符干扰匹配逻辑:你给
$Path加了末尾的*,直接定位到Downloads下的一级子项,结合-Recurse虽然能遍历所有内容,但会让-Exclude的匹配逻辑变得混乱,进一步导致排除失效。 Set-ItemProperty的-Exclude无意义:这个参数是用来过滤路径中的通配符项的,不是用来筛选你已经通过Get-ChildItem获取到的对象集合,所以这里写了也起不到任何作用。
修复后的脚本
核心思路是先遍历所有文件和文件夹,再通过完整路径筛选排除需要保留权限的目标文件夹及其内容:
# 共享文件夹根路径(直接写目录,不要加末尾的*) $RootPath = "C:\Users\Username\Downloads" # 需要排除的子文件夹名称 $ExcludeFolders = "Sub-Folder1", "Sub-Folder2", "Sub-Folder3", "Sub-Folder4" # 获取所有项,过滤掉包含目标子文件夹的内容 $ItemsToProcess = Get-ChildItem -Path $RootPath -Recurse | Where-Object { # 检查当前项的完整路径是否包含任何一个要排除的文件夹(加\避免误匹配类似Sub-Folder12的项) !($ExcludeFolders | ForEach-Object { $_.FullName -match "\\$_\\" }) } # 批量设置只读属性 foreach ($item in $ItemsToProcess) { Set-ItemProperty -Path $item.FullName -Name IsReadOnly -Value $True Write-Host "已设置只读:$($item.FullName) | 当前状态:$($item.IsReadOnly)" }
可选调整
- 如果只需要排除文件夹本身,不想排除里面的内容,把
Where-Object里的条件改成:!($ExcludeFolders -contains $item.Name -and $item.PSIsContainer) - 如果只想排除一级子文件夹下的目标子文件夹(比如只排除
Downloads\FolderA\Sub-Folder1,不排除Downloads\FolderA\SubFolder\Sub-Folder1),把匹配规则改成:!($ExcludeFolders | ForEach-Object { $_.FullName -match "\\[^\\]+\\$_\\" })
内容的提问来源于stack exchange,提问作者Grant
相关产品推荐
相关产品推荐

