# PowerShell 4.0 Script # EMC² QuickScan Job Script zur automatischen # Abarbeitung von Scan Dateien. # Digital Data # Ludwig-Rinn-Strasse 16 # 35452 Heuchelheim # Tel.: 0641 / 202360 # E-Mail: info@didalog.de # Version 1.0 # Letzte Aktualisierung: 05.08.2014 # Mindestanforderung für dieses Skript: # Microsoft Windows 7 SP1 / Server 2008 R2 SP1 -> siehe KB976932 # Microsoft .NET Framework 4.5 -> siehe KB2858728 # Microsoft PowerShell 4.0 -> siehe KB2819745 # WICHTIG: Falls sich dieses Skript nicht ausführen lässt, # muss dieser PS-Befehl noch mit administrativen Rechten ausgeführt werden: # set-executionpolicy unrestricted #Requires –Version 4.0 #----------------------------------------------------------------------------------------------------- ############################ Zusätzliche Assemblys hinzufügen bzw. laden. ############################ #----------------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------- ######################################## Variablen definieren. ####################################### #----------------------------------------------------------------------------------------------------- Set-Variable -Name ScriptName -Value (($MyInvocation.MyCommand.Name) -split "\.")[0].ToString() -Scope script Set-Variable -Name ScriptPath -Value (Split-Path ($MyInvocation.MyCommand.Path)) -Scope script Set-Variable -Name ConfigFile -Value "$ScriptPath\$ScriptName`_Settings.ini" -Scope script Set-Variable -Name ConfigValues -Value $NULL -Scope script Set-Variable -Name Timestamp1 -Value $(Get-Date -Format 'ddMMyyyy_HHmmss') -Scope script Set-Variable -Name Fehler -Value $NULL -Scope local Set-Variable -Name LogDatei -Value "$ScriptName`_$ZeitStempel1.log" -Scope script Set-Variable -Name LogEintrag -Value $NULL -Scope local Set-Variable -Name LogPathListe -Value $NULL -Scope script Set-Variable -Name LogPath -Value $NULL -Scope script Set-Variable -Name LogPathEintrag -Value $NULL -Scope script Set-Variable -Name LogKeepTime -Value 60 -Scope script Set-Variable -Name FileDelayAge -Value 5 -Scope script Set-Variable -Name Item -Value $NULL -Scope local Set-Variable -Name Items -Value $NULL -Scope local Set-Variable -Name Path -Value $NULL -Scope local Set-Variable -Name PathTest -Value $NULL -Scope local Set-Variable -Name ProzessTest -Value $NULL -Scope local Set-Variable -Name VersionSeperator -Value '~' -Scope local Set-Variable -Name FileSeperator -Value '' Set-Variable -Name QSEXEFile -Value $NULL -Scope script Set-Variable -Name QSProcess -Value $NULL -Scope script Set-Variable -Name QSEXEArgument1 -Value $NULL -Scope script Set-Variable -Name QSEXEArgument2 -Value $NULL -Scope script Set-Variable -Name QSEXEArgument3 -Value $NULL -Scope script Set-Variable -Name QSFileWhiteList -Value $NULL -Scope script Set-Variable -Name QSFileBlackList -Value $NULL -Scope script Set-Variable -Name QSProfileExtension -Value *.qsp -Scope script Set-Variable -Name QSProfilePath -Value $NULL -Scope script Set-Variable -Name QSProfileListe -Value $NULL -Scope script Set-Variable -Name QSProfileEintrag -Value $NULL -Scope script Set-Variable -Name PDFCreatorEXE -Value $NULL -Scope script Set-Variable -Name PDFCreatorConvertMasterSwitch -Value $NULL -Scope script Set-Variable -Name PDFCreatorConvertGlobal -Value $NULL -Scope script Set-Variable -Name PDFCreatorFileWhiteList -Value $NULL -Scope script Set-Variable -Name PDFCreatorFileBlackList -Value $NULL -Scope script Set-Variable -Name PDFCreatorProcess -Value $NULL -Scope script Set-Variable -Name PDFCreatorEXEArgument1 -Value '/NOSTART /IF"' -Scope script Set-Variable -Name PDFCreatorEXEArgument2 -Value "" -Scope script Set-Variable -Name PDFCreatorEXEArgument3 -Value '"/OF"' -Scope script Set-Variable -Name PDFCreatorEXEArgument4 -Value "" -Scope script Set-Variable -Name PDFCreatorEXEArgument5 -Value '"/DeleteIF /OutputSubFormat"PDF/A-1b"' -Scope script Set-Variable -Name InputPath -Value "E:\Dokumentverarbeitung\Input" -Scope script Set-Variable -Name TempPath -Value "E:\Dokumentverarbeitung\Temp" -Scope script Set-Variable -Name OutputPath -Value "E:\Dokumentverarbeitung\Output" -Scope script Set-Variable -Name ArchivPath -Value "E:\Dokumentverarbeitung\Archiv" -Scope script Set-Variable -Name ArchivRemove -Value 60 -Scope script Set-Variable -Name RunEXE -Value $NULL -Scope script Set-Variable -Name RunEXETimeout -Value 300 -Scope script Set-Variable -Name RunEXEZeile -Value $NULL -Scope script Set-Variable -Name RunEXEListe -Value $NULL -Scope script Set-Variable -Name RunCMD -Value $NULL -Scope script Set-Variable -Name RunCMDTimeout -Value 300 -Scope script Set-Variable -Name RunCMDZeile -Value $NULL -Scope script Set-Variable -Name RunCMDListe -Value $NULL -Scope script Set-Variable -Name RunVBS -Value $NULL -Scope script Set-Variable -Name RunVBSTimeout -Value 300 -Scope script Set-Variable -Name RunVBSZeile -Value $NULL -Scope script Set-Variable -Name RunVBSListe -Value $NULL -Scope script Set-Variable -Name RunPSS -Value $NULL -Scope script Set-Variable -Name RunPSSTimeout -Value 300 -Scope script Set-Variable -Name RunPSSZeile -Value $NULL -Scope script Set-Variable -Name RunPSSListe -Value $NULL -Scope script #----------------------------------------------------------------------------------------------------- ####################################### Funktionen definieren. ####################################### #----------------------------------------------------------------------------------------------------- Function Func-Path-Check { <# .SYNOPSIS Function will check the given Path for existence. .DESCRIPTION Function will check the given Path for existence. If Path isn´t existence Function will try to create it. .REQUIREMENT PowerShell V2 and Function "Func-Write-Logfile". .VERSION 1.0 / 06.11.2014 .EXAMPLE Func-Path-Check -Path "E:\Path\to\check" .EXAMPLE Func-Path-Check -Path "E:\Path\to\create" .PARAMETER Path Give the full Path you want to check or create. #> Param ( [String]$Path ) $PathTest = Test-Path -PathType Container $Path Func-Write-Logfile -LogEintrag "Checking Path $Path for existence." IF ($PathTest -eq "True") { Func-Write-Logfile -LogEintrag "Path $Path is already existence and can be used." } ELSE { Try { Func-Write-Logfile -LogEintrag "Path $Path has to been created." New-Item -Path $Path -ItemType directory -force -ErrorAction Stop } Catch { Func-Write-Logfile -LogEintrag "ERROR: Unable to create Path." Func-Write-Logfile -LogEintrag "INFO: Maybe there is an access or rights Problem." Func-Write-Logfile -LogEintrag "Application was unplannd terminated." EXIT } } } # Funktion um Logdateien zu schreiben. Function Func-Write-Logfile { <# .SYNOPSIS Function will write a given string to a logfile. .DESCRIPTION Function will write a given string to a logfile. .REQUIREMENT PowerShell V2 and Function "Func-Write-Logfile". .VERSION 1.0 / 06.11.2014 .EXAMPLE Func-Path-Check -Path "E:\Path\to\check" .EXAMPLE Func-Path-Check -Path "E:\Path\to\create" .PARAMETER Path Give the full Path you want to check or create. #> Param ( [String]$LogEintrag ) # Der Fehlerindikator ($?) muss bereits zu Anfang abgefragt werden, # da er von JEDEM funktionierenden Befehl wieder auf True gesetzt wird. IF ($? -ne 'True') { Set-Variable -Name Fehler -Value 1 } IF ($LogPath -eq $NULL) { Set-Variable -Name LogPathListe -Value @($LogPathListe) Set-Variable -Name LogPathListe -Value ($LogPathListe += "$ScriptPath\Logs","$env:temp") FOREACH ($LogPathEintrag in $LogPathListe) { $PathTest = Test-Path -PathType Container "$LogPathEintrag" Write-Host "Pathüberprüfung: Prüfe ob LogPath bereits angelegt ist: $LogPathEintrag" IF ($PathTest -eq "True") { Write-Host "Pathüberprüfung: LogPath $LogPathEintrag ist bereits angelegt!" Set-Variable -Name LogPath -Value $LogPathEintrag break } ELSE { Write-Host "Pathüberprüfung: LogPath $LogPathEintrag muss angelegt werden." New-Item -Path $LogPathEintrag -ItemType directory -force -ErrorAction SilentlyContinue | Out-Null $PathTest = Test-Path -PathType Container $LogPathEintrag Write-Host "Pathüberprüfung: Prüfe ob Path erfolgreich angelegt werden konnte." IF ($PathTest -eq "True") { Write-Host "Pathüberprüfung: Path $LogPathEintrag wurde erfolgreich angelegt." Set-Variable -Name LogPath -Value $LogPathEintrag break } ELSE { Write-Host "Pathüberprüfung: Path $LogPathEintrag konnte nicht angelegt werden." Set-Variable -Name LogPath -Value $LogPathEintrag } } } } ELSEIF ($LogPath -eq $env:temp) { Write-Warning "FEHLER: LogPath nicht zugreifbar oder nicht korrekt konfiguriert!" Write-Warning "INFO: $LogPath - wird nun verwendet!" Write-Warning "Programm wird trotzdem fortgesetzt." } Set-Variable -Name LogPath -Value $LogPath -scope script Write-Host $LogEintrag Add-content $LogPath\$LogDatei -value "$(Get-Date -Format 'dd.MM.yyyy')-$(Get-Date -Format 'HH:mm:ss'): $LogEintrag" IF ($Fehler -eq 1) { Write-Host "Fehlermeldung: $error" Add-content $LogPath\$LogDatei -value "$(Get-Date -Format 'dd.MM.yyyy')-$(Get-Date -Format 'HH:mm:ss'): Fehlermeldung: $error" # Setze Fehlerspeicher zurück $error.clear() } } # Funktion um aus einer kompletten Pathangabe, nur den Dateinamen ohne Endung ausgegeben zu bekommen. # Bespiel: Eingabe -> "D:\ProgramPath\ProgramName.exe" | Ausgabe -> "ProgrammName" Function Func-Dateiname_aus_Path { Param ( [Array]$FuncVar ) Write-Host "" Write-Host "Pathkonvertierung: Eingabewert - $FuncVar" $FuncVar = (split-path "$FuncVar" -Leaf) Write-Host "Pathkonvertierung: Path entfernt - $FuncVar" $FuncVar = ($FuncVar -split '\.') Write-Host "Pathkonvertierung: Dateiname getrennt - $FuncVar" $FuncVar = ($FuncVar[0].ToString()) Write-Host "Pathkonvertierung: Erster Wert aus Array - $FuncVar" return $FuncVar } # Funktion um einen Dateinamen der Trennzeichen enthält, nur den ersten Wert vor dem ersten Trennzeichen ausgegeben zu bekommen. # Beispiel: Eingabe -> "Dateiname_4711_1606.pdf" | Ausgabe -> "Dateiname" Function Func-Dateiname_zerlegen_Dateianfang { Param ( [Array]$FuncVar ) write-host "" write-host "Dateinamenssplit: Eingabewert - $FuncVar" $FuncVar = ($FuncVar -split "$FileSeperator") write-host "Dateinamenssplit: Nach dem Split - $FuncVar" $FuncVar = ($FuncVar[0].ToString()) write-host "Dateinamenssplit: Erster Wert aus Array - $FuncVar" $FuncVar = ($FuncVar -split "$VersionSeperator") write-host "Dateinamenssplit: Nach dem Split - $FuncVar" $FuncVar = ($FuncVar[0].ToString()) write-host "Dateinamenssplit: Erster Wert aus Array - $FuncVar" return $FuncVar } # Funktion um einen Dateinamen der Trennzeichen enthält, nur den ersten Wert vor dem ersten Trennzeichen ausgegeben zu bekommen. # Beispiel: Eingabe -> "4711_1606_Dateiname.pdf" | Ausgabe -> "Dateiname" Function Func-Dateiname_zerlegen_Dateiende { Param ( [Array]$FuncVar ) write-host "" write-host "Dateinamenssplit: Eingabewert - $FuncVar" $FuncVar = ($FuncVar -split "$FileSeperator") write-host "Dateinamenssplit: Nach dem Split - $FuncVar" $FuncVar = ($FuncVar[-1].ToString()) write-host "Dateinamenssplit: Letzter Wert aus Array - $FuncVar" $FuncVar = ($FuncVar -split "$VersionSeperator") write-host "Dateinamenssplit: Nach dem Split - $FuncVar" $FuncVar = ($FuncVar[0].ToString()) write-host "Dateinamenssplit: Erster Wert aus Array - $FuncVar" return $FuncVar } # Funktion um eine Textdatei (ASCII), komplett einzulesen. Function Func-ReadConfigFile { Param ( [String]$ConfigFile ) Write-Host "" Write-Host "Prüfe ob Konfigurationsdatei: $ConfigFile vorhanden ist." $DateiTest = Test-Path -PathType Leaf $ConfigFile IF ($DateiTest -eq "True") { Write-Host "Konfigurationsdatei ist vorhanden, fahre fort." } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: Konfigurationsdatei ist nicht vorhanden!" Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." EXIT } Write-Host "Konfigurationsdatei wird nun eingelesen." Set-Variable -Name ConfigValues -Value (Select-String -path $ConfigFile -pattern "=" | where {-not($_-match "#")}) IF ($ConfigValues -eq $Null) { Write-Host "Keine gültigen Werte in Konfigurationsdatei erkannt!" } ELSE { Write-Host "Es wurden"$ConfigValues.count"Zeilen aus der Konfigurationsdatei eingelesen." #Write-Host "Folgende Werte wurden eingelesen:" #Write-Host "$ConfigValues" } Set-Variable -Name ConfigValues -Value $ConfigValues -Scope script } # Funktion um eine Textdatei (ASCII), komplett einzulesen. # Gibt immer nur einen Wert zurück! Function Func-ReadConfigValue { Param ( [String]$KonfigBezeichner ) $Items = ($ConfigValues.line | select-string -pattern "$KonfigBezeichner") IF ($Items -eq $NULL) { Write-Host "Der gesuchte Bezeichner ($KonfigBezeichner) konnte nicht gefunden werden!" Write-Host "Standardwert wird verwendet!" $KonfigBezeichner = (Get-Variable -Name $KonfigBezeichner -ValueOnly) return $KonfigBezeichner } ELSEIF ($Items.GetType() -like "*Microsoft.PowerShell.Commands.MatchInfo*" -or $Items.GetType() -like "*String*") { $Items = ($Items -split "=") $Items = @($Items) $Items = $Items[1] $Items = ($Items.TrimStart()) $Items = ($Items.TrimEnd()) return $Items } ELSEIF ($Items -is [Array]) { return $Items } } Function Func-Dateien-zusammensuchen { Param ( [String]$SuchPath, [Array]$SuchWhiteList, [Array]$SuchBlackList ) Set-Variable -Name SuchWhiteList -Value ($SuchWhiteList -Replace " ","") Set-Variable -Name SuchWhiteList -Value ($SuchWhiteList -Split ",") Set-Variable -Name SuchWhiteList -Value ($SuchWhiteList -Split ";") Set-Variable -Name SuchBlackList -Value ($SuchBlackList -Replace " ","") Set-Variable -Name SuchBlackList -Value ($SuchBlackList -Split ",") Set-Variable -Name SuchBlackList -Value ($SuchBlackList -Split ";") $Items = Get-ChildItem -Path "$SuchPath" -include $SuchWhiteList -exclude $SuchBlackList IF ($Items -eq $NULL) { Func-Write-Logfile -LogEintrag "Could not find any File(s) in Path: $SuchPath (regard on White and Black Lists)." } ELSE { Func-Write-Logfile -LogEintrag "Could find some File(s) in Path: $SuchPath (regard on White and Black Lists) ..." FOREACH ($Item in $Items) { Func-Write-Logfile -LogEintrag "...one Found is: $Item" } return $Items } } Function Func-Dateien-Versionieren { <# .SYNOPSIS Function will copy or move File(s). .DESCRIPTION Function will copy or move File(s). If File already exists in target Path new File will get a Version ~2. .REQUIREMENT General PowerShell V2 .REQUIREMENT Variables Datei, Datei1, DateiName, DateiEndung, DateiTest, DateiVersion,ZielPath, MoveorCopy, QuellPath .VERSION 1.0 / 10.11.2014 .EXAMPLE Func-Dateien-Versionieren -Datei "E:\Quellpfad\Test.txt" -ZielPath "E:\Zielpfad" -MoveorCopy move .EXAMPLE Func-Dateien-Versionieren -Datei "E:\Quellpfad\Test.txt" -ZielPath "E:\Zielpfad" -MoveorCopy copy .PARAMETER $Datei Give the full Path to an File. .PARAMETER $ZielPath Give the Target path you want to move or copy the specified File. .PARAMETER $MoveOrCopy Give this Parameter to determ a copy or a move Order. #> Param ( [String]$Datei, [String]$ZielPath, [String]$MoveorCopy ) IF (($MoveorCopy -ne 'move') -and ($MoveorCopy -ne 'copy')) { Func-Write-Logfile -LogEintrag "ERROR: Wrong Function call." Func-Write-Logfile -LogEintrag "INFO: Parameter MoveorCopy accepts only 'move' or 'copy'." Func-Write-Logfile -LogEintrag "Application will use the copy Order by default." Set-Variable -Name MoveOrCopy -Value copy -Scope local } IF (($VersionSeperator -eq $null) -or ($VersionSeperator -eq '')) { Func-Write-Logfile -LogEintrag "ERROR: Wrong Function call." Func-Write-Logfile -LogEintrag "INFO: Variable VersionSeperator is not valid." Func-Write-Logfile -LogEintrag "Application was unplannd terminated." EXIT } $QuellPath = (split-path "$Datei") $Datei = (split-path "$Datei" -Leaf) $DateiTest = Test-Path -PathType Leaf "$ZielPath\$Datei" IF ($DateiTest -eq 'True') { Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "The File already exists in the Target Directory, starting Version Check." $Datei1 = ($Datei -split "$VersionSeperator") $DateiVersion = $Datei1[1] IF ($DateiVersion -eq $NULL) { Func-Write-Logfile -LogEintrag "Sourcefile imcludes no VersionSeperator." $Datei1 = ($Datei -split "\.") $DateiName = $Datei1[0] $DateiEndung = $Datei1[1] # Um Version ~1 zu überspringen. $DateiVersion++ } ELSE { Func-Write-Logfile -LogEintrag "Sourcefile imcludes VersionSeperator." $Datei1 = ($Datei1 -split "\.") $DateiName = $Datei1[0] $DateiVersion = $Datei1[1] $DateiEndung = $Datei1[2] $DateiVersion = $DateiVersion -as [Int] } DO { Write-Host $DateiVersion; $DateiVersion++ } while ( ($DateiTest = Test-Path -Path "$ZielPath\$Dateiname$VersionSeperator$DateiVersion.$DateiEndung") -eq 'True' ) IF ($MoveorCopy -eq 'move') { Rename-Item -Path "$QuellPath\$Datei" -NewName "$DateiName$VersionSeperator$DateiVersion.$DateiEndung" Move-Item -Path "$QuellPath\$Dateiname$VersionSeperator$DateiVersion.$DateiEndung" -Destination "$ZielPath" -Force Func-Write-Logfile -LogEintrag "File: $Dateiname$VersionSeperator$DateiVersion.$DateiEndung was moved," } ELSEIF ($MoveorCopy -eq 'copy') { Copy-Item -Path "$QuellPath\$Datei" -Destination "$QuellPath\$Timestamp1´_$Datei" -Force Rename-Item -Path "$QuellPath\$Timestamp1´_$Datei" -NewName "$DateiName$VersionSeperator$DateiVersion.$DateiEndung" Move-Item -Path "$QuellPath\$Dateiname$VersionSeperator$DateiVersion.$DateiEndung" -Destination "$ZielPath" -Force Func-Write-Logfile -LogEintrag "File: $Dateiname$VersionSeperator$DateiVersion.$DateiEndung was copied," } Func-Write-Logfile -LogEintrag "from: $QuellPath to: $ZielPath" Return "$ZielPath\$Dateiname$VersionSeperator$DateiVersion.$DateiEndung" } ELSE { Write-Host "Die Datei ist im ZielPath noch nicht vorhanden, Versionierung wird nicht verwendet." Move-Item -Path "$QuellPath\$Datei" -Destination "$ZielPath" -Force Func-Write-Logfile -LogEintrag "Datei: $Datei wird verschoben." Func-Write-Logfile -LogEintrag "Von: $QuellPath nach: $ZielPath" Return "$ZielPath\$Datei" } } Function Func-PDFAKonvertierung { Param ( [String]$Datei ) Func-Write-Logfile "" Func-Write-Logfile "PDFCreator - PDF/A Konvertierung wird verwendet, bzw. gestartet:" Func-Write-Logfile "Now processing this File:" Func-Write-Logfile "$Datei" $DateiPath = (split-path "$Datei") Func-Path-Check -Path "$TempPath\Datei\PDFCreatorKonvertierung" $Datei = (Func-Dateien-Versionieren -Datei "$Datei" -ZielPath "$TempPath\Datei\PDFCreatorKonvertierung" -MoveorCopy move ) $PDFCreatorEXEArgument2 = "$Datei" $PDFCreatorEXEArgument4 = (split-path "$Datei" -Leaf) $PDFCreatorEXEArgument4 = "$DateiPath\$PDFCreatorEXEArgument4" Try { Func-Write-Logfile -LogEintrag "Folgende Datei wird verarbeitet: $PDFCreatorEXEArgument2" Start-Process -FilePath "$PDFCreatorEXE" -wait -ArgumentList $PDFCreatorEXEArgument1$PDFCreatorEXEArgument2$PDFCreatorEXEArgument3$PDFCreatorEXEArgument4$PDFCreatorEXEArgument5 -ErrorAction Stop Func-Write-Logfile -LogEintrag "Die Datei wurde konvertiert und an ihren Ursprungsort zurück verschoben." } Catch { Func-Write-Logfile -LogEintrag "FEHLER: Konvertierung ist fehlgeschlagen!." Func-Write-Logfile -LogEintrag "INFO: Bitte überprüfen Sie die PDFCreator Einstellungen!" Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." EXIT } $Items = (Func-Dateien-zusammensuchen -SuchPath "$TempPath\Datei\PDFCreatorKonvertierung\*" -SuchWhiteList $PDFCreatorFileWhiteList -SuchBlackList $PDFCreatorFileBlackList) IF ($Items -ne $Null) { Func-Write-Logfile -LogEintrag "ACHTUNG: Möglicherweise gab es einen Verarbeitungsfehler, es sind noch Dateien im Path: $TempPath\Datei\PDFCreatorKonvertierung vorhanden!" Func-Write-Logfile -LogEintrag "Dieser sollte aber nach erfolgreicher Verarbeitung wieder leer sein!" } Func-Write-Logfile "PDFCreator - PDF/A Konvertierung ist beendet." } Function Func-RunCMD { FOREACH ($RunCMDZeile in $RunCMDListe) { Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "Running specified CMD-Files." Write-Host "Folgende Zeilen wurden ausgelesen: --> $RunCMDZeile <--" $RunCMDZeile = ($RunCMDZeile -split "''") $RunCMDZeile = ($RunCMDZeile -split "' '") $RunCMDZeile = ($RunCMDZeile -split "' '") IF ($RunCMDZeile[0] -gt "") { Write-Host "Erster übergebender Wert: $($RunCMDZeile[0])" $RunCMDZeile[0] = $RunCMDZeile[0] -replace ("'","") IF ($RunCMDZeile[1] -gt "") { Write-Host "Zweiter übergebender Wert: $($RunCMDZeile[1])" $RunCMDZeile[1] = $RunCMDZeile[1] -replace ("'","") IF ($RunCMDZeile[2] -gt "") { Write-Host "Dritter übergebender Wert: $($RunCMDZeile[2])" $RunCMDZeile[2] = $RunCMDZeile[2] -replace ("'","") } } IF ((Test-Path -Path "$($RunCMDZeile[0])" -PathType Leaf) -eq "True") { Try { Func-Write-Logfile -LogEintrag "Now running CMD-File: $($RunCMDZeile[0])." write-host "$($RunCMDZeile[0]) $($RunCMDZeile[1]) $($RunCMDZeile[2])" $RunCMD = Start-Process cmd.exe -ArgumentList "/c $($RunCMDZeile[0]) $($RunCMDZeile[1]) $($RunCMDZeile[2])" -Passthru Wait-Process -ID $RunCMD.Id -Timeout $RunCMDTimeout -ErrorAction Stop } Catch { Try { Func-Write-Logfile -LogEintrag "Da der definierte Timeout überschritten wurde ($RunCMDTimeout Sekunden), wird nun versucht die Datei / das Programm zu beenden." Stop-Process -ID $RunCMD.Id -Force -ErrorAction Stop } Catch { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE die Datei / das Programm - $($RunCMDZeile[0]) - kann nicht beendet werden." Func-Write-Logfile -LogEintrag "INFO: Möglicherweise müssen Sie den Computer neustarten!" Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." break } } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE die Datei / das Programm - $($RunCMDZeile[0]) - kann nicht ausgeführt werden." Func-Write-Logfile -LogEintrag "INFO: Die Datei / das Programm ist nicht vorhanden oder es kann nicht auf sie zugegiffen werden." Func-Write-Logfile -LogEintrag "Programm wird trotzdem fortgesetzt." } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE es wurde keine Datei / oder ein Programm zur Ausführung angegeben." Func-Write-Logfile -LogEintrag "INFO: Überprüfen Sie Ihre Konfigurationsdatei!" Func-Write-Logfile -LogEintrag "Programm wird trotzdem fortgesetzt." } } } Function Func-RunEXE { FOREACH ($RunEXEZeile in $RunEXEListe) { Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "Starte Ausführung für EXE-Dateien." Write-Host "Folgende Zeilen wurden ausgelesen: --> $RunEXEZeile <--" $RunEXEZeile = ($RunEXEZeile -split "''") $RunEXEZeile = ($RunEXEZeile -split "' '") $RunEXEZeile = ($RunEXEZeile -split "' '") IF ($RunEXEZeile[0] -ne "") { $RunEXEZeile[0] = $RunEXEZeile[0] -replace ("'","") IF ($RunEXEZeile[1] -ne $NULL) { $RunEXEZeile[1] = $RunEXEZeile[1] -replace ("'","") IF ($RunEXEZeile[2] -ne "") { $RunEXEZeile[2] = $RunEXEZeile[2] -replace ("'","") } } IF ((Test-Path -Path "$($RunEXEZeile[0])" -PathType Leaf) -eq "True") { Try { Func-Write-Logfile -LogEintrag "Starte die Datei / das Programm $($RunEXEZeile[0])." $RunEXE = Start-Process "$($RunEXEZeile[0])" -ArgumentList "$RunEXEZeile[1] $RunEXEZeile[2]" -Passthru Wait-Process -ID $RunEXE.Id -Timeout $RunEXETimeout -ErrorAction Stop } Catch { Try { Func-Write-Logfile -LogEintrag "Da der definierte Timeout überschritten wurde ($RunEXETimeout Sekunden), wird nun versucht die Datei / das Programm zu beenden." Stop-Process -ID $RunEXE.Id -Force -ErrorAction Stop } Catch { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE die Datei / das Programm - $($RunEXEZeile[0]) - kann nicht beendet werden." Func-Write-Logfile -LogEintrag "INFO: Möglicherweise müssen Sie den Computer neustarten!" Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." break } } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE die Datei / das Programm - $($RunEXEZeile[0]) - kann nicht ausgeführt werden." Func-Write-Logfile -LogEintrag "INFO: Die Datei / das Programm ist nicht vorhanden oder es kann nicht auf sie zugegiffen werden." Func-Write-Logfile -LogEintrag "Programm wird trotzdem fortgesetzt." } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE es wurde keine Datei / oder ein Programm zur Ausführung angegeben." Func-Write-Logfile -LogEintrag "INFO: Überprüfen Sie Ihre Konfigurationsdatei!" Func-Write-Logfile -LogEintrag "Programm wird trotzdem fortgesetzt." } } } Function Func-RunVBS { FOREACH ($RunVBSZeile in $RunVBSListe) { Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "Starte Ausführung für VB-Skripte." Write-Host "Folgende Zeilen wurden ausgelesen: --> $RunVBSZeile <--" $RunVBSZeile = ($RunVBSZeile -split "''") $RunVBSZeile = ($RunVBSZeile -split "' '") $RunVBSZeile = ($RunVBSZeile -split "' '") IF ($RunVBSZeile[0] -gt "") { Write-Host "Erster übergebender Wert: $($RunVBSZeile[0])" $RunVBSZeile[0] = $RunVBSZeile[0] -replace ("'","") IF ($RunVBSZeile[1] -gt "") { Write-Host "Zweiter übergebender Wert: $($RunVBSZeile[1])" $RunVBSZeile[1] = $RunVBSZeile[1] -replace ("'","") IF ($RunVBSZeile[2] -gt "") { Write-Host "Dritter übergebender Wert: $($RunVBSZeile[2])" $RunVBSZeile[2] = $RunVBSZeile[2] -replace ("'","") } } IF ((Test-Path -Path "$($RunVBSZeile[0])" -PathType Leaf) -eq "True") { Try { Func-Write-Logfile -LogEintrag "Starte die Datei / das Programm $($RunVBSZeile[0])." $RunVBS = Start-Process wscript.exe -ArgumentList "$($RunVBSZeile[0]) $($RunVBSZeile[1]) $($RunVBSZeile[2])" -Passthru Wait-Process -ID $RunVBS.Id -Timeout $RunVBSTimeout -ErrorAction Stop } Catch { Try { Func-Write-Logfile -LogEintrag "Da der definierte Timeout überschritten wurde ($RunVBSTimeout Sekunden), wird nun versucht die Datei / das Programm zu beenden." Stop-Process -ID $RunVBS.Id -Force -ErrorAction Stop } Catch { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE die Datei / das Programm - $($RunVBSZeile[0]) - kann nicht beendet werden." Func-Write-Logfile -LogEintrag "INFO: Möglicherweise müssen Sie den Computer neustarten!" Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." break } } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE die Datei / das Programm - $($RunVBSZeile[0]) - kann nicht ausgeführt werden." Func-Write-Logfile -LogEintrag "INFO: Die Datei / das Programm ist nicht vorhanden oder es kann nicht auf sie zugegiffen werden." Func-Write-Logfile -LogEintrag "Programm wird trotzdem fortgesetzt." } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE es wurde keine Datei / oder ein Programm zur Ausführung angegeben." Func-Write-Logfile -LogEintrag "INFO: Überprüfen Sie Ihre Konfigurationsdatei!" Func-Write-Logfile -LogEintrag "Programm wird trotzdem fortgesetzt." } } } Function Func-RunPSS { FOREACH ($RunPSSZeile in $RunPSSListe) { Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "Starte Ausführung für PS-Skripte." Write-Host "Folgende Zeilen wurden ausgelesen: --> $RunPSSZeile <--" $RunPSSZeile = ($RunPSSZeile -split "''") $RunPSSZeile = ($RunPSSZeile -split "' '") $RunPSSZeile = ($RunPSSZeile -split "' '") IF ($RunPSSZeile[0] -gt "") { Write-Host "Erster übergebender Wert: $($RunPSSZeile[0])" $RunPSSZeile[0] = $RunPSSZeile[0] -replace ("'","") IF ($RunPSSZeile[1] -gt "") { Write-Host "Zweiter übergebender Wert: $($RunPSSZeile[1])" $RunPSSZeile[1] = $RunPSSZeile[1] -replace ("'","") IF ($RunPSSZeile[2] -gt "") { Write-Host "Dritter übergebender Wert: $($RunPSSZeile[2])" $RunPSSZeile[2] = $RunPSSZeile[2] -replace ("'","") } } IF ((Test-Path -Path "$($RunPSSZeile[0])" -PathType Leaf) -eq "True") { Try { Func-Write-Logfile -LogEintrag "Starte die Datei / das Programm $($RunPSSZeile[0])." write-host "$($RunPSSZeile[0]) $($RunPSSZeile[1]) $($RunPSSZeile[2])" $RunPSS = Start-Process powershell.exe -ArgumentList "$($RunPSSZeile[0]) $($RunPSSZeile[1]) $($RunPSSZeile[2])" -Passthru Wait-Process -ID $RunPSS.Id -Timeout $RunPSSTimeout -ErrorAction Stop } Catch { Try { Func-Write-Logfile -LogEintrag "Da der definierte Timeout überschritten wurde ($RunPSSTimeout Sekunden), wird nun versucht die Datei / das Programm zu beenden." Stop-Process -ID $RunPSS.Id -Force -ErrorAction Stop } Catch { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE die Datei / das Programm - $($RunPSSZeile[0]) - kann nicht beendet werden." Func-Write-Logfile -LogEintrag "INFO: Möglicherweise müssen Sie den Computer neustarten!" Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." break } } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE die Datei / das Programm - $($RunPSSZeile[0]) - kann nicht ausgeführt werden." Func-Write-Logfile -LogEintrag "INFO: Die Datei / das Programm ist nicht vorhanden oder es kann nicht auf sie zugegiffen werden." Func-Write-Logfile -LogEintrag "Programm wird trotzdem fortgesetzt." } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: bei RunEXE es wurde keine Datei / oder ein Programm zur Ausführung angegeben." Func-Write-Logfile -LogEintrag "INFO: Überprüfen Sie Ihre Konfigurationsdatei!" Func-Write-Logfile -LogEintrag "Programm wird trotzdem fortgesetzt." } } } #----------------------------------------------------------------------------------------------------- ####################################### Vorbereitende Arbeiten. ###################################### #----------------------------------------------------------------------------------------------------- # Lösche evtl. anzeigen. Clear-Host # Konfigurationsdatei komplett einlesen. Func-ReadConfigFile -ConfigFile $ConfigFile # Werte aus Konfigurationsdatei bereitstellen. $LogPathListe = (Func-ReadConfigValue -KonfigBezeichner LogPath) $LogKeepTime = (Func-ReadConfigValue -KonfigBezeichner LogKeepTime) $FileDelayAge = (Func-ReadConfigValue -KonfigBezeichner FileDelayAge) $VersionSeperator = (Func-ReadConfigValue -KonfigBezeichner VersionSeperator) $QSEXEFile = (Func-ReadConfigValue -KonfigBezeichner QSEXEFile) $QSEXESingleInstance = (Func-ReadConfigValue -KonfigBezeichner QSEXESingleInstance) $QSProfilePath = (Func-ReadConfigValue -KonfigBezeichner QSProfilePath) $QSProfileExtension = (Func-ReadConfigValue -KonfigBezeichner QSProfileExtension) $QSFileWhiteList = (Func-ReadConfigValue -KonfigBezeichner QSFileWhiteList) $QSFileBlackList = (Func-ReadConfigValue -KonfigBezeichner QSFileBlackList) $PDFCreatorEXE = (Func-ReadConfigValue -KonfigBezeichner PDFCreatorEXE) $PDFCreatorEXESingleInstance = (Func-ReadConfigValue -KonfigBezeichner PDFCreatorEXESingleInstance) $PDFCreatorConvertMasterSwitch = (Func-ReadConfigValue -KonfigBezeichner PDFCreatorConvertMasterSwitch) $PDFCreatorConvertGlobal = (Func-ReadConfigValue -KonfigBezeichner PDFCreatorConvertGlobal) $PDFCreatorFileWhiteList = (Func-ReadConfigValue -KonfigBezeichner PDFCreatorFileWhiteList) $PDFCreatorFileBlackList = (Func-ReadConfigValue -KonfigBezeichner PDFCreatorFileBlackList) $InputPath = (Func-ReadConfigValue -KonfigBezeichner InputPath) $TempPath = (Func-ReadConfigValue -KonfigBezeichner TempPath) $OutputPath = (Func-ReadConfigValue -KonfigBezeichner OutputPath) $ArchivPath = (Func-ReadConfigValue -KonfigBezeichner ArchivPath) $ArchivRemove = (Func-ReadConfigValue -KonfigBezeichner ArchivRemove) $RunCMDListe = (Func-ReadConfigValue -KonfigBezeichner RunCMDEntry?) $RunCMDTimeout = (Func-ReadConfigValue -KonfigBezeichner RunCMDTimeout) $RunEXEListe = (Func-ReadConfigValue -KonfigBezeichner RunEXEEntry?) $RunEXETimeout = (Func-ReadConfigValue -KonfigBezeichner RunEXETimeout) $RunVBSListe = (Func-ReadConfigValue -KonfigBezeichner RunVBSEntry?) $RunVBSTimeout = (Func-ReadConfigValue -KonfigBezeichner RunVBSTimeout) $RunPSSListe = (Func-ReadConfigValue -KonfigBezeichner RunPSSEntry?) $RunPSSTimeout = (Func-ReadConfigValue -KonfigBezeichner RunPSSTimeout) #----------------------------------------------------------------------------------------------------- ####################################### Hauptprogramm starten. ####################################### #----------------------------------------------------------------------------------------------------- Write-Host "" Func-Write-Logfile -LogEintrag "*******************************************************************************************" Func-Write-Logfile -LogEintrag "Program Startup: $ScriptName on $env:computername from Account $env:USERDOMAIN\$env:USERNAME." Func-Write-Logfile -LogEintrag "*******************************************************************************************" # Prüfe ob der hinterlegte Path für das QuickScan gültig ist. $DateiTest = Test-Path -PathType Leaf $QSEXEFile IF ($DateiTest -eq "True") { Write-Host "QuickScan seems to exist, going ahead with Application." } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: QuickScan ist nicht vorhanden!" Func-Write-Logfile -LogEintrag "INFO: Überprüfen Sie die Path-Einstellungen in der Konfigurationsdatei!" Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." EXIT } # Setze QuickScan Profil-Path anhand der QSEXE und prüfe ob der Path vorhanden ist. $QSProfilePath = (split-path "$QSEXEFile") Set-Variable -Name QSProfilePath -Value $QSProfilePath\Profiles\Scan Write-Host "" Write-Host "Prüfe ob QuickScan Profil-Path vorhanden ist: $QSProfilePath" $PathTest = Test-Path -PathType Container $QSProfilePath IF ($PathTest -eq "True") { Write-Host "Path ist vorhanden, fahre fort." } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: QuickScan-ProfilPath ist nicht vorhanden!" Func-Write-Logfile -LogEintrag "INFO: Überprüfen Sie die Path-Einstellungen in der Konfigurationsdatei!" Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." EXIT } # Suche. bzw. trage QuickScan Profile zusammen. Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "Searching for QuickScan Profiles - File Extension: $QSProfileExtension" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" $QSProfileListe = (Func-Dateien-zusammensuchen -SuchPath "$QSProfilePath\*" -SuchWhiteList $QSProfileExtension) IF ($QSProfileListe -eq $null) { Func-Write-Logfile -LogEintrag "ERROR: Cannot find any valid QuickScan Profil!" Func-Write-Logfile -LogEintrag "INFO: Profile die den Textstring - Test - enthalten werden ignoriert!." Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." EXIT } # Ordnerstruktur anhand gefundene QuickScan Profile überprüfen bzw. anlegen. Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "Auf Grundlage der QuickScan Profile, müssen folgende Verzeichnisse im Dokumentverarbeitung Verzeichnis vorhanden sein." Func-Write-Logfile -LogEintrag "Sind sie nicht vorhanden, werden sie automatisch angelegt." Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" FOREACH ($QSProfileEintrag in $QSProfileListe) { $QSProfileEintrag = Func-Dateiname_aus_Path -FuncVar $QSProfileEintrag Func-Write-Logfile -LogEintrag "Verzeichnisse für QuickScan Profil - $QSProfileEintrag - werden nun bearbeitet:" Func-Path-Check -Path $InputPath\Datei\$QSProfileEintrag Func-Path-Check -Path $TempPath\Datei\$QSProfileEintrag Func-Path-Check -Path $OutputPath\Datei Func-Path-Check -Path $ArchivPath\Datei\$QSProfileEintrag } # Prüfe ob bereits eine QuickScan Instanz gestartet ist, falls ja -> sofort beenden. Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "Checking for an running QuickScan Instance." Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Set-Variable -Name QSProzess -Value (Func-Dateiname_aus_Path -FuncVar $QSEXEFile) $ProzessTest = get-process $QSProzess -ErrorAction SilentlyContinue IF ($ProzessTest -eq $null) { Func-Write-Logfile -LogEintrag "It seems there is currently no QuickScan Instance runnnig, going ahead with Application." } ELSE { Func-Write-Logfile -LogEintrag "QuickScan Instance found, trying Stop this Instance." Stop-Process -InputObject (get-process $QSProzess -ErrorAction SilentlyContinue) -Force -ErrorAction SilentlyContinue Wait-Process -InputObject (get-process $QSProzess -ErrorAction SilentlyContinue) -timeout 60 -ErrorAction SilentlyContinue Start-Sleep -s 3 $ProzessTest = get-process $QSProzess -ErrorAction SilentlyContinue IF ($ProzessTest -ne $null) { Func-Write-Logfile -LogEintrag "FEHLER: Es konnten nicht alle QuickScan Instanzen beendet werden." Func-Write-Logfile -LogEintrag "Programm wird ungeplant beendet." EXIT } } # Prüfe anhand des Input Verzeichnisses, ob abzuarbeitende Dateien vorhanden sind und starte Abarbeitung dieser, mit QuickScan. Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "Prüfen ob abzuarbeitende Dateien vorhanden sind und starte ggf. Abarbeitung." Func-Write-Logfile -LogEintrag "Berücksichtigt werden Dateien, mit folgenden DateiEndungen: $QSFileWhiteList." Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "Depending on your configuration, the processing will be compound on multiple Steps:" Func-Write-Logfile -LogEintrag "Step 1 QuickScan-Job, Step 2 possibly PDF/A Convert and Step 3. possibly processing by further 3rd Party Program(s)." Func-Write-Logfile -LogEintrag "All of these Steps will be run through an whole QuickScan Profile." FOREACH ($QSProfileEintrag in $QSProfileListe) { # Warte bis gefundene Dateien ein gewisses Alter erreicht haben, bevor Sie verarbeitet werden. Set-Variable -Name QSProfile -Value (Func-Dateiname_aus_Path -FuncVar $QSProfileEintrag) Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "QuickScan Profile $($QSProfile): Will now beginn the processing." Func-Write-Logfile -LogEintrag "Checking this Input Path for unprocessed Files:" Func-Write-Logfile -LogEintrag "$InputPath\Datei\$QSProfile" $Items = (Func-Dateien-zusammensuchen -SuchPath "$InputPath\Datei\$QSProfile\*" -SuchWhiteList $QSFileWhiteList -SuchBlackList $QSFileBlackList | where-object {$_.lastwritetime -lt (get-date).addminutes(-$FileDelayAge)} )#| Foreach-Object { $_.FullName } ) IF ($Items -eq $null) { Func-Write-Logfile -LogEintrag "Currently there are no unprocessed Files." } ELSE { Func-Write-Logfile -LogEintrag "Starting QuickScan with Profile: $QSProfile." FOREACH ($Item in $Items) { Func-Dateien-Versionieren -Datei $Item -ZielPath "$ArchivPath\Datei\$QSProfile" -MoveorCopy copy Func-Write-Logfile -LogEintrag "QuickScan Profile $QSProfile is now processing File: $Item" Start-Process -FilePath "$QSEXEFile" -wait -ArgumentList "/open filename=$Item /scan profile=$QSProfile" -PassThru } Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "QuickScan Profile $($QSProfile): Checking for PDF/A convert." # Konvertiere (sofern eingeschaltet) Dateien in PDF/A-1B. # Dateien müssen nach diesem Schritt unbedingt verschoben verschoben werden, sonst werden sie immer wieder und wieder konvertiert. IF (($PDFCreatorConvertMasterSwitch -like 'Eingeschaltet') -or ($PDFCreatorConvertMasterSwitch -like 'Engaged')) { Func-Write-Logfile -LogEintrag "PDF/A-1B Convert with PDFCreator is enabled." Func-Write-Logfile -LogEintrag "Check the Configuration of the PDFCreator, please:" Func-Write-Logfile -LogEintrag "It is important to disable the automatically Update Function." # Prüfe ob der hinterlegte Path für den PDFCreator gültig ist. $DateiTest = Test-Path -PathType Leaf $PDFCreatorEXE IF ($DateiTest -eq "True") { Write-Host "It seems that the PDFCreator exists, going ahead with Application." # Prüfe ob PDFCreator bereits läuft und versuche ihn zu beenden. Set-Variable -Name PDFCreatorProzess -Value (Func-Dateiname_aus_Path -FuncVar $PDFCreatorEXE) $ProzessTest = get-process $PDFCreatorProzess -ErrorAction SilentlyContinue IF ($ProzessTest -ne $null) { Func-Write-Logfile -LogEintrag "PDFCreator Instanz vorhanden, versuche diese nun zu beenden." Stop-Process -InputObject (get-process $PDFCreatorProzess -ErrorAction SilentlyContinue) -Force -ErrorAction SilentlyContinue Wait-Process -InputObject (get-process $PDFCreatorProzess -ErrorAction SilentlyContinue) -timeout 60 -ErrorAction SilentlyContinue Start-Sleep -s 3 $ProzessTest = get-process $PDFCreatorProzess -ErrorAction SilentlyContinue IF ($ProzessTest -ne $null) { Func-Write-Logfile -LogEintrag "FEHLER: Es konnten nicht alle PDFCreator Instanzen beendet werden." Func-Write-Logfile -LogEintrag "Konvertierung wird vorsichtshalber übersprungen." break } } IF (($PDFCreatorConvertGlobal -like 'Ja') -or ($PDFCreatorConvertGlobal -like 'Yes')) { Func-Write-Logfile -LogEintrag "PDF/A-1B Konvertierung mithilfe des PDFCreators, ist eingeschaltet." Func-Write-Logfile -LogEintrag "Durchsuche $OutputPath\Datei nach zu konvertierenden Dateien. Es werden nur $PDDFCreatorDateiEndung-Dateien berücksichtigt! " Func-Path-Check -Path "$TempPath\Datei\PDFCreatorKonvertierung" $Items = (Func-Dateien-zusammensuchen -SuchPath "$OutputPath\Datei\*" -SuchWhiteList $PDFCreatorFileWhiteList -SuchBlackList $PDFCreatorFileBlackList) IF ($Items -eq $Null) { Func-Write-Logfile -LogEintrag "Keine zu konvertierenden Dateien gefunden." } ELSE { FOREACH ($Item in $Items) { Func-PDFAKonvertierung -Datei "$Item" } } } } ELSE { Func-Write-Logfile -LogEintrag "FEHLER: PDFCreator ist nicht vorhanden!" Func-Write-Logfile -LogEintrag "Konvertierung wird vorsichtshalber übersprungen." } } ELSE { Func-Write-Logfile "PDF/A-1B convert with PDFCreator is disabled." } Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "QuickScan Profile $($QSProfile): Starting possibly 3.rd Party Application (EXE-File, CMD-Script, VB-Script or/and PS-Script)." # Starte Funktionen um Fremd-Programme aufzurufen. Func-RunEXE Func-RunCMD Func-RunVBS Func-RunPSS Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" } } #----------------------------------------------------------------------------------------------------- ####################################### Abschließende Arbeiten. ###################################### #----------------------------------------------------------------------------------------------------- # Temp Dateien nach Verarbeitung löschen Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "Checking for temporary Files and if exists delete them." Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" FOREACH ($QSProfileEintrag in $QSProfileListe) { $QSProfile = Func-Dateiname_aus_Path -FuncVar $QSProfileEintrag Func-Write-Logfile -LogEintrag "Checking the path below for temporary Files:" Func-Write-Logfile -LogEintrag " $TempPath\Datei\$QSProfile" $Items = (Func-Dateien-zusammensuchen -SuchPath "$TempPath\Datei\$QSProfile\*" ) IF ($Items -ne $null) { FOREACH ($Item in $Items) { Try { Func-Write-Logfile -LogEintrag "Removing File: $Item." Remove-Item -Path "$Item" -Force -Verbose -ErrorAction Stop } Catch { Func-Write-Logfile -LogEintrag "ERROR: Unable to remove File!" Func-Write-Logfile -LogEintrag "INFO: Maybe there is an access or rights Problem." Func-Write-Logfile -LogEintrag "Going ahead with Application." } } } ELSE { Func-Write-Logfile -LogEintrag "Currently there are no temporary Files in this Folder." } } Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "Checking for expiered archived Files and if exists delete them." Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" IF ($ArchivRemove -gt 0) { FOREACH ($QSProfileEintrag in $QSProfileListe) { $QSProfile = Func-Dateiname_aus_Path -FuncVar $QSProfileEintrag Func-Write-Logfile -LogEintrag "Checking the path below for temporary Files:" Func-Write-Logfile -LogEintrag " $TempPath\Datei\$QSProfile" $Items = (Func-Dateien-zusammensuchen -SuchPath "$ArchivPath\Datei\$QSProfile\*" | where {$_.lastwritetime -lt $((Get-Date).AddDays(-$ArchivRemove)) -and -not $_.psiscontainer}) IF ($Items -ne $null) { FOREACH ($Item in $Items) { Try { Func-Write-Logfile -LogEintrag "Removing File: $Item." Remove-Item -Path "$Item" -Force -Verbose -ErrorAction Stop } Catch { Func-Write-Logfile -LogEintrag "ERROR: Unable to remove File!" Func-Write-Logfile -LogEintrag "INFO: Maybe there is an access or rights Problem." Func-Write-Logfile -LogEintrag "Going ahead with Application." } } } ELSE { Func-Write-Logfile -LogEintrag "Currently there are no archived Files in this Folder." } } } ELSE { Func-Write-Logfile -LogEintrag "The configuration says, never remove any archived Files!" } # Löschen alter Log-Dateien. Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" Func-Write-Logfile -LogEintrag "Prüfe ob zu löschende Log-Dateien vorhanden sind." Func-Write-Logfile -LogEintrag "-------------------------------------------------------------------------------------------" IF ($LogKeepTime -gt 0) { Func-Write-Logfile -LogEintrag "Log Files should be removed which are older than $LogKeepTime Day(s)." $Items = (Func-Dateien-zusammensuchen -SuchPath "$LogPath\*" -SuchWhiteList *.log | where {$_.Name -like "*$ScriptName*" -and $_.lastwritetime -lt $((Get-Date).AddDays(-$LogKeepTime)) -and -not $_.psiscontainer}) IF ($Items -eq $null) { Func-Write-Logfile -LogEintrag "Keine zu löschenden Log-Dateien vorhanden." } ELSE { Func-Write-Logfile -LogEintrag "Dateien gefunden, folgende Log-Dateien werden aufgund ihres alters gelöscht:" FOREACH ($Item in $Items) { Func-Write-Logfile -LogEintrag "Log-Datei: $Item wird entfernt." Remove-Item -Path $Item -Force -Verbose } } } ELSE { Func-Write-Logfile -LogEintrag "Sie haben in der Konfigurationsdatei angegeben, das Log Dateien nicht automatisch gelöscht werden sollen!" } Func-Write-Logfile -LogEintrag "" Func-Write-Logfile -LogEintrag "*******************************************************************************************" Func-Write-Logfile -LogEintrag "Program Finish: $ScriptName on $env:computername from Account $env:USERDOMAIN\$env:USERNAME." Func-Write-Logfile -LogEintrag "*******************************************************************************************" # Definierte Variablen wieder löschen, damit sie nicht im Arbeitsspeicher verbleiben. Remove-Variable -Name Skript* -Force Remove-Variable -name Konfig* -Force Remove-Variable -name ZeitStempel* -Force Remove-Variable -name Log* -Force Remove-Variable -name FileDelayAge -Force Remove-Variable -Name Item* -Force #Remove-Variable -Name *Path* -Force Remove-Variable -Name *Datei* -Force Remove-Variable -Name *Test* -Force Remove-Variable -Name QSEXE* -Force Remove-Variable -Name QSProfile* -Force Remove-Variable -Name PDFCreator* -Force Remove-Variable -Name RunEXE* -Force Remove-Variable -Name RunCMD* -Force Remove-Variable -Name RunVBS* -Force Remove-Variable -Name RunPSS* -Force $error.clear()