sync-ftpfolder.ps1 - синхронизация файлов с FTP
Обновляет имеющиеся файлы. Загружает отсутствующие.
$FtpPath = 'ftp://my.ftpurl.ru/docs/' $LocalPath = 'C:\files\docs\' $FtpLogin = 'john77' $FtpPass = 'qwe123' Sync-FtpFolder $ftpPath $localPath $FtpLogin $FtpPass
function Sync-FtpFolder{ Param( [Parameter( Mandatory = $true )] [string]$ftpPathF, [Parameter( Mandatory = $true )] [string]$localPathF, [string]$FtpLogin = 'anonymous', [string]$FtpPass = '' ) function Get-FtpFileList($url){ $WR = [Net.WebRequest]::Create($url) $ErrorActionPreference = 'SilentlyContinue' $WR.Method = [Net.WebRequestMethods+FTP]::ListDirectoryDetails $WR.Credentials = [Net.NetworkCredential]::new($FtpLogin,$FtpPass) $WRStream = $WR.GetResponse() $respStream = $WRStream.GetResponseStream() $readStream = [IO.StreamReader]::new($respStream, [Text.Encoding]::UTF8) return $readStream.ReadToEnd() } function Get-FtpFileDate($url){ $WR = [Net.WebRequest]::Create($url) $ErrorActionPreference = 'SilentlyContinue' $WR.Method = [Net.WebRequestMethods+FTP]::GetDateTimestamp $WR.Credentials = [Net.NetworkCredential]::new($FtpLogin,$FtpPass) return $WR.GetResponse().LastModified.ToUniversalTime() } function DownloadFrom-Ftp($url,$local){ $WC.DownloadFile($url,$local) (Get-Item -li $local).LastWriteTime = [string](Get-FtpFileDate $url) } function UploadTo-Ftp($url,$local){ $WC.uploadFile($url,$local) (Get-Item -li $local).LastWriteTime = [string](Get-FtpFileDate $url) } try{[string[]]$l = ((Get-FtpFileList $FtpPathF).trim()-split '\r\n'). where{$_[0]-ne'd'}|%{($_-split':\d+\s')[1]} }catch{write-host $error[0] -fo red;return} $WC = [Net.WebClient]::new();$i=0 $WC.Credentials = [Net.NetworkCredential]::new($FtpLogin,$FtpPass) $l += (gci -li $localPathF -file).name $list = $l.where({$_ -ne ""})|sort -u $list|ForEach{ $FtpPath = $ftpPathF + $_ $localPath = $localPathF + $_ $ftpDate = Get-FtpFileDate $FtpPath $localDate = (Gi -li $localPath -ea 0).LastWriteTime write-host -n ("["+ ++$i+"/"+$list.count+"]") -fo DarkGray if($ftpDate -lt $localDate -and $localDate){ $_;write-host "FTP file older" -fo red UploadTo-Ftp $ftpPath $localPath write-host "Uploaded" -fo Darkgreen } elseif($ftpDate -gt $localDate -and $ftpDate){ $_;write-host "FTP file newer" -fo red DownloadFrom-Ftp $ftpPath $localPath write-host "Downloaded" -fo Darkgreen } else{$_;write-host "Files identical" -fo Darkgreen}"" } $WC.Dispose() }