基于PowerShell与WinSCP的SFTP远程目录文件数量检测脚本开发求助
解决方案:PowerShell + WinSCP 实现SFTP目录文件数量检查
我来帮你搞定这个每日执行的SFTP文件数量检查脚本,先理清两种实现方式的差异,再给出带判断逻辑的完整代码,最后说下Jenkins部署的关键点:
方式一:WinSCP .NET Assembly(更推荐)
这种方式更适合你的需求——可以直接通过API获取文件对象,统计数量的逻辑清晰易懂,错误处理也更精细,不需要去解析命令行输出的文本内容。
完整脚本如下,已经包含了你需要的if-else判断逻辑:
# 加载WinSCP .NET程序集,请确保WinSCPnet.dll的路径正确 # 如果脚本和dll在同一目录,直接写文件名即可;否则写完整路径,比如 "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" Add-Type -Path "WinSCPnet.dll" # 配置SFTP会话参数,替换成你的实际服务器信息 $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::Sftp HostName = "你的SFTP服务器地址" UserName = "登录用户名" Password = "登录密码" # 如果用密钥认证,替换为SshPrivateKeyPath参数指定密钥文件路径 SshHostKeyFingerprint = "服务器公钥指纹" # 可以从WinSCP图形界面连接时获取 TimeoutInMilliseconds = 60000 } $session = New-Object WinSCP.Session try { # 建立SFTP连接 $session.Open($sessionOptions) # 指定要检查的远程目录,替换成你的目标目录路径 $remotePath = "./my remote directory" # 获取目录下的**文件**列表(自动排除子目录) $files = $session.ListDirectory($remotePath).Files | Where-Object { -not $_.IsDirectory } # 统计文件数量 $fileCount = $files.Count Write-Host "远程目录 [$remotePath] 中的文件数量:$fileCount" # 判断文件数量是否超过4个 if ($fileCount -gt 4) { Write-Error "错误:远程目录文件数量超过4个,当前数量为 $fileCount" exit 1 # 返回非0退出码,让Jenkins识别为构建失败 } else { Write-Host "检查通过:文件数量未超过4个" exit 0 # 返回0表示执行成功 } } catch { Write-Error "连接或操作SFTP服务器时出错:$_" exit 1 } finally { # 确保会话资源被释放 $session.Dispose() }
方式二:WinSCP命令行方式
如果你更习惯用命令行模式,也可以通过解析ls命令的输出来统计文件数量,只是需要处理文本内容,相对繁琐一点:
# 配置WinSCP路径和日志文件路径 $winScpPath = "C:\Program Files (x86)\WinSCP\WinSCP.com" $logPath = "C:\Users\scripts\WinSCP.log" $remoteDir = "./my remote directory" # 执行WinSCP命令序列:连接服务器、切换目录、列出文件、退出 & $winScpPath /log=$logPath /ini=nul /command ` "open sftp://用户名:密码@服务器地址/ -hostkey=""服务器公钥指纹""" ` "cd $remoteDir" ` "ls -raw *.csv" ` # 如果只需要检查CSV文件,保留这个;否则去掉*.csv匹配所有文件 "exit" $winscpResult = $LastExitCode # 先检查WinSCP执行是否成功 if ($winscpResult -ne 0) { Write-Host "连接SFTP服务器失败,请查看日志 $logPath" exit $winscpResult } # 解析日志文件获取文件数量(注意:日志格式可能随WinSCP版本变化,需要测试调整) $fileLines = Get-Content $logPath | Where-Object { $_ -match "^-.*\.csv$" # 匹配文件行(以-开头,结尾为.csv,根据实际文件类型调整正则) } $fileCount = $fileLines.Count Write-Host "远程目录 [$remoteDir] 中的文件数量:$fileCount" # 文件数量判断逻辑 if ($fileCount -gt 4) { Write-Error "错误:远程目录文件数量超过4个,当前数量为 $fileCount" exit 1 } else { Write-Host "检查通过:文件数量未超过4个" exit 0 }
Jenkins部署注意事项
- 对于.NET Assembly方式:将
WinSCPnet.dll和脚本放在同一目录,或者在脚本中指定dll的完整绝对路径;确保Jenkins的运行用户拥有访问该dll文件的权限。 - 对于命令行方式:确认
WinSCP.com的路径正确,或者把WinSCP的安装目录添加到系统环境变量的PATH中,这样Jenkins可以直接找到该执行文件。 - 在Jenkins中添加「PowerShell」构建步骤,你可以直接粘贴脚本内容,或者指定脚本文件的绝对路径。
- 脚本返回的退出码会被Jenkins自动识别:返回0表示构建成功,返回非0则标记为构建失败,完全符合你每日检查的需求。
内容的提问来源于stack exchange,提问作者Victor Leclerc




