You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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

火山引擎 最新活动