使用PowerShell与正则表达式批量将符合规则的文件设为只读
使用PowerShell和正则表达式筛选特定文件并设置只读属性
嘿,既然你已经搞定了PowerShell修改属性和获取文件列表的基础操作,那咱们直接解决正则筛选的核心问题就好!
首先,针对你需要的匹配规则——文件名扩展名前的最后两位是00-89之间的数字,我来拆解对应的正则表达式,再结合Get-ChildItem实现完整的筛选与属性修改流程:
第一步:编写匹配规则的正则表达式
咱们需要确保扩展名(比如.pdf、.msg)前面的最后两个字符是00到89的数字组合,对应的正则是:
^.*(0\d|[1-8]\d)\.[^.]+$
我来解释下每个部分的作用:
^.*:匹配文件名开头的任意内容(长度不限,不管前面是字母、数字还是其他字符)(0\d|[1-8]\d):核心匹配规则——0\d覆盖00-09的数字,[1-8]\d覆盖10-89的数字,两者结合正好满足你要的00-89范围\.[^.]+$:匹配最后的扩展名部分,确保那两位数字紧跟在扩展名的点号前面,同时避免多扩展名文件(比如file.tar.gz)的干扰
第二步:结合Get-ChildItem筛选并修改文件属性
因为Get-ChildItem的-Filter参数不支持正则,所以咱们用Where-Object来做精准筛选。下面是完整的可运行脚本:
# 替换成你要扫描的目标文件夹路径 $targetFolder = "C:\Your\Target\Folder" # 1. 获取符合规则的文件(需要递归扫描子文件夹的话,加上 -Recurse 参数) $matchedFiles = Get-ChildItem -Path $targetFolder -File | Where-Object { $_.Name -match '^.*(0\d|[1-8]\d)\.[^.]+$' } # 2. 先验证匹配结果(可选,避免误操作) Write-Host "找到符合规则的文件:" $matchedFiles | Select-Object Name | Format-Table -AutoSize # 3. 将匹配的文件设置为只读 foreach ($file in $matchedFiles) { # 两种设置只读的方式选一种即可 # 方式一:直接修改文件属性对象 $file.Attributes += [System.IO.FileAttributes]::ReadOnly # 方式二:更直观的命令式写法 # Set-ItemProperty -Path $file.FullName -Name IsReadOnly -Value $true Write-Host "已将文件 $($file.Name) 设置为只读" }
额外实用提示
- 如果需要定期执行这个脚本,可以把它保存为
.ps1文件,然后通过Windows任务计划程序设置定时任务 - 首次运行建议只执行验证部分,确认匹配的文件完全符合预期后,再执行属性修改的代码,避免误操作
内容的提问来源于stack exchange,提问作者H Fourie
相关产品推荐
相关产品推荐

