,

Script de PowerShell per pujar fitxers automàticament a un FTP remot

·

Script de PowerShell per pujar fitxers automàticament a un FTP remot

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

  1. Puja els fitxers de la carpeta local al servidor FTP remot.
  2. Quan un fitxer s’ha pujat correctament, el mou a una carpeta de fitxers enviats.
  3. Si el fitxer ja existeix a l’FTP o a la carpeta d’enviats, el sobreescriu.
  4. Si hi ha un error, l’escriu al registre.
  5. 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.