PowerShell如何获取含指定关键词文件及同名文件夹内所有文件?
PowerShell 实现两类文件检索复制方案
你当前编写的代码仅能匹配名称包含car的文件与目录项,无法自动拉取名称为car的文件夹下所有文件名不含car的内容,可通过分两类检索、去重后统一复制的逻辑实现需求,同时可增加权限报错屏蔽、目录自动创建的兼容处理。
核心实现逻辑
- 第一类匹配项:遍历C盘所有文件,筛选文件名包含
car关键词的文件 - 第二类匹配项:遍历C盘所有目录,筛选名称完全为
car的文件夹,再提取这些文件夹下存储的所有文件(无论文件名是否包含car) - 合并两类匹配结果时按文件完整路径去重,避免同时满足两个条件的文件被重复复制
- 增加无权限系统目录的错误屏蔽,避免脚本运行时弹出大量访问报错
全文件平铺复制到目标路径(不保留原目录结构)
直接将所有符合条件的文件复制到C:\Test根目录下,代码如下:
$sourceRoot = "C:\" $destPath = "C:\Test" # 目标路径不存在则自动创建 if (-not (Test-Path $destPath)) { New-Item -ItemType Directory -Path $destPath | Out-Null } # 检索第一类:文件名含car的所有文件 $carNameFiles = Get-ChildItem -Path $sourceRoot -Recurse -File -Filter "*car*" -ErrorAction SilentlyContinue # 检索第二类:名为car的文件夹下的所有文件 $carFolderFiles = Get-ChildItem -Path $sourceRoot -Recurse -Directory -Filter "car" -ErrorAction SilentlyContinue | Get-ChildItem -File -Recurse -ErrorAction SilentlyContinue # 合并结果去重后执行复制 $allMatchFiles = $carNameFiles + $carFolderFiles | Sort-Object FullName -Unique $allMatchFiles | Copy-Item -Destination $destPath -Force
保留原目录结构复制
如果需要在目标路径下保留文件原来的层级目录结构,将上述代码最后一行复制命令替换为以下内容即可:
$allMatchFiles | ForEach-Object { $relativePath = $_.FullName.Substring($sourceRoot.Length) $targetFullPath = Join-Path $destPath $relativePath $targetParentDir = Split-Path $targetFullPath -Parent # 提前创建目标文件对应的父目录 if (-not (Test-Path $targetParentDir)) { New-Item -ItemType Directory -Path $targetParentDir -Force | Out-Null } Copy-Item -Path $_.FullName -Destination $targetFullPath -Force }
注意:脚本默认会强制覆盖目标路径下已存在的同名文件,如果不需要覆盖,去掉
Copy-Item命令后的-Force参数即可。
内容的提问来源于stack exchange,提问作者MajorAnonymous
相关产品推荐
相关产品推荐

