PowerShell脚本修改需求:按文件大小筛选复制并保留目录结构
PowerShell脚本修改需求:按文件大小筛选复制并保留目录结构
嗨,我来帮你调整这个PowerShell脚本,完美解决你的需求!
首先梳理下你的核心诉求:
- 取消对
.exe、.zip的一刀切排除,只要文件小于100MB就允许复制 - 完全保留源目录的层级结构(哪怕子目录嵌套10层也没问题)
- 脚本要适配多用户使用,减少硬编码的麻烦
修改后的完整脚本
# 自动获取当前用户名(替代硬编码,多用户使用更友好) $username = $env:USERNAME $date = (Get-Date).ToString("yyyy-MM-dd") # 目标根目录:自动对应用户+日期路径 $DestRoot = "Z:\data\$username\$date" # 稳妥创建目录,已存在也不会报错 New-Item -ItemType Directory -Path $DestRoot -Force | Out-Null # 源路径:自动对应用户的目标文件夹 $SourcePath = "C:\users\$username\Documents\Foldername" # 遍历源路径下所有文件,筛选小于100MB的,再按原结构复制 Get-ChildItem -Path $SourcePath -File -Recurse | Where-Object { # 100MB = 100 * 1024 * 1024 = 104857600 字节 $_.Length -lt 104857600 } | ForEach-Object { # 计算文件相对于源路径的相对路径,用来保留目录层级 $relativePath = $_.FullName.Substring($SourcePath.Length) # 拼接目标文件的完整路径 $destFilePath = Join-Path -Path $DestRoot -ChildPath $relativePath # 先创建目标文件所在的子目录(防止因目录不存在复制失败) New-Item -ItemType Directory -Path (Split-Path -Path $destFilePath -Parent) -Force | Out-Null # 执行复制,-Force可覆盖已存在的文件(不需要可移除) Copy-Item -Path $_.FullName -Destination $destFilePath -Force }
关键修改点说明
- 自动适配多用户:用
$env:USERNAME替代硬编码的用户名,不同用户运行脚本时会自动匹配自己的路径,无需手动修改。 - 健壮的目录创建:用
New-Item -Force代替mkdir,避免因目标目录已存在导致脚本报错中断。 - 按大小灵活筛选:用
Where-Object替代原来的-Exclude规则,只限制文件大小,不管扩展名——这样小体积的.exe、.zip就能正常复制了。 - 完整保留目录结构:通过计算文件的相对路径,把每个文件复制到目标目录对应的子路径下,完美复刻源文件夹的层级关系。
可选调整
- 如果还是习惯硬编码用户名,把
$username = $env:USERNAME改成具体用户名即可,比如$username = "wally"。 - 要调整文件大小限制,修改
104857600这个数值就行(比如50MB对应52428800)。
备注:内容来源于stack exchange,提问作者Wally
相关产品推荐
相关产品推荐

