PowerShell中如何用Get-ChildItem获取含中间目录的完整文件路径
解决PowerShell提取VPP文件夹文件并保留相对路径的问题
问题分析
你当前脚本的核心问题是:直接输出$child时,PowerShell默认调用对象的ToString()方法,仅返回文件名/文件夹名,而非完整路径。要保留从源目录开始的相对结构,需要利用FileInfo/DirectoryInfo对象的属性来计算相对路径。
修改后的脚本
$sourceDirectory = "F:\OneDrive - University of Edinburgh\PhD\Results\Campaign1_Part4\GustData" $destDirectory = "C:\Users\Anjali\Desktop\test" $keyword = "VPP" # 获取所有包含VPP路径的文件/文件夹(递归) $items = Get-ChildItem -Path $sourceDirectory -Recurse | Where-Object { $_.FullName -match [regex]::Escape($keyword) } foreach ($item in $items) { # 计算当前项相对于源目录的相对路径 $relativePath = $item.FullName.Substring($sourceDirectory.Length + 1) # 构造目标路径 $targetPath = Join-Path -Path $destDirectory -ChildPath $relativePath try { # 复制文件/文件夹,保留结构 Copy-Item -Path $item.FullName -Destination $targetPath -Force -Recurse } catch [System.Exception] { Write-Error "复制失败: $($item.FullName) - $($_.Exception.Message)" } }
关键改进点
- 用
FullName获取完整路径:$item.FullName返回文件/文件夹的绝对完整路径,包含所有层级目录。 - 计算相对路径:通过截取
FullName中源目录长度之后的部分,得到从源目录开始的相对路径(如dataset1\folderA\folderB\VPP\file1)。 - 构造目标路径:用
Join-Path拼接目标目录和相对路径,确保复制后保留原有目录结构。 - 精准匹配VPP:用
[regex]::Escape($keyword)避免特殊字符干扰正则匹配,确保只命中包含VPP的路径。
更高效的写法(直接定位VPP文件夹)
如果只需要提取VPP文件夹内的内容,还可以直接先定位所有VPP文件夹,再复制其内容,这样更精准:
$sourceDirectory = "F:\OneDrive - University of Edinburgh\PhD\Results\Campaign1_Part4\GustData" $destDirectory = "C:\Users\Anjali\Desktop\test" # 找到所有源目录下的VPP文件夹 $vppFolders = Get-ChildItem -Path $sourceDirectory -Recurse -Directory | Where-Object { $_.Name -eq "VPP" } foreach ($vppFolder in $vppFolders) { # 计算VPP文件夹相对于源目录的相对路径 $relativeVppPath = $vppFolder.FullName.Substring($sourceDirectory.Length + 1) $targetVppPath = Join-Path -Path $destDirectory -ChildPath $relativeVppPath # 复制VPP文件夹内的所有内容到目标路径 Copy-Item -Path "$($vppFolder.FullName)\*" -Destination $targetVppPath -Force -Recurse }
这种写法直接定位VPP文件夹,避免匹配到名称包含VPP的非目标文件/文件夹,更符合你的需求。
内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

