PowerShell之FTP文件上传

时间:2020-12-04 03:40:24

PowerShell之FTP文件上传

我的另一篇博文讲了怎样编写PowerShell脚本进行SFTP下载,FTP与SFTP大同小异,所以就讲讲FTP上传。本例是基于WinSCP的,所以需要下载一个WinSCPnet.dll动态文件。

我们通过一个xml配置文件配置IP,用户名,密码,上传目录等配置项,降低代码耦合。

本例中,我们将数据放在data文件夹下,脚本放在scripts文件夹下(假设本地文件目录和远程目录为E:\test\path\data,脚本目录为E:\test\path\scripts\)。

下面是upload.xml配置文件内容:

<?xml version="1.0" ?>
<ftpConfig>
<Protocol>ftp</Protocol>
<HostName>127.0.0.1</HostName>
<UserName>admin</UserName>
<Password>Password</Password>
<RemotePath>/e/test/path/data/</RemotePath>
<LocalPath>e:\test\path\data\</LocalPath>
</ftpConfig>

下面是PowerShell脚本代码(upload.ps1):


param (
$xmlData=[xml](Get-Content "E:\test\path\scripts\upload.xml"),
$localPath = $xmlData.ftpConfig.LocalPath,
$remotePath = $xmlData.ftpConfig.RemotePath,
$dataFile = (Get-Date).toString("yyyy-MM-dd")+".txt", #数据文件
$flagFile = "flag_"+(Get-Date).toString("yyyyMMdd")+".txt" #标志文件
)
#等待10s
function wait10sec{
$step=10
$add=0
$t=(get-date)
$step-(($t.Hour*3600+$t.Minute*60+$t.Second)%$step)+$add
}

try
{
# Load WinSCP .NET assembly
Add-Type -Path "E:\test\path\scripts\WinSCPnet.dll"

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]$xmlData.ftpConfig.Protocol
$sessionOptions.HostName = $xmlData.ftpConfig.HostName
$sessionOptions.UserName = $xmlData.ftpConfig.UserName
$sessionOptions.Password = $xmlData.ftpConfig.Password


$session = New-Object WinSCP.Session

try
{
# Connect
$session.Open($sessionOptions)

# Detect the flag file (10s检测一次标志文件是否存在)
while(! (Test-Path($localPath+$flagFile))){
Get-Date
Start-Sleep -s (wait10sec)
}
write-host "Start uploading..."
$session.PutFiles($localPath+$dataFile,$remotePath).Check()
write-host "End upload"

}
finally
{
# Disconnect, clean up
$session.Dispose()
}

exit 0
}
catch [Exception]
{
Write-Host ("Error: {0}" -f $_.Exception.Message)
exit 1
}

在代码中我们通过设置标志文件来进行数据文件自动上传,这种方式在文件传输跑批流程中比较适用,比如我有5G的数据文件需要传输,什么时候可以传输结束?这时我们可以在传输结束后生成一个标志文件(可以是空文件),在下一个文件传输环节中我只需要检测标志文件是否生成,以此判断数据文件是否全部传输。