PowerShell实现:仅处理sFTP位置中行数大于1的文本文件
PowerShell统计文本文件行数并筛选处理
原代码问题分析
- 错误地将统计出的行数覆盖写入原文件,直接破坏了原文件内容,完全偏离统计行数的初衷
- 硬编码使用
"``r``n"作为分隔符,若文件采用Unix风格换行符"``n",会导致行数统计不准确
本地文本文件处理方案
以下代码可正确统计每个txt文件的行数,并根据行数判断是否执行加载流程:
$paramDest = "C:\All\" Get-ChildItem $paramDest -Filter *.txt | ForEach-Object { # 统计行数:兼容Windows/Unix换行符,两种方式可选 # 方式1:统计包含空行的总行数 $lineCount = (Get-Content $_.FullName).Count # 方式2:统计排除空行的有效行数 # $lineCount = ($_ | Get-Content -Raw) -split "`r?`n" | Where-Object { $_ -ne '' } | Measure-Object | Select-Object -ExpandProperty Count Write-Host "文件 $($_.Name) 行数:$lineCount" # 行数大于1时执行加载流程 if ($lineCount -gt 1) { Write-Host "开始加载文件:$($_.FullName)" # 在此处添加你的加载逻辑,例如导入数据库、解析内容等 # 示例:Import-Csv $_.FullName | Out-SqlTable -Server "dbserver" -Table "TargetTable" } else { Write-Host "忽略文件:$($_.Name)" } }
SFTP服务器文件处理方案
PowerShell原生不支持SFTP,通常借助WinSCP .NET组件实现远程文件操作,步骤如下:
- 从WinSCP官网下载.NET组件,将
WinSCPnet.dll放在脚本同目录 - 使用以下代码连接SFTP、统计行数并处理:
# 加载WinSCP组件 Add-Type -Path "WinSCPnet.dll" # 配置SFTP连接参数 $sftpParams = [WinSCP.SessionOptions]@{ Protocol = [WinSCP.Protocol]::Sftp HostName = "你的SFTP服务器地址" UserName = "账号" Password = "密码" # 若使用密钥认证,替换为SshPrivateKeyPath = "私钥文件路径" SshHostKeyFingerprint = "服务器公钥指纹(可从WinSCP客户端获取)" } $session = [WinSCP.Session]::new() try { $session.Open($sftpParams) # 获取远程目录下的所有txt文件 $remoteFiles = $session.ListDirectory("/远程目标目录").Files | Where-Object { $_.Name -match "\.txt$" -and !$_.IsDirectory } foreach ($remoteFile in $remoteFiles) { # 下载到本地临时目录 $localTempPath = Join-Path $env:TEMP $remoteFile.Name $session.GetFileToDirectory($remoteFile.FullName, $env:TEMP) # 统计行数 $lineCount = (Get-Content $localTempPath).Count Write-Host "远程文件 $($remoteFile.Name) 行数:$lineCount" if ($lineCount -gt 1) { Write-Host "开始加载远程文件:$($remoteFile.FullName)" # 在此添加加载逻辑 } else { Write-Host "忽略远程文件:$($remoteFile.Name)" } # 删除本地临时文件 Remove-Item $localTempPath -Force } } finally { $session.Dispose() }
内容的提问来源于stack exchange,提问作者DAR
相关产品推荐
相关产品推荐

