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)