WinSCP PowerShell脚本仅传指定文件不上传本地文件夹及子目录求助
问题原因与修正方案
你当前的脚本存在3个核心问题导致不符合需求:
- 调用WinSCP的
PutFiles方法时传入的是本地目录路径,会默认将整个目录上传到远程,而非目录内的文件 - WinSCP的文件掩码分隔符为分号而非逗号,你之前的掩码写法语法错误导致规则不生效
- 多余的循环逻辑错误,变量重名导致实际每次仅上传目录本身
修正后的完整代码
# Set the folder name variables $DirCustomerData = @("001201", "001753", "001952", "002587", "002833", "002863", "003150", "003716", "004826", "003010", "004099", "006222", "002545", "006805", "001433", "006839") $LocalDir = "\customer_data\"+$DirCustomerData[$i]+"\info\" # Check for files,仅统计当前目录下的txt、csv文件,排除子目录 $targetFiles = Get-ChildItem $LocalDir -File -Include *.txt,*.csv if($targetFiles.Count -eq 0) { "Local directory $LocalDir has currently no files. Skipping to next folder" "`n" } else { "Local directory $LocalDir contains $($targetFiles.Count) files. Starting now FTP Upload Session..." "`n" # Open the FTP Session $session = New-Object WinSCP.Session $session.Open($sessionOptions) # Upload the files $transferOptions = New-Object WinSCP.TransferOptions $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary # 正确的文件掩码:分号分隔匹配规则,排除所有子目录 $transferOptions.FileMask = "*.txt; *.csv | */"; $RemoteDir = "/"+$DirCustomerData[$i]+"/info/" # 注意第一个参数加\*,表示上传目录内的内容而非目录本身,第三个参数设为$false关闭递归 $transferResult = $session.PutFiles($LocalDir + "\*", $RemoteDir, $false, $transferOptions) # Throw on any error $transferResult.Check() # Print results foreach ($transfer in $transferResult.Transfers) { Write-Host "Upload of $($transfer.FileName) to remote FTP directory $RemoteDir succeeded." } }
关键修改说明
- 文件路径修改:
PutFiles第一个参数改为$LocalDir + "\*",指定上传目录内的所有内容,不会把本地info目录本身传到远程 - 关闭递归传输:
PutFiles第三个参数设为$false,禁止遍历子目录,从根源上避免子目录被上传 - 修正文件掩码:将分隔符从逗号改为分号,符合WinSCP的掩码语法规则,
| */的排除子目录规则可以正常生效 - 简化文件统计逻辑:直接用
Get-ChildItem -File -Include统计符合要求的文件,避免不必要的参数组合 - 删除错误循环:原来的
foreach ($LocalDirFiles in $LocalDir)逻辑完全无效,直接移除即可
内容的提问来源于stack exchange,提问作者Victor Leclerc
相关产品推荐
相关产品推荐

