PowerShell环境下基于WinSCP .NET程序集完成SFTP同步后提取并拼接子文件夹与文件名
路径解析与拼接实现方案
原实现仅提取了路径最末端的文件名字段,未完成「剥离固定远程基础目录→定位目标文件所属一级子文件夹→拆分拼接字段」的流程,按以下步骤调整即可得到要求的输出格式。
核心处理逻辑
- 预先定义固定的远程基础目录,统一路径格式避免前缀匹配偏差
- 从下载记录的原始文件路径中剥离基础目录前缀,生成相对于基础目录的相对路径
- 拆分相对路径,分别提取一级子文件夹名称、原始文件名
- 对原始文件名做规则处理:移除
.pdf后缀、移除固定开头的matricule标记,得到纯文件标识 - 按「子文件夹名-文件标识」的规则拼接最终输出
调整后脚本
# 定义固定远程基础目录,统一路径格式(补全末尾斜杠、消除重复斜杠) $remoteBasePath = "/home/etc/".TrimEnd('/') + '/' # 直接使用下载记录的原始FileName,不要调用EscapeFileMask方法 # 该方法仅用于转义文件掩码中的特殊字符,会干扰正常路径解析 $fullRemotePath = $download.FileName # 剥离基础目录前缀,得到相对路径 $relativePath = $fullRemotePath.Substring($remoteBasePath.Length) # 拆分相对路径:数组第0位是所属一级子文件夹,第1位是完整文件名 $pathSegments = $relativePath -split '/' $targetFolder = $pathSegments[0] $rawFileName = $pathSegments[1] # 处理文件名:先去掉后缀,再移除开头固定的matricule前缀 $fileNoSuffix = $rawFileName.Split('.')[0] $fileIdentifier = $fileNoSuffix.Remove(0, "matricule".Length) # 拼接为要求的格式 $output = "$targetFolder-$fileIdentifier" Write-Host $output
匹配目录结构的实际输出
按给定的目录层级运行后,每个文件的输出完全符合预期:
foldername1-12455-126 foldername1-12456-125 foldername2-1249-127 foldername2-1241-128
踩坑提醒
- 不要将
$download.FileName传入[WinSCP.RemotePath]::EscapeFileMask()做转义,该方法的设计场景是为FileMask参数转义*、?、[]这类匹配符,直接作用于普通路径会打乱正常的斜杠结构 - 若后续目录层级有变动,仅需调整拆分路径时的数组取值下标即可,无需修改核心拼接逻辑
内容的提问来源于stack exchange,提问作者turik
相关产品推荐
相关产品推荐

