8
0
Skriptentwickung/test/Func-File-copy-or-move.ps1
2024-01-24 16:42:38 +01:00

579 lines
26 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters

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
# Einfaches kopieren oder verschieben von Dateien.
# Digital Data
# Ludwig-Rinn-Strasse 16
# 35452 Heuchelheim
# Tel.: 0641 / 202360
# E-Mail: info@didalog.de
# Version 1.0
# Letzte Aktualisierung: 08.12.2014
# Mindestanforderung für dieses Skript:
# Microsoft Windows XP SP3 / 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 KonfigWerte -Value $NULL -Scope script
Set-Variable -Name ZeitStempel1 -Value $(Get-Date -Format 'ddMMyyyy_HHmmss') -Scope script
Set-Variable -Name Timestamp1 -Value $(Get-Date -Format 'ddMMyyyy') -Scope script
Set-Variable -Name Timestamp2 -Value $(Get-Date -Format 'ddMMyyyy_HHmmss') -Scope script
Set-Variable -Name Timestamp3 -Value $(Get-Date -Format 'ddMMyyyy_HHmmssffff') -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 Sourcepath -Value $NULL -Scope local
Set-Variable -Name Destinationpath -Value $NULL -Scope local
#-----------------------------------------------------------------------------------------------------
####################################### Funktionen definieren. #######################################
#-----------------------------------------------------------------------------------------------------
$test1 = Select-String -Path $MyInvocation.InvocationName -Pattern Func-*| select Matches
write-host $test1
pause
Function Func-Path-Check {
<#
.SYNOPSIS
Function will check the given Path for existence.
.DESCRIPTION
Function will check the given Path for existence. If Path doesn´t exist, Function will try to create it.
.REQUIREMENT General
PowerShell V2 and Function "Func-Write-Logfile".
.REQUIREMENT Variables
Path, PathTest
.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
}
}
}
Function Func-Write-Logfile {
<#
.SYNOPSIS
Function will write a given String to a Logfile.
.DESCRIPTION
Function will write a given String to a Logfile. It will even log Error Messages.
.REQUIREMENT General
PowerShell V2
.REQUIREMENT Variables
LogPathListe, LogPathEintrag, LogPath, Fehler, Pfad-Test
.VERSION
1.0 / 06.11.2014
.EXAMPLE
Func-Path-Check -Log "Write this in my Log, please."
.EXAMPLE
Func-Path-Check -Log "Write this Variabel $Variable in my Log, please."
.PARAMETER Log
Give the Sting you want to be written in the Logfile.
#>
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)
{
$PfadTest = Test-Path -PathType Container "$LogPathEintrag"
Write-Host "Pfadüberprüfung: Prüfe ob LogPath bereits angelegt ist: $LogPathEintrag"
IF ($PfadTest -eq "True")
{
Write-Host "Pfadüberprüfung: LogPath $LogPathEintrag ist bereits angelegt!"
Set-Variable -Name LogPath -Value $LogPathEintrag
break
}
ELSE
{
Write-Host "Pfadüberprüfung: LogPath $LogPathEintrag muss angelegt werden."
New-Item -Path $LogPathEintrag -ItemType directory -force -ErrorAction SilentlyContinue | Out-Null
$PfadTest = Test-Path -PathType Container $LogPathEintrag
Write-Host "Pfadüberprüfung: Prüfe ob Pfad erfolgreich angelegt werden konnte."
IF ($PfadTest -eq "True")
{
Write-Host "Pfadüberprüfung: Pfad $LogPathEintrag wurde erfolgreich angelegt."
Set-Variable -Name LogPath -Value $LogPathEintrag
break
}
ELSE
{
Write-Host "Pfadüberprüfung: Pfad $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 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 KonfigWerte -Value (Select-String -path $ConfigFile -pattern "=" | where {-not($_-match "#")})
IF ($KonfigWerte -eq $Null)
{
Write-Host "Keine gültigen Werte in Konfigurationsdatei erkannt!"
}
ELSE
{
Write-Host "Es wurden"$KonfigWerte.count"Zeilen aus der Konfigurationsdatei eingelesen."
#Write-Host "Folgende Werte wurden eingelesen:"
#Write-Host "$KonfigWerte"
}
Set-Variable -Name KonfigWerte -Value $KonfigWerte -Scope script
}
# Funktion um eine Textdatei (ASCII), komplett einzulesen.
# Gibt immer nur einen Wert zurück!
Function Func-ReadConfigValue
{
Param
(
[String]$KonfigBezeichner
)
$Items = ($KonfigWerte.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 $Funde.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 -Recurse
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-File-copy-or-move {
<#
.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, SourcePath
.VERSION
1.2 / 15.09.2015
.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 and Filename to one 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]$filename_and_path,
[String]$file_targetpath,
[String]$move_or_copy,
[String]$newfilename,
[String]$newfilename_prefix,
[String]$newfilename_suffix
)
Set-Variable -Name SourcePath -Value (split-path "$filename_and_path")
Set-Variable -Name Filename -Value (split-path "$filename_and_path" -Leaf)
IF (($MoveorCopy -ne 'move') -and ($MoveorCopy -ne 'copy')) {
Func-Write-Logfile -LogEintrag "ERROR: Wrong Function call."
Func-Write-Logfile -LogEintrag "INFO: Parameter move_or_copy accepts only 'move' or 'copy'."
Func-Write-Logfile -LogEintrag "Application will use the copy Order by default."
Set-Variable -Name move_Or_copy -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
}
IF ($newfilename -gt "") {
Func-Write-Logfile -LogEintrag "New Filename will replace the old one."
Set-Variable -Name Filename -Value $newfilename -Scope local
}
IF ($newfilename_prefix -gt "") {
Func-Write-Logfile -LogEintrag "New prefix has been set for file."
}
IF ($newfilename_suffix -gt "") {
Func-Write-Logfile -LogEintrag "New suffix has been set for file."
}
#
Set-Variable -Name Filename -Value ($newfilename_prefix + $filename + $newfilename_suffix)
# Does file already exist in the target directory?
Set-Variable -Name Filetest -Value (Test-Path -PathType Leaf "$file_targetpath\$Filename")
IF ($Filetest -eq 'True') {
Func-Write-Logfile -LogEintrag ""
Func-Write-Logfile -LogEintrag "The File already exists in the Target Directory, starting Version Check."
Set-Variable -Name $FileNameSplit -Value ($Filename -split "$VersionSeperator")
Set-Variable -Name $FileVersion -Value $FileNameSplit[1]
# Has the new file already a Version tag?
IF ($FileVersion -eq $NULL) {
Func-Write-Logfile -LogEintrag "Sourcefile includes no VersionSeperator."
Set-Variable -Name FileNameSplit -Value ($Filename -split "\.")
Set-Variable -Name FileName -Value $FileNameSplit[0]
Set-Variable -Name FileExtension -Value $FileNameSplit[1]
# To skip Version ~1.
$FileVersion++
}
ELSE {
Func-Write-Logfile -LogEintrag "Sourcefile includes VersionSeperator."
Set-Variable -Name FileNameSplit -Value ($FileNameSplit -split "\.")
Set-Variable -Name FileName -Value $FilenameSplit[0]
Set-Variable -Name FileVersion -Value $FilenameSplit[1]
Set-Variable -Name FileExtension -Value $FilenameSplit[2]
# To convert String Value to Integer.
$DateiVersion = $DateiVersion -as [Int]
}
DO {
Write-Host "DEBUG Info: Count file version:" $FileVersion; $FileVersion++
}
while
(
($Filetest = Test-Path -Path "$file_targetpath\$FileName$VersionSeperator$FileVersion.$FileExtension") -eq 'True'
)
# code block for the copy or move process
Try {
Set-Variable -Name FileTemp -Value (Copy-Item -Path "$filename_and_path" -Destination "$file_targetpath\$Timestamp3+"_"+$FileName" -PassThru -Force)
Set-Variable -Name FileFinal -Value (Rename-Item -Path "FileTemp" -NewName "$FileName$VersionSeperator$FileVersion.$FileExtension")
Func-Write-Logfile -LogEintrag "Command: $move_or_copy has been completed for file: $filename_and_path"
Func-Write-Logfile -LogEintrag "File is ranamed to: $FileName$VersionSeperator$FileVersion.$FileExtension"
Func-Write-Logfile -LogEintrag "and is transferd to: $file_targetpath"
Return "$FileFinal.Fullname"
}
Catch {
Func-Write-Logfile -LogEintrag "Error at $move_or_copy command, processing file: $filename_and_path"
Func-Write-Logfile -LogEintrag "Please check your privileges"
exit
}
IF ($move_or_copy -eq 'move') {
Func-Write-Logfile -LogEintrag "Moving action was choosen, will delete original file."
Try {
Remove-Item -Path "$filename_and_path" -Force
}
Catch {
Func-Write-Logfile -LogEintrag "Error removing the original file."
}
}
ELSEIF ($MoveorCopy -eq 'copy') {
Func-Write-Logfile -LogEintrag "Coping action was choosen, will not delete original file."
}
}
ELSE {
Set-Variable -Name FileTemp -Value (Copy-Item -Path "$filename_and_path" -Destination "$file_targetpath\$Timestamp3+"_"+$FileName" -PassThru -Force)
Set-Variable -Name FileFinal -Value (Rename-Item -Path "FileTemp" -NewName "$FileName$VersionSeperator$FileVersion.$FileExtension")
Func-Write-Logfile -LogEintrag "Command: $move_or_copy has been completed for file: $filename_and_path"
Func-Write-Logfile -LogEintrag "File is ranamed to: $FileName.$FileExtension"
Func-Write-Logfile -LogEintrag "and is transferd to: $file_targetpath"
Return "$FileFinal.Fullname"
}
}
#-----------------------------------------------------------------------------------------------------
####################################### 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)
$Sourcepath = (Func-ReadConfigValue -KonfigBezeichner Sourcepath)
$Destinationpath = (Func-ReadConfigValue -KonfigBezeichner Destinationpath)
$FileWhiteList = (Func-ReadConfigValue -KonfigBezeichner FileWhiteList)
#-----------------------------------------------------------------------------------------------------
####################################### 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 "*******************************************************************************************"
Func-Path-Check -Path $Sourcepath
Func-Path-Check -Path $Destinationpath
$Items = (Func-Dateien-zusammensuchen -SuchPath "$Sourcepath\*" -SuchWhiteList $FileWhiteList | where-object {$_.lastwritetime -lt (get-date).addminutes(-$FileDelayAge)} )
FOREACH ($Item in $Items)
{
Func-File-copy-or-move -filename_and_path "$Item" -file_targetpath $Destionationpath -move_or_copy move
}
#-----------------------------------------------------------------------------------------------------
####################################### Abschließende Arbeiten. ######################################
#-----------------------------------------------------------------------------------------------------
# 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 Path* -Force
Remove-Variable -Name *Datei* -Force
Remove-Variable -Name *Test* -Force
Remove-Variable -Name Item -Force
Remove-Variable -Name Items -Force
$error.clear()