8
0
2024-01-24 16:42:38 +01:00

1390 lines
127 KiB
PowerShell
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#PowerShell 4.0 Script
#Please use the "_Settings.ini"-File for configurations.
#Digital Data
#Ludwig-Rinn-Strasse 16
#35452 Heuchelheim
#Tel.: 0641 / 202360
#E-Mail: info@didalog.de
#Version Number: 1.0.0.0
#Version Date: 30.11.2018
#Requires Version 4.0
#-----------------------------------------------------------------------------------------------------#
######################################## check for arguments ##########################################
#-----------------------------------------------------------------------------------------------------#
#-----------------------------------------------------------------------------------------------------#
################################## add additional buildin assemblys ###################################
#-----------------------------------------------------------------------------------------------------#
#Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop
#Add-Type -AssemblyName PresentationCore -ErrorAction Stop
#Add-Type -AssemblyName PresentationFramework -ErrorAction Stop
#-----------------------------------------------------------------------------------------------------#
############################################ set variables ############################################
#-----------------------------------------------------------------------------------------------------#
Set-Variable -Scope Global -Name ScriptName -Value (($MyInvocation.MyCommand.Name) -split "\.")[0].ToString()
Set-Variable -Scope Global -Name ScriptPath -Value (Split-Path ($MyInvocation.MyCommand.Path))
Set-Variable -Scope Global -Name ConfigFile -Value (Get-ChildItem -Path "$ScriptPath" -Recurse -Filter "$ScriptName`_Settings.ini" -File -Force).FullName
Set-Variable -Scope Global -Name ConfigFileContent -Value $NULL
Set-Variable -Scope Global -Name Timestamp1 -Value $(Get-Date -Format 'ddMMyyyy')
Set-Variable -Scope Global -Name Timestamp2 -Value $(Get-Date -Format 'ddMMyyyy_HHmmss')
Set-Variable -Scope Global -Name Timestamp3 -Value $(Get-Date -Format 'ddMMyyyy_HHmmssffff')
Set-Variable -Scope Global -Name Timestamp4 -Value $(Get-Date -Format 'yyyyMMdd HH:mm:ss.fff')
Set-Variable -Scope Global -Name Item -Value $NULL
Set-Variable -Scope Global -Name Items -Value $NULL
Set-Variable -Scope Global -Name VersionSeperator -Value "~"
Set-Variable -Scope Global -Name Counter1 -Value 0
Set-Variable -Scope Global -Name LogFile -Value "$ScriptName`_$Timestamp2.log"
Set-Variable -Scope Global -Name LogFileKeepTime -Value 60
Set-Variable -Scope Global -Name LogPath -Value $NULL
Set-Variable -Scope Global -Name FileDelayAge -Value 5
Set-Variable -Scope Global -Name FileTest -Value $NULL
Set-Variable -Scope Global -Name PathTest -Value $NULL
Set-Variable -Scope Global -Name Module -Value $NULL
Set-Variable -Scope Global -Name Modules -Value ("Read-ConfigFile2","Write-LogFile","Remove-Item-withLogging","New-ComplexPassword-withLogging","Start-SQLDB-Query-withLogging","Update-ReplacePlaceholder-withLogging", "Test-Path-withLogging", "Test-FileState-withLogging")
Set-Variable -Scope Global -Name ModuleOverrideSourcePath -Value $NULL
Set-Variable -Scope Global -Name ModuleDefaultSourcePath -Value "P:\Skriptentwickung\released-and-published\Modules"
Set-Variable -Scope Global -Name ModuleHKLMRegistryPath -Value "HKLM:\SOFTWARE\Digital Data\Modules"
Set-Variable -Scope Global -Name ModuleHKCURegistryPath -Value "HKCU:\SOFTWARE\Digital Data\Modules"
Set-Variable -Scope Global -Name Profile -Value $NULL
Set-Variable -Scope Global -Name DBSQLConnect -Value $NULL
Set-Variable -Scope Global -Name DBSQLDataSet -Value $NULL
#-----------------------------------------------------------------------------------------------------#
############################################ set functions ############################################
#-----------------------------------------------------------------------------------------------------#
Function Load-PowerShellModule {
<#
.SYNOPSIS
Function will load external - additional - PowerShell Modules into current PSSession.
.DESCRIPTION
By working with Modules, this Function is necessary to load external Modul Functions into the current PowerShell Session.
In a productive Enviroment it is recommanded to let this Function set the Registry Key in HKLM for the ModuleSourcePath.
In develepment and Test Enviroment it is possible, to work with distributed Folders with different Modules. Therefor the Parameter
"ModuleOverrideSourcePath" and the preset Variable "ModuleDefaultSourcePath" are made for.
After a successful Import of a Module, Function will Return $True, otherwise a $False.
.REQUIREMENT General
PowerShell V3
.REQUIREMENT Assembly
System.Windows.Forms, PresentationCore, PresentationFramework
.REQUIREMENT Variables
ModuleOverrideSourcePath, ModuleName, Path, Paths, PathTest, FileTest, Result
.REQUIREMENT Variables preSet
ScriptName, ScriptPath, ModuleDefaultSourcePath (optional)
.REQUIREMENT Functions
<NONE>
.VERSION
1.1.0.0 / 22.02.2017
.PARAMETER ModuleName
Give the Module Name, you want to load into the current PSSession (without File-Extension).
.PARAMETER ModuleOverrideSourcePath
Optional Parameter. By giving the ModuleOverrideSourcePath, Function will not check other Paths for the Function you want to load.
.PARAMETER ModuleFileExtensions
Optional Parameter. Give the Module File-Extension (regular: "psm1" or "dll") without a dot ("."), this is just for the checking routine, not the Import itself.')]
.PARAMETER Force
Optional Parameter. By using the Force Parameter, Module will be unload and reload.
.EXAMPLE
Load-PowerShellModule -ModuleName Write-LogFile -ModuleFileExtensions psm1
.EXAMPLE
Load-PowerShellModule -ModuleName Write-LogFile -Force
.EXAMPLE
Load-PowerShellModule -ModuleName Write-LogFile -ModuleFileExtensions psm1 -ModuleOverrideSourcePath D:\ScriptFiles\Modules
#>
Param (
[Parameter(Position=0,Mandatory=$True,ValueFromPipeline=$True,HelpMessage='Give the ModuleName, you want to load into the current PSSession (without File-Extension)')]
[ValidateNotNullOrEmpty()]
[String]$ModuleName,
[Parameter(Position=1,Mandatory=$False,HelpMessage='Optional Parameter. By giving the ModuleOverrideSourcePath, Function will not check other Paths for the Function you want to load.')]
[ValidateNotNullOrEmpty()]
[String]$ModuleOverrideSourcePath,
[Parameter(Position=2,Mandatory=$False,HelpMessage='Optional Parameter. Give the Module File-Extension (regular: "psm1" or "dll") without a dot ("."), this is just for the checking routine, not the Import itself.')]
[ValidateSet("psm1","dll")]
[Array]$ModuleFileExtensions = @("psm1","dll"),
[Parameter(Position=3,Mandatory=$False,HelpMessage='Optional Parameter. By using the Force Parameter, Module will be unload and reload.')]
[Switch]$Force
) #end param
Process {
#Clear Error Variable
$error.clear()
#Loop for every possible File Extension (eg. psm1 and dll)
FOREACH ($ModuleFileExtension in $ModuleFileExtensions) {
#If FileExtension was given, remove it! Because otherwise "Import-Module" Function will have trouble importing.
$ModuleName = $ModuleName -Replace("\.[a-zA-Z0-9]{3,4}","")
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: You want to load Module $ModuleName.$ModuleFileExtension"
IF ((([String]::IsNullOrWhiteSpace($ScriptName) -ne $True) -and ([String]::IsNullOrEmpty($ScriptName) -ne $True)) -and (([String]::IsNullOrWhiteSpace($ScriptPath) -ne $True) -and ([String]::IsNullOrEmpty($ScriptPath) -ne $True))) {
#Try this if $ModuleOverrideSourcePath was given by calling the function
IF ((([String]::IsNullOrWhiteSpace($ModuleOverrideSourcePath)) -ne $True) -and (([String]::IsNullOrEmpty($ModuleOverrideSourcePath)) -ne $True)) {
Write-Host "DEBUG Info - Load-PowerShellModule: Function has been called with 'ModuleOverrideSourcePath' Parameter input!"
Write-Host "DEBUG Info - Load-PowerShellModule: Testing for existence: $ModuleOverrideSourcePath\$ModuleName.$ModuleFileExtension"
$FileTest = Test-Path -Path "$ModuleOverrideSourcePath\$ModuleName.$ModuleFileExtension" -PathType Leaf
IF ($FileTest -eq $True) {
Write-Host "DEBUG Info - Load-PowerShellModule: $ModuleOverrideSourcePath and ModuleName seems to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to import Module: $ModuleName.$ModuleFileExtension"
Try {
$Result = Import-Module $ModuleOverrideSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorAction SilentlyContinue
IF ("$Result" -eq "$ModuleName") {
Write-Host "DEBUG Info - Load-PowerShellModule: Successfully loaded Module: $ModuleName.$ModuleFileExtension"
Return $True
} #end if
ELSE {
Write-Error "DEBUG Info - Load-PowerShellModule: Unsuccessfully loaded Module: $ModuleName.$ModuleFileExtension"
Return $False
} #end else
} #end try
Catch {
Write-Host "DEBUG Info - Load-PowerShellModule: Error while importing the Module:"
Write-Host "DEBUG Info - Load-PowerShellModule: $ModuleName"
Write-Host $Error
Return $False
} #end catch
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: ModuleOverrideSourcePath and/or ModuleName seems not to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Cannot load Module, please check your input!"
Return $False
} #end else
} #end if
#If $ModuleOverrideSourcePath was not given, try to find a matching folder
ELSE {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Function has been called without 'ModuleOverrideSourcePath' Parameter input!"
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to find Module Files on some Places of this Computer."
#Set dynamic Array for locations Modul Path could be, even for some testing.
#The first value of the array is just a dummy and will never be used -but keep it for the array value starting with 0!
[System.Collections.ArrayList]$Paths = @()
Write-Host ""
$Paths.Add("$env:systemroot\") | Out-Null
IF (([String]::IsNullOrEmpty($ModuleDefaultSourcePath)) -or ([String]::IsNullOrWhiteSpace($ModuleDefaultSourcePath))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ModuleDefaultSourcePath was not set! That could be a normal behavior in productive enviroment!"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (1): $ModuleDefaultSourcePath" -ErrorAction SilentlyContinue
$Paths.Add("$ModuleDefaultSourcePath") | Out-Null
} #end else
IF ([String]::IsNullOrEmpty($ScriptPath) -or ([String]::IsNullOrWhiteSpace($ScriptPath))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ScriptPath is invalid! That is terrifying! How could that be???"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (2): $ScriptPath" -ErrorAction SilentlyContinue
$Paths.Add("$ScriptPath") | Out-Null
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (3): $($ScriptPath+"\Module")" -ErrorAction SilentlyContinue
$Paths.Add("$($ScriptPath+"\Module")") | Out-Null
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (4): $($ScriptPath+"\Modules")" -ErrorAction SilentlyContinue
$Paths.Add("$($ScriptPath+"\Modules")") | Out-Null
} #end else
IF (([String]::IsNullOrEmpty((Get-Item $ScriptPath).Parent.FullName)) -or ([String]::IsNullOrWhiteSpace((Get-Item $ScriptPath).Parent.FullName))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ScriptPath has no Parent Folders!"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (5): $((Get-Item $ScriptPath).Parent.FullName)" -ErrorAction SilentlyContinue
$Paths.Add("$((Get-Item $ScriptPath).Parent.FullName)") | Out-Null
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (6): $(((Get-Item $ScriptPath).Parent.FullName)+"\Module")" -ErrorAction SilentlyContinue
$Paths.Add("$(((Get-Item $ScriptPath).Parent.FullName)+"\Module")") | Out-Null
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (7): $(((Get-Item $ScriptPath).Parent.FullName)+"\Modules")" -ErrorAction SilentlyContinue
$Paths.Add("$(((Get-Item $ScriptPath).Parent.FullName)+"\Modules")") | Out-Null
} #end else
IF (([String]::IsNullOrEmpty($((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath))) -or ([String]::IsNullOrWhiteSpace($((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ModuleSourcePath was not set to Windows Registry (HKLM)!"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (8): $((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)" -ErrorAction SilentlyContinue
$Paths.Add("$((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)") | Out-Null
} #end else
IF (([String]::IsNullOrEmpty($((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath))) -or ([String]::IsNullOrWhiteSpace($((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ModuleSourcePath was not set to Windows Registry (HKCU)!"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (8): $((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)" -ErrorAction SilentlyContinue
$Paths.Add("$((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)") | Out-Null
} #end else
[Int]$Counter = 0
[String]$ModuleSourcePath = $Null
#Loop for multiple Pathtests - for each Path, where Module files could be
DO {
$Counter++
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Testing mutiple Paths ( $Counter of"($($Paths.Count)-1)") for existence, now testing:"
Write-Host "DEBUG Info - Load-PowerShellModule: $($Paths[$Counter])"
IF ((([String]::IsNullOrWhiteSpace($($Paths[$Counter]))) -ne $True) -and (([String]::IsNullOrEmpty($($Paths[$Counter])) -ne $True))) {
$PathTest = (Test-Path $($Paths[$Counter]) -ErrorAction SilentlyContinue)
IF ($PathTest -eq $True) {
Write-Host "DEBUG Info - Load-PowerShellModule: Yes, Path seems to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Lets check, if there are any Module Files, in it."
$FileTest = Get-ChildItem -Path $($Paths[$Counter]) -Filter *.$ModuleFileExtension
IF ($($FileTest.count) -gt 0) {
Write-Host "DEBUG Info - Load-PowerShellModule: Found $($FileTest.count) $ModuleFileExtension Module Files in Path!"
Set-Variable -Name ModuleSourcePath -Value $($Paths[$Counter]) -Scope local
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Found no $ModuleFileExtension Module Files in Path!"
} #end else
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: No, Path seems not to exist."
} #end else
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Path seems to be invalid!"
} #end else
} #end do
UNTIL ($Counter -ge ($($Paths.Count)-1) -or ($ModuleSourcePath -eq $($Paths[$Counter])))
IF ($ModuleSourcePath -eq $($Paths[$Counter])) {
$FileTest = (Test-Path -Path $ModuleSourcePath\$ModuleName.$ModuleFileExtension -PathType Leaf -ErrorAction SilentlyContinue)
IF ($FileTest -eq $True) {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to import Module: $ModuleName.$ModuleFileExtension"
Try {
$Result = Import-Module $ModuleSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorAction SilentlyContinue
IF ("$Result" -eq "$ModuleName") {
Write-Host "DEBUG Info - Load-PowerShellModule: Successfully loaded Module: $ModuleName.$ModuleFileExtension"
Set-Variable -Name ModuleDefaultSourcePath -Value $ModuleSourcePath -Scope Global
Return $True
} #end if
ELSE {
Write-Error "DEBUG Info - Load-PowerShellModule: Unsuccessfully loaded Module: $ModuleName.$ModuleFileExtension"
Return $False
} #end else
} #end try
Catch {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Loading Module: $ModuleName went wrong."
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this error!"
Write-Host $Error
Return $False
exit
} #end catch
} #end if
ELSE {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Module does not exist!"
Write-Host "DEBUG Info - Load-PowerShellModule: Skipping: $ModuleName.$ModuleFileExtension"
} #end else
} #end if
ELSE {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Cant locate Module Files automaticlly!"
Write-Host "DEBUG Info - Load-PowerShellModule: Please select Folder in Dialog."
#Prepare Folder Browser Dialog, to choose the Directory with the .psm1 Files.
$FolderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog
$FolderBrowserDialog.Rootfolder = "Desktop"
$FolderBrowserDialog.Description = "Please, choose the Folder, where the Module ""$ModuleName.$ModuleFileExtension"" is stored."
$FolderBrowserDialog.SelectedPath = "$ScriptPath"
$FolderBrowserDialog.ShowNewFolderButton = $True
DO {
#Now show the Folder Browser, if neccessary in a loop
$FolderBrowserDialogShow = $FolderBrowserDialog.ShowDialog()
#By pressing the OK Button..
If ($FolderBrowserDialogShow -eq "OK") {
#Save selected folder path in the variable
$ModuleSourcePath = ($FolderBrowserDialog.SelectedPath)
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: You choose: $ModuleSourcePath"
Write-Host "DEBUG Info - Load-PowerShellModule: ...testing, if Module ""$ModuleName.$ModuleFileExtension"" can be found there."
$FileTest = (Test-Path $ModuleSourcePath\$ModuleName.$ModuleFileExtension -PathType Leaf -ErrorAction SilentlyContinue)
IF ($FileTest -eq $True) {
Write-Host "DEBUG Info - Load-PowerShellModule: Module seems to exist, in the selected Folder."
Write-Host "DEBUG Info - Load-PowerShellModule: Now trying to load Module: $ModuleName.$ModuleFileExtension"
Try {
$Result = Import-Module $ModuleSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorAction SilentlyContinue
IF ("$Result" -eq "$ModuleName") {
Set-Variable -Name ModuleDefaultSourcePath -Value $ModuleSourcePath -Scope Global
$MessageBoxBody = "Module: $ModuleName.$ModuleFileExtension - successsfully loaded into current PSSession!"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Information"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null
} #end if
ELSE {
$MessageBoxBody = "Module: $ModuleName.$ModuleFileExtension - cannot load into current PSSession!"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null
} #end else
} #end try
Catch {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Loading Module: $ModuleName.$ModuleFileExtension went wrong."
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this error!"
Write-Host $Error
exit
} #end catch
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Module seems not to exist, in the selected Folder."
Write-Host "DEBUG Info - Load-PowerShellModule: Please, select another one! ...this Time the right!"
$MessageBoxBody = "Module seems not to exist, in the selected Folder! Please, select another one!"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null
} #end else
} #end if
#If you didnt pressed the OK Button..
Else {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Operation cancelled by user."
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this!"
exit
} #end else
} #end do
#Variable "$?" is $True when last operation was ok
UNTIL ((($FileTest -eq $True) -and ($? -eq $True)) -or ($FolderBrowserDialogShow -eq "Cancel"))
IF (([String]::IsNullOrWhiteSpace($ModuleSourcePath) -ne $True) -and ([String]::IsNullOrEmpty($ModuleSourcePath) -ne $True)) {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Should ModuleSourcePath written to Windows Registry?"
$MessageBoxBody = "Would you like to save the ModulePath to the Windows Registry?"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "YesNo"
$MessageBoxIcon = "Question"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
IF ($MessageBox -eq 'Yes') {
$PathTest = (Test-Path -Path "$ModuleHKLMRegistryPath" -ErrorAction SilentlyContinue)
$MessageBox = $NULL
IF ($PathTest -eq $False) {
Write-Host "DEBUG Info - Load-PowerShellModule: Registry Key seems not to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to write ModuleSourcepath to HKLM."
Try {
New-Item -Path "$ModuleHKLMRegistryPath" -Force -ErrorAction Stop | Out-Null
New-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null
} #end try
Catch {
Write-Host $Error
$MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Check your access rights! To bypass this issue you can write the ModuleSourcePath to User Registry (HKCU). Would you?"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "YesNo"
$MessageBoxIcon = "Question"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
} #end catch
} #end if
ELSEIF ($PathTest -eq $True) {
Write-Host "DEBUG Info - Load-PowerShellModule: Registry Key seems to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to write ModuleSourcepath to HKLM."
Try {
Set-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null
} #end try
Catch {
Write-Host $Error
$MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Check your access rights! To Bypass Error: Write ModuleSource Path to User Registry (HKCU)?"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "YesNo"
$MessageBoxIcon = "Question"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
} #end catch
} #end elseif
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Something went wrong, by getting the ModuleSourcePath!"
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this!"
exit
} #end else
#Block for trying to write the ModuleSourcePath to the User Registry, if System Registry failed.
IF ($MessageBox -eq 'Yes') {
$PathTest = (Test-Path -Path "$ModuleHKCURegistryPath" -ErrorAction SilentlyContinue)
$MessageBox = $NULL
IF ($PathTest -eq $False) {
Write-Host "DEBUG Info - Load-PowerShellModule: Registry Key seems not to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to write ModuleSourcepath to HKCU."
Try {
New-Item -Path "$ModuleHKCURegistryPath" -Force -ErrorAction Stop | Out-Null
New-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null
} #end try
Catch {
Write-Host $Error
$MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Not even to User Registry! Check your access rights! Exiting now.."
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
exit
} #end catch
} #end if
ELSEIF ($PathTest -eq $True) {
Write-Host "DEBUG Info - Load-PowerShellModule: Registry Key seems to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to write ModuleSourcepath to HKCU."
Try {
Set-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null
} #end try
Catch {
Write-Host $Error
$MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Not even to User Registry! Check your access rights! Exiting now.."
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
exit
} #end catch
} #end elseif
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Something went wrong, by getting the ModuleSourcePath!"
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this!"
exit
} #end else
} #end if
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: You choose, not to save the ModuleSourcePath to the Windows Registry!"
$MessageBoxBody = "You choose, not to save the ModuleSourcePath to the Windows Registry!"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
} #end else
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Something went wrong, by getting the ModuleSourcePath!"
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this!"
exit
} #end else
} #end else
} #end else
} #end if
ELSE {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Required Variables (ScriptName and ScriptPath) were not set!"
Write-Host "DEBUG Info - Load-PowerShellModule: Module Import is unvailable without this Variables!"
} #end else
} #end foreach
} #end process
} #end function
#-----------------------------------------------------------------------------------------------------#
########################################### preparing part ############################################
#-----------------------------------------------------------------------------------------------------#
#Clear Console Content
Clear-Host
#Load external Modules - use Force ( -Force) Parameter, to reload in every run
FOREACH ($Module in $Modules) {
$Result = Load-PowerShellModule -ModuleName $Module -Force
IF ($Result -eq $False) {
Write-Host "DEBUG Info: Module: $Module was not successful been loaded!"
Write-Host "DEBUG Info: Please load the Module and try again, running this Function/Module!"
Write-Host "DEBUG Info: Exiting, because of this Issue."
Write-Host $Error
EXIT
} #end if
} #end foreach
#Read ConfigFile and load its content into a Object
[OBJECT]$ConfigFileContent = Read-ConfigFile2 -ConfigFile $ConfigFile
#Allocate Variable Values, depending on the read ConfigFile
[ARRAY]$LogPaths = $ConfigFileContent."LogPath_$($ConfigFileContent.LogPath[0])"
[STRING]$LogFileKeepTime = $ConfigFileContent."LogFileKeepTime_$($ConfigFileContent.LogFileKeepTime[0])"
[STRING]$FileDelayAge = $ConfigFileContent."FileDelayAge_$($ConfigFileContent.FileDelayAge[0])"
#Create Object for the database connection
Try {
[OBJECT]$DBSQLConnect = New-Object PSObject -ErrorAction Stop
Add-Member -InputObject $DBSQLConnect -MemberType NoteProperty -Name DBSQLConnectServer -Value $ConfigFileContent."DBSQLConnectServer_$($ConfigFileContent.DBSQLConnectServer[0])" -ErrorAction Stop
Add-Member -InputObject $DBSQLConnect -MemberType NoteProperty -Name DBSQLConnectUserName -Value $ConfigFileContent."DBSQLConnectUserName_$($ConfigFileContent.DBSQLConnectUserName[0])" -ErrorAction SilentlyContinue
Add-Member -InputObject $DBSQLConnect -MemberType NoteProperty -Name DBSQLConnectUserPassword -Value $ConfigFileContent."DBSQLConnectUserPassword_$($ConfigFileContent.DBSQLConnectUserPassword[0])" -ErrorAction SilentlyContinue
Add-Member -InputObject $DBSQLConnect -MemberType NoteProperty -Name DBSQLConnectDatabase -Value $ConfigFileContent."DBSQLConnectDatabase_$($ConfigFileContent.DBSQLConnectDatabase[0])" -ErrorAction Stop
Add-Member -InputObject $DBSQLConnect -MemberType NoteProperty -Name DBSQLConnectIntegratedSecurity -Value $ConfigFileContent."DBSQLConnectIntegratedSecurity_$($ConfigFileContent.DBSQLConnectIntegratedSecurity[0])" -ErrorAction SilentlyContinue
} #end try
Catch {
Write-Logfile -LogLine " "
Write-Logfile -LogLine "Error creating Object for: DBSQLConnect"
Write-Logfile -LogLine "Property Value is missing or invalid!"
} #end catch
#Create Object for Profile, the most Propertys of it will be rewritten in the main loop
Try {
[OBJECT]$Profile = New-Object PSObject -ErrorAction Stop
Add-Member -InputObject $Profile -MemberType NoteProperty -Name Counter -Value 0 -ErrorAction Stop
Add-Member -InputObject $Profile -MemberType NoteProperty -Name Count -Value "$($ConfigFileContent.Profile[0])" -ErrorAction Stop
Add-Member -InputObject $Profile -MemberType NoteProperty -Name ImportMethode -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name ImportFormat -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name SourcePath -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name SourceFileStartLine -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name SourceFileEndLine -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name ValueSeperator -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name ArchivPath -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name ErrorPath -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name CheckSQLQuery -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name CheckSQLResult -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name InitialSQLQuery -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name InitialSQLResult -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name PreparingSQLQuery -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name PreparingSQLResult -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name MainLoopSQLQuery -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name FinalSQLQuery -Value $NULL -ErrorAction SilentlyContinue
Add-Member -InputObject $Profile -MemberType NoteProperty -Name FinalSQLResult -Value $NULL -ErrorAction SilentlyContinue
} #end try
Catch {
Write-Logfile -LogLine " "
Write-Logfile -LogLine "Error creating Object for: Profile"
Write-Logfile -LogLine "Property Value is missing or invalid!"
Add-Member -InputObject $Profile -MemberType NoteProperty -Name Count -Value 0 -Force -ErrorAction Stop
} #end catch
#-----------------------------------------------------------------------------------------------------#
############################################# main part ###############################################
#-----------------------------------------------------------------------------------------------------#
#Clear Error Variable
$Error.Clear() | Out-Null
#Clear Console Output
Clear-Host
Write-Logfile -LogLine " "
Write-Logfile -LogLine "********************************************************************************"
Write-Logfile -LogLine "Program Startup: $ScriptName on $env:COMPUTERNAME,"
Write-Logfile -LogLine "from Account $env:USERDOMAIN\$env:USERNAME."
Write-Logfile -LogLine "********************************************************************************"
#Start main part, if there is at least one profile defined
IF ($Profile.Count -gt 0) {
Write-Logfile -LogLine " "
Write-Logfile -LogLine "Found $($Profile.Count) Profile(s) to process."
#Loop for every Profile configured. Every Profile is one line in the ConfigFile.
DO {
$Profile.Counter++ | Out-Null
Write-Logfile -LogLine " "
Write-Logfile -LogLine "--------------------------------------------------------------------------------"
Write-Logfile -LogLine "This is Profile: $($Profile.Counter) of $($Profile.Count)"
Write-Logfile -LogLine "--------------------------------------------------------------------------------"
TRY {
$Profile.ImportMethode = ($ConfigFileContent."Profile_$($Profile.Counter)")[0]
Write-Logfile -LogLine "Configured ImportMethode is: $($Profile.ImportMethode)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.ImportFormat = ($ConfigFileContent."Profile_$($Profile.Counter)")[1]
Write-Logfile -LogLine "Configured ImportFormat is: $($PROFILE.ImportFormat)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.SourcePath = ($ConfigFileContent."Profile_$($Profile.Counter)")[2]
Write-Logfile -LogLine "Configured SourcePath is: $($Profile.SourcePath)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.SourceFileStartLine = ($ConfigFileContent."Profile_$($Profile.Counter)")[3]
$Profile.SourceFileStartLine = ($Profile.SourceFileStartLine-1)
Write-Logfile -LogLine "Configured SourceFileStartLine is: $($Profile.SourceFileStartLine)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.SourceFileEndLine = ($ConfigFileContent."Profile_$($Profile.Counter)")[4]
$Profile.SourceFileEndLine = ($Profile.SourceFileEndLine-1)
Write-Logfile -LogLine "Configured SourceFileEndLine is: $($Profile.SourceFileEndLine)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.ValueSeperator = ($ConfigFileContent."Profile_$($Profile.Counter)")[5]
$Profile.ValueSeperator = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $PROFILE.ValueSeperator
} #end try
CATCH {
} #end catch
TRY {
$Profile.ArchivPath = ($ConfigFileContent."Profile_$($Profile.Counter)")[6]
#$Profile.ArchivPath = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $PROFILE.ArchivPath
Write-Logfile -LogLine "Configured ArchivPath is: $($Profile.ArchivPath)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.ErrorPath = ($ConfigFileContent."Profile_$($Profile.Counter)")[7]
$Profile.ErrorPath = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $PROFILE.ErrorPath
Write-Logfile -LogLine "Configured ErrorPath is: $($Profile.ErrorPath)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.CheckSQLQuery = ((($ConfigFileContent."Profile_CheckSQLQuery_$($Profile.Counter)")[0..999]) | Out-String)
Write-Logfile -LogLine "Configured CheckSQLQuery is: $($Profile.CheckSQLQuery)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.InitialSQLQuery = ((($ConfigFileContent."Profile_InitialSQLQuery_$($Profile.Counter)")[0..999]) | Out-String)
Write-Logfile -LogLine "Configured InitialSQLQuery is: $($Profile.InitialSQLQuery)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.PreparingSQLQuery = ((($ConfigFileContent."Profile_PreparingSQLQuery_$($Profile.Counter)")[0..999]) | Out-String)
Write-Logfile -LogLine "Configured PreparingSQLQuery is: $($Profile.PreparingSQLQuery)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.MainLoopSQLQuery = ((($ConfigFileContent."Profile_MainLoopSQLQuery_$($Profile.Counter)")[0..999]) | Out-String)
Write-Logfile -LogLine "Configured MainLoopSQLQuery is: $($Profile.MainLoopSQLQuery)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.FinalSQLQuery = ((($ConfigFileContent."Profile_FinalSQLQuery_$($Profile.Counter)")[0..999]) | Out-String)
Write-Logfile -LogLine "Configured FinalSQLQuery is: $($Profile.FinalSQLQuery)"
} #end try
CATCH {
} #end catch
TRY {
$Profile.SourcePath = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $PROFILE.SourcePath
$SourceFiles = (Get-ChildItem -Path $Profile.SourcePath | where { $_.lastwritetime -lt $((Get-Date).AddMinutes(-$FileDelayAge)) -and -not $_.psiscontainer})
Write-Logfile -LogLine " "
Write-Logfile -LogLine "Found $($SourceFiles.count) File(s) in SourcePath."
} #end try
CATCH {
Write-Logfile -LogLine " "
Write-Logfile -LogLine "Error getting File(s) in SourcePath."
} #end catch
IF ($($SourceFiles.count) -gt 0) {
FOREACH ($SourceFile in $SourceFiles) {
IF ((Test-FileState-withLogging -SourceFile $SourceFile -Action writetest) -eq "writeable" ) {
#Converting foreach Object to a global object, otherwise called subfunctions cannot access properties
[OBJECT]$Global:SourceFile = $SourceFile
IF (($Profile.ImportMethode) -eq "BulkImport") {
TRY {
Write-Logfile -LogLine "Trying to get content of $SourceFile"
Add-Member -InputObject $SourceFile -MemberType NoteProperty -Name Content -Value (Get-Content -Path $($SourceFile.FullName) -ErrorAction Stop) -Force
Add-Member -InputObject $SourceFile -MemberType NoteProperty -Name ContentLines -Value ($SourceFile.Content | Convertfrom-csv -Delimiter ; -ErrorAction Stop) -Force
Add-Member -InputObject $SourceFile -MemberType NoteProperty -Name ColumnNames -Value ($SourceFile.Content[$($Profile.SourceFileStartLine)] -Split ';') -Force
Add-Member -InputObject $SourceFile -MemberType NoteProperty -Name ColumnCount -Value ($($SourceFile.ColumnNames.count)) -Force
Add-Member -InputObject $SourceFile -MemberType NoteProperty -Name ColumnCounter -Value 0 -Force
Add-Member -InputObject $SourceFile -MemberType NoteProperty -Name LineCount -Value ($($SourceFile.Content.get_Count())) -Force
Add-Member -InputObject $SourceFile -MemberType NoteProperty -Name LineCounter -Value 0 -Force
Add-Member -InputObject $SourceFile -MemberType NoteProperty -Name CellValue -Value $NULL -Force
Write-Logfile -LogLine "Read $($SourceFile.ColumnCount) column(s) and"
Write-Logfile -LogLine "$($SourceFile.LineCount) line(s) from the SourceFile."
#Differ between reading all lines in file, or only limited lines
IF ((($Profile.SourceFileEndLine) -contains "max") -or (($Profile.SourceFileEndLine) -contains "dyn")) {
Write-Logfile -LogLine "Should read the SourceFile to the End."
TRY {
$SourceFile.ContentLines = $SourceFile.ContentLines[$($($Profile.SourceFileStartLine))..$($SourceFile.Content.get_Count())]
Write-Logfile -LogLine "File was completely read!"
} #end try
CATCH {
$SourceFile.ContentLines = $SourceFile.ContentLines[$($($Profile.SourceFileStartLine))..$($($Profile.SourceFileEndLine))]
} #end catch
} #end if
ELSE {
Write-Logfile -LogLine "Should read the SourceFile only until line $($Profile.SourceFileEndLine)."
TRY {
$SourceFile.ContentLines = $SourceFile.ContentLines[$($($Profile.SourceFileStartLine))..$($($Profile.SourceFileEndLine))]
Write-Logfile -LogLine "File was read until line $($Profile.SourceFileEndLine)!"
} #end try
CATCH {
$SourceFile.ContentLines = $SourceFile.ContentLines[$($($Profile.SourceFileStartLine))..$($SourceFile.Content.get_Count())]
} #end catch
} #end else
} #end try
CATCH {
Write-Logfile -LogLine "Error reading File!"
Write-Logfile -LogLine "Exiting because of this Issue!"
break
} #end catch
} #end if
ELSEIF (($Profile.ImportMethode) -eq "ExcelImport") {
Try {
Write-Logfile -LogLine " "
Write-Logfile -LogLine "Excel Import Methode was choosen."
#ToDo:
#$dateipfad = "C:\Users\KammM\Downloads\Kundennummern_Aktive_20180509.xlsx"
#$tabelle = "Tabelle1"
#[int]$zeile = 2
#[int]$spalte = 1
#
#$Excel = New-Object -ComObject excel.application # Excel starten
#$Excel.Visible = $false
#$Workbook = $Excel.Workbooks.Open($dateipfad)
#$Table =$workbook.Worksheets.Item($tabelle)
#$DerWert = $Table.Cells.Item($zeile,$spalte).Text
#do {
#$DerWert = $Table.Cells.Item($zeile,$spalte).Text
#
#IF ($DerWert -gt 0) {
#
#Write-Host $DerWert
#
#}
#
#$zeile++
#}
#while($Table.Cells.Item($zeile,$spalte).Text.Length -gt 0)
#
#$Excel.Quit()
#[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
} #end try
Catch {
Write-Logfile -LogLine " "
Write-Logfile -LogLine "Cannot read SourceFile: $($Profile.SourceFile)"
Write-Logfile -LogLine "or Excel installation is may be corrupted."
Write-Logfile -LogLine "Check File and access rights!"
Write-Logfile -LogLine "Exiting, because of this Issue."
break
} #end catch
} #end elseif
ELSE {
Write-Logfile -LogLine " "
Write-Logfile -LogLine "No valid Import Methode was choosen."
Write-Logfile -LogLine "Use 'BulkImport' or 'ExcelImport' in ConfigFile, please!"
Write-Logfile -LogLine "Exiting, because of this Issue."
break
} #end else
IF (!([String]::IsNullOrEmpty($Profile.CheckSQLQuery)) -and (!([String]::IsNullOrWhiteSpace($Profile.CheckSQLQuery)))) {
TRY {
$Profile.CheckSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.CheckSQLQuery
$Profile.CheckSQLResult = Start-SQLDB-Query-withLogging -DBSQLConnectServer $($DBSQLConnect.DBSQLConnectServer) -DBSQLConnectUser $($DBSQLConnect.DBSQLConnectUserName) -DBSQLConnectPassword $($DBSQLConnect.DBSQLConnectUserPassword) -DBSQLConnectDatabase $($DBSQLConnect.DBSQLConnectDatabase) -DBSQLConnectIntegratedSecurity $($DBSQLConnect.DBSQLConnectIntegratedSecurity) -DBSQLQuery $Profile.CheckSQLQuery
$Profile.CheckSQLResult = $($Profile.CheckSQLResult.Tables[0].rows[0][0])
} #end try
CATCH {
$Profile.CheckSQLResult = "error"
} #end catch
#go on if CheckSQLResult was true
IF (($Profile.CheckSQLResult -eq "true") -or ($Profile.CheckSQLResult -contains "true") -or ($Profile.CheckSQLResult -match "true")) {
IF (!([String]::IsNullOrEmpty($Profile.InitialSQLQuery)) -and (!([String]::IsNullOrWhiteSpace($Profile.InitialSQLQuery)))) {
$Profile.InitialSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.InitialSQLQuery
$Profile.InitialSQLResult = Start-SQLDB-Query-withLogging -DBSQLQueryType read -DBSQLConnectServer $($DBSQLConnect.DBSQLConnectServer) -DBSQLConnectUser $($DBSQLConnect.DBSQLConnectUserName) -DBSQLConnectPassword $($DBSQLConnect.DBSQLConnectUserPassword) -DBSQLConnectDatabase $($DBSQLConnect.DBSQLConnectDatabase) -DBSQLConnectIntegratedSecurity $($DBSQLConnect.DBSQLConnectIntegratedSecurity) -DBSQLQuery $Profile.InitialSQLQuery
$Profile.InitialSQLResult = $($Profile.InitialSQLResult.Tables[0].rows[0][0])
} #end if
ELSE {
Write-LogFile -LogLine "Missing 'Profile_InitialSQLQuery =' block in ConfigFile!"
} #end else
IF (!([String]::IsNullOrEmpty($Profile.PreparingSQLQuery)) -and (!([String]::IsNullOrWhiteSpace($Profile.PreparingSQLQuery)))) {
$Profile.PreparingSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.PreparingSQLQuery -findplaceholder "%InitialSQLResult%" -replaceplaceholder $($Profile.InitialSQLResult)
$Profile.PreparingSQLResult = Start-SQLDB-Query-withLogging -DBSQLQueryType read -DBSQLConnectServer $($DBSQLConnect.DBSQLConnectServer) -DBSQLConnectUser $($DBSQLConnect.DBSQLConnectUserName) -DBSQLConnectPassword $($DBSQLConnect.DBSQLConnectUserPassword) -DBSQLConnectDatabase $($DBSQLConnect.DBSQLConnectDatabase) -DBSQLConnectIntegratedSecurity $($DBSQLConnect.DBSQLConnectIntegratedSecurity) -DBSQLQuery $Profile.PreparingSQLQuery
$Profile.PreparingSQLResult = $($Profile.PreparingSQLResult.Tables[0].rows[0][0])
} #end if
ELSE {
Write-LogFile -LogLine "Missing 'Profile_PreparingSQLQuery =' block in ConfigFile!"
} #end else
IF (!([String]::IsNullOrEmpty($Profile.MainLoopSQLQuery)) -and (!([String]::IsNullOrWhiteSpace($Profile.MainLoopSQLQuery)))) {
#loop for every line in read text/csv file, except column healines
$SourceFile.ContentLines | ForEach-Object {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "Starting processing for each line: Current $($SourceFile.LineCounter) of $($SourceFile.LineCount)"
$SourceFile.ColumnCounter = 0
$Profile.MainLoopSQLQuery = ((($ConfigFileContent."Profile_MainLoopSQLQuery_$($Profile.Counter)")[0..999]) | Out-String)
$Profile.MainLoopSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.MainLoopSQLQuery -findplaceholder "%InitialSQLResult%" -replaceplaceholder $($Profile.InitialSQLResult)
$Profile.MainLoopSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.MainLoopSQLQuery -findplaceholder "%PreparingSQLResult%" -replaceplaceholder $($Profile.PreparingSQLResult)
#loop for every column in read text/csv file
DO {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "Starting processing for each column: Current $($SourceFile.ColumnCounter) of $($SourceFile.ColumnCount)"
$SourceFile.CellValue = $Profile.ImportFormat
$SourceFile.CellValue = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $SourceFile.CellValue -findplaceholder "%ColumnName%" -replaceplaceholder $SourceFile.ColumnNames[$($SourceFile.ColumnCounter)]
$SourceFile.CellValue = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $SourceFile.CellValue -findplaceholder "%CellValue%" -replaceplaceholder $(($_).$($SourceFile.ColumnNames[$($SourceFile.ColumnCounter)]))
$SourceFile.CellValue = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $SourceFile.CellValue -findplaceholder "%InitialSQLResult%" -replaceplaceholder $($Profile.InitialSQLResult)
$SourceFile.CellValue = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $SourceFile.CellValue -findplaceholder "%PreparingSQLResult%" -replaceplaceholder $($Profile.PreparingSQLResult)
Write-LogFile -LogLine "Current value of line: $($SourceFile.LineCounter), column number: $($SourceFile.ColumnCounter) - column name: $($SourceFile.ColumnNames[$($SourceFile.ColumnCounter)])"
Write-LogFile -LogLine "$($SourceFile.CellValue)"
IF (!([String]::IsNullOrEmpty($_.$($SourceFile.ColumnNames[$($SourceFile.ColumnCounter)]))) -and !([String]::IsNullOrWhiteSpace($_.$($SourceFile.ColumnNames[$($SourceFile.ColumnCounter)])))) {
Write-LogFile -LogLine "Valid Value found in this cell!"
$Profile.MainLoopSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.MainLoopSQLQuery -findplaceholder "%column$(($($SourceFile.ColumnCounter))+1)%" -replaceplaceholder $SourceFile.CellValue
} #end if
ELSE {
Write-LogFile -LogLine "No or invalid Value found in this cell!"
} #end else
$SourceFile.ColumnCounter++ | Out-Null
} #end do
UNTIL (($($SourceFile.ColumnCounter) -ge $($SourceFile.ColumnNames.count)) -or ($Profile.MainLoopSQLQuery -notmatch "%[a-zA-Z]{1,}[0-9]{1,}\%"))
#If there are more Placeholders in the SQL Query then columns in SourceFile exist, replace them with NULL
DO {
Write-LogFile -LogLine "Purging unused Placeholders with NULL"
$Profile.MainLoopSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.MainLoopSQLQuery -findplaceholder "%[a-zA-Z]{1,}[0-9]{1,}\%" -replaceplaceholder NULL
$Profile.MainLoopSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.MainLoopSQLQuery -findplaceholder "'NULL'" -replaceplaceholder NULL
} #end do
UNTIL ($Profile.MainLoopSQLQuery -notmatch "\%[a-zA-Z]{1,}[0-9]{1,}\%")
Start-SQLDB-Query-withLogging -DBSQLQueryType write -DBSQLConnectServer $($DBSQLConnect.DBSQLConnectServer) -DBSQLConnectUser $($DBSQLConnect.DBSQLConnectUserName) -DBSQLConnectPassword $($DBSQLConnect.DBSQLConnectUserPassword) -DBSQLConnectDatabase $($DBSQLConnect.DBSQLConnectDatabase) -DBSQLConnectIntegratedSecurity $($DBSQLConnect.DBSQLConnectIntegratedSecurity) -DBSQLQuery $Profile.MainLoopSQLQuery
$SourceFile.LineCounter++ | Out-Null
} #end foreach
} #end if
ELSE {
Write-LogFile -LogLine "Missing 'Profile_MainLoopSQLQuery =' block in ConfigFile!"
Write-LogFile -LogLine "Exiting because of this Issue!"
break
} #end else
IF (!([String]::IsNullOrEmpty($Profile.FinalSQLQuery)) -and (!([String]::IsNullOrWhiteSpace($Profile.FinalSQLQuery)))) {
$Profile.FinalSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.FinalSQLQuery -findplaceholder "%InitialSQLResult%" -replaceplaceholder $($Profile.InitialSQLResult)
$Profile.FinalSQLQuery = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $Profile.FinalSQLQuery -findplaceholder "%PreparingSQLResult%" -replaceplaceholder $($Profile.PreparingSQLResult)
$Profile.FinalSQLResult = Start-SQLDB-Query-withLogging -DBSQLConnectServer $($DBSQLConnect.DBSQLConnectServer) -DBSQLConnectUser $($DBSQLConnect.DBSQLConnectUserName) -DBSQLConnectPassword $($DBSQLConnect.DBSQLConnectUserPassword) -DBSQLConnectDatabase $($DBSQLConnect.DBSQLConnectDatabase) -DBSQLConnectIntegratedSecurity $($DBSQLConnect.DBSQLConnectIntegratedSecurity) -DBSQLQuery $Profile.FinalSQLQuery
} #end if
ELSE {
Write-LogFile -LogLine "Missing 'Profile_FinalSQLQuery =' block in ConfigFile!"
} #end else
Write-LogFile -LogLine " "
Write-LogFile -LogLine "File processing completed!"
TRY {
$Profile.ArchivPath = Update-ReplacePlaceholder-withLogging -StringWithPlaceHolder $PROFILE.ArchivPath
IF ((Test-Path-withLogging -Path $($PROFILE.ArchivPath)) -eq $True) {
Write-LogFile -LogLine "Trying to move File to Archiv Directory."
Move-Item -Path $SourceFile -Destination $($PROFILE.ArchivPath) -Force -ErrorAction Stop
Write-LogFile -LogLine "File has moved to"
Write-LogFile -LogLine "$($PROFILE.ArchivPath)"
} #end if
ELSE {
Write-LogFile -LogLine "Error creating Path:"
Write-LogFile -LogLine "$($PROFILE.ArchivPath)"
} #end else
} #end try
CATCH {
Write-LogFile -LogLine "Error moving File after processing, to:"
Write-LogFile -LogLine "$($PROFILE.ArchivPath)"
} #end catch
} #end if
ELSE {
Write-LogFile -LogLine "CheckSQLResult results with: $($Profile.CheckSQLResult),"
Write-LogFile -LogLine "but must be 'true', to proceed!"
Write-LogFile -LogLine "CheckSQLQuery in ConfigFile!"
} #end else
} #end if
ELSE {
Write-LogFile -LogLine "Missing 'Profile_CheckSQLQuery =' block in ConfigFile!"
Write-LogFile -LogLine "There must be always a 'true' in Result"
Write-LogFile -LogLine "Like: SELECT 'true'"
} #end else
} #end if
ELSE {
Write-LogFile -LogLine "File is in a not writeable state, skipping..."
} #end else
} #end foreach
} #end if
ELSE {
Write-LogFile -LogLine "Nothing to process here!"
} #end else
} #end do
UNTIL ($($Profile.Counter) -eq $($Profile.Count))
} #end if
ELSE {
Write-Logfile -LogLine " "
Write-Logfile -LogLine "No Profiles are defined!"
Write-Logfile -LogLine "Check ConfigFile, please."
} #end else
Write-Logfile -LogLine " "
Write-Logfile -LogLine "--------------------------------------------------------------------------------"
Write-Logfile -LogLine "Checking for old LogFiles."
Write-Logfile -LogLine "--------------------------------------------------------------------------------"
Remove-Item-withLogging -Path $LogPath -FileKeepTime $LogFileKeepTime -FileBaseName $ScriptName
Write-Logfile -LogLine " "
Write-Logfile -LogLine "********************************************************************************"
Write-Logfile -LogLine "Program Completed: $ScriptName on $env:COMPUTERNAME,"
Write-Logfile -LogLine "from Account $env:USERDOMAIN\$env:USERNAME."
Write-Logfile -LogLine "********************************************************************************"
#-----------------------------------------------------------------------------------------------------#
########################################### finishing part ############################################
#-----------------------------------------------------------------------------------------------------#
#Enable only for debugging
#exit
Remove-Variable -Name ScriptName -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ScriptPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ConfigFile -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ConfigFileContent -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Timestamp1 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Timestamp2 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Timestamp3 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Timestamp4 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Item -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Items -Force -ErrorAction SilentlyContinue
Remove-Variable -Name VersionSeperator -Force -ErrorAction SilentlyContinue
Remove-Variable -Name FileDelayAge -Force -ErrorAction SilentlyContinue
Remove-Variable -Name FileTest -Force -ErrorAction SilentlyContinue
Remove-Variable -Name PathTest -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Result -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Counter1 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name LogFile -Force -ErrorAction SilentlyContinue
Remove-Variable -Name LogFileKeepTime -Force -ErrorAction SilentlyContinue
Remove-Variable -Name LogPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name LogPaths -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Module -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Modules -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ModuleOverrideSourcePath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ModuleDefaultSourcePath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ModuleHKLMRegistryPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ModuleHKCURegistryPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Profile -Force -ErrorAction SilentlyContinue
Remove-Variable -Name DBSQLConnect -Force -ErrorAction SilentlyContinue
Remove-Variable -Name DBSQLDataSet -Force -ErrorAction SilentlyContinue
Remove-Variable -Name SourceFile -Force -ErrorAction SilentlyContinue
Remove-Variable -Name SourceFiles -Force -ErrorAction SilentlyContinue
$error.clear()