Fa poc vam tenir una necessitat: transferir cada pocs minuts tots els fitxers XML d’una carpeta a un FTP remot. Hi ha moltes maneres de fer-ho, i algunes passen per programari de pagament. En el nostre cas eren fitxers XML generats per un servidor SAP en un entorn Windows, així que vam optar per un script de PowerShell que podem executar amb el Programador de tasques de Windows.
El script fa servir les llibreries .NET de WinSCP, de manera que primer cal instal·lar aquest programa, lleuger i gratuït. El trobareu aquí: winscp.net
Com funciona el script
- Puja els fitxers de la carpeta local al servidor FTP remot.
- Quan un fitxer s’ha pujat correctament, el mou a una carpeta de fitxers enviats.
- Si el fitxer ja existeix a l’FTP o a la carpeta d’enviats, el sobreescriu.
- Si hi ha un error, l’escriu al registre.
- Tots els moviments queden registrats amb data i hora.
Aquest és el script, que podeu desar en un fitxer .ps1, per exemple upload_ftp.ps1:
#Preparem el registre
$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
#Ubicació del fitxer de registre
Start-Transcript -path C:\ftpscript\log\log.txt -append
try
{
# Carreguem la llibreria .NET de WinSCP
[Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\WinSCP\WinSCPnet.dll") | Out-Null
# Dades de l'FTP
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::ftp
$sessionOptions.HostName = "ftp.remotelocation.com"
$sessionOptions.UserName = "ftpusername"
$sessionOptions.Password = "ftpmpassword"
# $sessionOptions.SshHostKeyFingerprint = "ssh-rsa 1024 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
$session = New-Object WinSCP.Session
try
{
# Connexió
$session.Open($sessionOptions)
$localPath = "C:\ftpscript\upload\*.xml"
$remotePath = "/"
$backupPath = "C:\ftpscript\uploaded"
$aData = Get-Date
# Pugem els fitxers i recollim el resultat
$transferOptions = New-Object WinSCP.TransferOptions
$transferResult = $session.PutFiles($localPath, $remotePath)
# Recorrem els fitxers
foreach ($transfer in $transferResult.Transfers)
{
# Correcte o error?
if ($transfer.Error -eq $Null)
{
Write-Host ("${aData} - El fitxer {0} s'ha pujat i s'ha mogut a la carpeta d'enviats" -f
$transfer.FileName)
# Si ha anat bé, el movem a la carpeta d'enviats
Move-Item $transfer.FileName $backupPath -force
}
else
{
Write-Host ("${aData} - Error al fitxer {0}: {1}" -f
$transfer.FileName, $transfer.Error.Message)
}
}
}
finally
{
# Desconnectem i netegem
$session.Dispose()
}
exit 0
}
catch [Exception]
{
Write-Host $_.Exception.Message
exit 1
}
# Tanquem el registre
Stop-Transcript
Consell: si el servidor ho permet, feu servir SFTP o FTPS en lloc d’FTP, que envia la contrasenya sense xifrar. Amb WinSCP només cal canviar el protocol i indicar l’empremta de la clau del servidor.
Traducció feta amb l’ajuda d’IA a partir de l’article original.
