Powershell - Kontakte für Cleverreach exportieren und FTP Übertragung

Mit diesem Script lassen sich automatisch (Windows Aufgabenplanung auf dem antony Server) alle antony Kontakte aus bestimmten Kontaktgruppen und/oder bestimmten Stichwörtern in eine .CSV Datei exportieren. Diese wird anschließend auf einen FTP Server geladen, wo Cleverreach diese wieder abholen kann.

function Load-NugetAssembly { [CmdletBinding()] param( [string]$url, [string]$name, [string]$zipinternalpath, [switch]$downloadonly ) if($psscriptroot -ne ''){ $localpath = join-path $psscriptroot $name }else{ $localpath = join-path $env:TEMP $name } $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())" $zip = $null try{ if(!(Test-Path $localpath)){ Add-Type -A System.IO.Compression.FileSystem write-host "Downloading and extracting required library '$name' ... " -F Green -NoNewline (New-Object System.Net.WebClient).DownloadFile($url, $tmp) $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp) $zip.Entries | ?{$_.Fullname -eq $zipinternalpath} | %{ [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath) } Unblock-File -Path $localpath write-host "OK" -F Green } if(!$downloadonly.IsPresent){ Add-Type -Path $localpath -EA Stop } }catch{ write-host ($_.Exception.LoaderExceptions | fl | out-string) throw "Error: $($_.Exception.Message)" }finally{ if ($zip){$zip.Dispose()} if(Test-Path $tmp){del $tmp -Force} } } Load-NugetAssembly 'https://www.nuget.org/api/v2/package/System.Threading.Tasks.Extensions/4.5.4' -name 'System.Threading.Tasks.Extensions.dll' -zipinternalpath 'lib/net461/System.Threading.Tasks.Extensions.dll' -EA Stop Load-NugetAssembly 'https://www.nuget.org/api/v2/package/System.Memory/4.5.4' -name 'System.Memory.dll' -zipinternalpath 'lib/net461/System.Memory.dll' -EA Stop Load-NugetAssembly 'https://www.nuget.org/api/v2/package/System.Memory/4.5.5' -name 'System.Memory.4012.dll' -zipinternalpath 'lib/net461/System.Memory.dll' -EA Stop Load-NugetAssembly 'https://www.nuget.org/api/v2/package/Google.Protobuf/3.21.9' -name 'Google.Protobuf.dll' -zipinternalpath 'lib/net45/Google.Protobuf.dll' -EA Stop Load-NugetAssembly 'https://www.nuget.org/api/v2/package/MySql.Data/8.2.0' -name 'MySql.Data.dll' -zipinternalpath 'lib/net462/MySql.Data.dll' -EA Stop $SQLServer = "192.168.X.Y" $SQLDBName = "antony" $uid ="antony_ro" $pwd = "**geheim**" $delimiter = ";" $exportFile = "C:\scripts\antonyContact2Cleverreach\contacts.csv" [void][Reflection.Assembly]::LoadWithPartialName('MySQL.Data') #Get Contact-Data $SqlQuery = "SELECT " $SqlQuery = $SqlQuery + "contact.id,contact.main_contact_id,contacttitle.name as title,contact.company,contact.firstname,contact.lastname,contact.street,contact.zipcode,contact.city,contactstate.name as state,contactcountry.name as country,contact.phone,contact.phone2,contact.fax,contact.email,contact.mobile,contact.homepage,contact.street_private,contact.zipcode_private,contact.city_private,privatestate.name as state_private,privatecountry.name` as country_private,contact.phone_private,contact.phone2_private,contact.fax_private,contact.department,contact.birthday " $SqlQuery = $SqlQuery + "FROM ``contact-group``, contact " $SqlQuery = $SqlQuery + "LEFT JOIN type_state as contactstate ON contactstate.id = contact.state " $SqlQuery = $SqlQuery + "LEFT JOIN type_state as privatestate ON privatestate.id = contact.state_private " $SqlQuery = $SqlQuery + "LEFT JOIN type_title as contacttitle ON contacttitle.id = contact.title_id " $SqlQuery = $SqlQuery + "LEFT JOIN type_country as contactcountry ON contactcountry.id = contact.country_id " $SqlQuery = $SqlQuery + "LEFT JOIN type_country as privatecountry ON privatecountry.id = contact.country_id_private " $SqlQuery = $SqlQuery + "LEFT JOIN instance_properties as ip ON ip.object_id = contact.id AND ip.instance_id = 1 " $SqlQuery = $SqlQuery + "WHERE contact.deleted = 0 AND contact.email <> '' AND ``contact-group``.contact_id = contact.id AND ``contact-group``.group_id = 4;" $SqlConnection = New-Object MySql.Data.MySqlClient.MySqlConnection $SqlConnection.ConnectionString = "server=$SQLServer;user id=$uid;password=$pwd;database=$SQLDBName;pooling=false" $SqlConnection.Open() $SqlCmd = New-Object MySql.Data.MySqlClient.MySqlCommand $SqlCmd.CommandText = $SqlQuery $SqlCmd.Connection = $SqlConnection $reader = $SqlCmd.ExecuteReader() $tbl = New-Object Data.DataTable $tbl.Load($reader) $reader.Close() $SqlConnection.Close() $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $tbl | export-csv -Delimiter $delimiter -Path $exportFile -NoTypeInformation #Upload to FTP $ftpClient = New-Object System.Net.WebClient $ftpClient.Credentials = New-Object System.Net.NetworkCredential("**ftp-user**", "**ftp-password**") $ftpClient.UploadFile("ftp://ftp.meinserver.de/pfad/contacts.csv", $exportFile)

 

Damit das Script funktioniert muss der MySQL-.NET Treiber installiert werden (64 bit)