You need to enable JavaScript to run this app. PowerShell环境下基于WinSCP .NET程序集完成SFTP同步后提取并拼接子文件夹与文件名
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.10 03:15:10