Param( [string]$source, [array]$sourceorg, [string]$destimage, [string]$destthumb, [array]$destorg, [int]$sizeimage, [int]$sizethumb, [string]$sourceext, [string]$targetext, [string]$logdir, [string]$archive, [string]$config, [string]$createconfig, [array]$cleanfolder ) [reflection.assembly]::LoadWithPartialName("System.Drawing") # Script: ImageConversion.ps1 # Author: Sander Stad # Version: 1.1 # Function: # This script is used for converting images to other imagetypes. # I.e converting TIFF to GIF. # Images can be resized based on parameters. # # -source Location of original files # -sourceorg Sourcedirectory that needs to be reorganized # -destimage Destination directory images # -destthumb Destination directory thumbnails # -destorg Destination directory that needs to be reorganized # -sizeimage New size image (longest side) # -sizethumb New thumbnail size (longest sie) # -sourceext Extention source files # -targetext Extention destination files # -logdir Directory for logfiles # -archive Directory for archived files # -config Path to configuration file # -createconfig Directory new configuration file # -cleanfolder Directory that needs to be cleaned after processsing # Instellen van de standaard variabelen New-Variable -name MAXSIZEIMAGE -value 988 -option Constant New-Variable -name MAXSIZETHUMB -value 300 -option Constant New-Variable -name SOURCEEXTENSION -value "tif" -option Constant New-Variable -name TARGETEXTENSION -value "gif" -option Constant # Function Write-Logfile # Deze Function schijft, indien er een error is gevonden, een regel weg in een logbestand. # Het logbestand wordt opgemaakt uit een naam en de datum op basis van yyyymmdd. # # Parameters: # [string] $message: Bericht dat weggeschreven moet worden in het logbestand Function Write-Logfile([string]$message){ $date = Get-Date -format "yyyyMMdd" $logtime = Get-Date -Format "[HH:mm:ss]" $logfile = $logdir + "\" + "logfile" + $date + ".log" Add-Content $logfile "$logtime $message" } # Function Check-Extension # Deze Function controleert of de extensie opgegeven is bij het starten van het script. # Zo niet dan wordt er een foutmelding gegenereert en weggeschreven in het logbestand. # # Parameters: # [string] $strExt: Extensie waarnaar de bestanden omgezet moeten worden # Return: # [int] 0: Bij een succes wordt een 0 teruggegeven # [int] 1: Bij een fout wordt een 1 teruggegeven Function Check-SourceExtension([string]$strExt){ If([string] $strExt -eq ""){ $message = "Er is geen bronextensie opgegeven. Standaard extensie $SOURCEEXTENSION wordt gebruikt." Write-Logfile $message Write-Host $message Return 0 } return 0 } # Function Check-Extension # Deze Function controleert of de extensie opgegeven is bij het starten van het script. # Zo niet dan wordt er een foutmelding gegenereert en weggeschreven in het logbestand. # # Parameters: # [string] $strExt: Extensie waarnaar de bestanden omgezet moeten worden # Return: # [int] 0: Bij een succes wordt een 0 teruggegeven # [int] 1: Bij een fout wordt een 1 teruggegeven Function Check-TargetExtension([string]$strExt){ If([string] $strExt -eq ""){ $message = "Er is geen doelextensie opgegeven. Standaard extensie $TARGETEXTENSION wordt gebruikt." Write-Logfile $message Write-Host $message Return 0 } return 0 } # Function Check-Dimensions # Deze Function controleert of de gegevens die aangegeven zijn voor de verkleiningen. # # Parameters: # [int] $sizeimage: Grootte afbeelding voor weergave # [int] $sizethumb: Grootte afbeelding voor verkleining # Return: # [int] 0: Bij een succes wordt een 0 teruggegeven # [int] 1: Bij een fout wordt een 1 teruggegeven Function Check-Dimensions($sizeimg, $sizethb){ # Als de groote van de verkleining groter is dan de grootte van de afbeelding # Geef dan een error If($sizeimg -ne "" -and $sizeimg -lt $sizethb){ $message = "Grootte afbeelding is groter dan grootte verkleining.b" Write-Logfile $message Write-Host $message Return 1 } # Als de ingegeven variabelen geen waarde hebben If($sizeimg -eq "" -or 0){ $message = "Er is geen grootte voor de afbeelding aangegeven." Write-Logfile $message Write-Host $message Return 1 } # Als de ingegeven variabele geen waarde hebben If($sizethb -eq "" -or 0){ $message = "Er is geen grootte voor de verkleining aangegeven." Write-Logfile $message Write-Host $message Return 1 } return 0 } # Function Check-Config # Deze Function controleert het configuratiebestand # # Parameters: # [string] $strConf: Directoryvariabele # Return: # [int] 0: Bij een succes wordt een 0 teruggegeven # [int] 1: Bij een fout wordt een 1 teruggegeven Function Check-Config([string]$strConf){ # Als de directory niet opgegeven is If(!(Test-Path $strConf)){ # Schrijf de error weg in het logbestand $message = "Het configuratiebestand $config bestaat niet!" Write-Host $message Write-Logfile $message Return 1 } Return 0 } # Function Check-Directories # Deze Function controleert of de opgegeven directories bestaan of dat de # doorgegeven variabele een waarde bevat # # Parameters: # [string] $strDir: Directoryvariabele # Return: # [int] 0: Bij een succes wordt een 0 teruggegeven # [int] 1: Bij een fout wordt een 1 teruggegeven Function Check-Directories([string]$strDir){ # Als de directory niet opgegeven is If([string] $strDir -eq ""){ $message = "Er is geen directory opgegeven" Write-Logfile $message Write-Host $message Return 1 } If(!(Test-Path $strDir)){ $message = "Directory $strDir bestaat niet!" Write-Logfile $message Write-Host $message Return 1 } Return 0 } # Function Check-Logdir # Deze Function controleert of de directory waar de logbestanden worden weggeschreven # wel opgegeven is of al dan niet bestaat # # Parameters: # [string] $strLogdir: Directoryvariabele van de logbestanden # Return: # [int] 0: Bij een succes wordt een 0 teruggegeven # [int] 1: Bij een fout wordt een 1 teruggegeven Function Check-Logdir([string]$strLogdir){ #Als er geen logbestand opgegeven is If([string] $logdir -eq ""){ $message = "Er is geen logdirectory opgegeven" Write-Host $message Return 1 } #Als de directory niet bestaat waar de logbestanden naartoe worden geschreven If(!(Test-Path $strLogdir)){ $message = "De logdirectory $strLogdir bestaat niet!" Write-Logfile $message Write-Host $message Return 1 } Return 0 } # Function Get-Imageformat # Bepaal op basis van de extensit wat het afbeeldingformaat moet worden # # Parameters: # [string] $strExt: String met de extensie # Return: # [string] $imageFormat: Tekst met het afbeeldingsformaat Function Get-Imageformat([string]$strExt){ $imageFormat = ""; # Controleer de extensie Switch($strExt){ # Scrhijf de extensie weg in de variabele "gif" {$imageFormat = "gif"} "GIF" {$imageFormat = "gif"} "jpg" {$imageFormat = "jpeg"} "jpeg" {$imageFormat = "jpeg"} "tiff" {$imageFormat = "tiff"} "TIFF" {$imageFormat = "tiff"} "png" {$imageFormat = "png"} "PNG" {$imageFormat = "png"} # Als er geen geldig formaat gevonden is schrijf dit weg in het logbestand # en stop het script default { $message = "De extensie is geen bekend afbeeldingsformaat!" Write-Logfile $message Write-Host $message exit 0 } } # Geef het afbeeldingformaat terug Return $imageFormat } # Function Get-Sourcedirs # Deze Function haalt alle subdirectories en bestanden op uit de opgegevens string # # Parameters: # [string] $s # Resturns # [array] $y: Array met alle subdirectories en bestanden Function Get-Sourcedirs([string]$s, [string]$e){ # Voer Get-Child-Item Function uit met volledige naam $y = Get-ChildItem -r $s -include $e | % { $_.FullName } # Geef resultaten terug return $y } # Function Replace-String # This function replaces a certain text in a string # # Parameters: # [string] $find: Text that needs to be searched for # [string] $replace: Text that the original text needs to be replaced with # [string] $string: Text what should be searched in Function Replace-String([string]$find, [string]$replace, [string]$string) { # Replace text $x = $string.Replace($find, $replace) # Return results return $x } # Function Move-Image # Deze Function verplaatst de afbeelding van de ene locatie anar de ander. # Controleert verder of de directory al bestaat. Zo niet maakt deze aan. # # Parameters: # [string] $imageLocation: Originele locatie van de afbeelding # [string] $to: Locatie waar de afbeelding naartoe moet Function Move-Image([string]$imageLocation, [string] $to){ # Maak de nieuwe locatie op van de afbeelding door het oude pad te # vervangen door het nieuwe $newImageLocation = Replace-String $source $to $imageLocation # Haal alleen de directory op uit het pad $newFolder = [System.IO.Path]::GetDirectoryName($newImageLocation) # Testen of het nieuwe pad al bestaat If(!(Test-Path $newFolder)){ # Als deze niet bestaat maak het pad aan New-Item $newFolder -type directory } # Verplaats de afbeelding Move-Item $imageLocation $newImageLocation -force } # Function Convert-Image # Thi function converts the image and creates a thumbnail # # Parameters: # [string] $sourceImage : Path to image # [string] $destinationDir : Destination directory for the image # [int] $newSize : New size for image # [string] $extension : New extension or image # [string] $imgFormat : New imageformat for image Function Convert-Image ( [string]$sourceImage, [string]$destinationDir, [int]$newSize, [string]$extension, [string]$imgFormat ) { # Create a new imageobject Write-Host "Afbeelding: " $sourceImage $oldImage = new-object System.Drawing.Bitmap $sourceImage # If there is an error write to logfile If($Error.Count -ne 0) { Write-Logfile($Error) $Error.Clear() } # Get the height of the original image $longSide = $oldImage.Height # If the height is smaller than width If($oldImage.Height -lt $oldImage.Width) { # Set the longest side to be the width $longSide = $oldImage.Width } # If the longest side is greater than the new size If ($longSide -gt $newSize) { # If the height of the original image is lower than the with If ($oldImage.Height -lt $oldImage.Width) { # Set the variables $newH = $newSize $newW = [int]($oldImage.Width * $newSize / $oldImage.Height) # If the height of the original image is greater than the width } Else { $newW = $newSize $newH = [int]($oldImage.Height * $newW / $oldImage.Width) } # Create a new imageobject $newImage = new-object System.Drawing.Bitmap $newW, $newH $g = [System.Drawing.Graphics]::FromImage($newImage) # Use high quality conversion $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic # Resize the image $g.DrawImage($oldImage, 0, 0, $newW, $newH) # Generate a name for the image $name = [System.IO.Path]::GetFileNameWithoutExtension($sourceImage) + ".$extension" # Create the folders where the image will be copied $oldFolder = [System.IO.Path]::GetDirectoryName($sourceImage) $newFolder = Replace-String $source $destinationDir $oldFolder # Check if the path exists. If not create it If(!(Test-Path $newFolder)){ New-Item $newFolder -type directory } # Setup the full path of the new image $newFile = $newFolder + "\" + $name # Save the new image $newImage.Save($newFile, ([system.drawing.imaging.imageformat]::$imageFormat)) # Write the results to a logfile Write-Logfile "Afbeelding $newFile geconverteerd" # Remove data of the proces from memory $newImage.Dispose() $oldImage.Dispose() } Else { Write-host -NoNewLine "." $oldImage.Dispose() } } # Function Reorganise-Folders # Deze Function reorganiseert de directories van de afbeeldingen door # de de directorie in een hoofddirectory te zetten die bestaat uit de # eerste drie tekens van de originele directory. # Bijvoorbeeld: 1020567 wordt geplaatst in hoofddirectorie 102 # # Parameters: # [array] $s: Brondirectory # [array] $d: Doeldirectory Function Reorganise-Folders($s, $d){ # Controleer of de directories correct zijn en bestaan If($s.length -and $d.length -gt 0){ For($i = 0; $i -lt $s.length; $i++){ If((Check-Directories $s[$i]) -ne 0){ exit 0} If((Check-Directories $d[$i]) -ne 0){ exit 0} # Ophalen van alle directories $arraySourcedirs = Get-ChildItem $s[$i] | Where { $_.attributes -eq "Directory" } # Loop door de array heen If($arraySourcedirs.length -gt 0){ Foreach($item in $arraySourcedirs){ # Converteren van arrayitem naar string [string] $dir = $item # Controleren of de lengte van de directory niet groter is dan 3 If($dir.length -gt 3){ # Opmaken van de nieuwe naam dat bestaat uit de eerste drie # tekens van de huidige directory $newName = $dir.Substring(0,3); # Opmaken van de oude en nieuwe paden $oldDir = $s[$i] + "\" + $dir $newDir = $d[$i] + "\" + $newName + "\" + $dir # Testen of het nieuwe pad bestaat If(!(Test-Path $newDir)){ # Als deze niet bestaat maak het nieuwe pad aan New-Item $newDir -type directory } # Verplaats de directory naar de nieuwe locatie #Move-Item $oldDir $newDir -force -verbose Write-Host "robocopy.exe $olddir $newdir /E /S /R:10 /MOVE" robocopy.exe $olddir $newdir /E /R:10 /MOVE /IS } } } } } } # Function Show-Inputbox # Deze Function genereert een popup box waar waardes in ingevoerd kunnen worden # # Parameters: # [string] $question: Vraag in het scherm # [string] $title: Titel van de box # [string] $default: standaard waarde als iemand op cancel klikt Function Show-Inputbox([string]$question, [string]$title, [string]$default) { [reflection.assembly]::loadwithpartialname("microsoft.visualbasic") | Out-Null [microsoft.visualbasic.interaction]::InputBox($question, $title, $default) } # Function Create-Config # Deze Function maakt het mogelijk om een configuratiebestand te genereren # # Parameters: # [array] $loc: Locatie van het aan te maken configuratiebestand Function Create-Config($loc){ # Initialiseren van de variabelen $var1 = Show-Inputbox "Brondirectory van de afbeeldingen" "Bronbestanden Afbeeldingen" "" $var2 = Show-Inputbox "Brondirectory voor reorganisatie" "Brondirectory Reorganisatie" "" $var3 = Show-Inputbox "Doeldirectory van de grote afbeeldingen" "Doeldirectory Grote Afbeeldingen" "" $var4 = Show-Inputbox "Doeldirectory van de kleine afbeeldingen" "Doeldirectory Kleine Afbeeldingen" "" $var5 = Show-Inputbox "Doeldirectory voor reorganisatie" "Doeldirectory reorganisatie" "" $var6 = Show-Inputbox "Archiefdirectory voor afbeeldingen" "Archiefdirectory" "" $var7 = Show-Inputbox "Grootte van de normale afbeeldingen" "Grootte Afbeeldingen" "" $var8 = Show-Inputbox "Grootte van de verkleinde afbeeldingen" "Grootte Verkleiningen" "" $var9 = Show-Inputbox "De op te zoeken extensie(s)" "Bronextensie" "" $var10 = Show-Inputbox "Nieuwe Extensie" "Doelextensie" "" $var11 = Show-Inputbox "Directory voor het logbestand" "Logdirectory" "" $var12 = Show-Inputbox "Directory voor opschonen" "Directory voor opschonen" "" # Instellen van de variabele met de xml data $xmlconfig = [xml]" $var1 $var2 $var3 $var4 $var5 $var6 $var7 $var8 $var9 $var10 $var11 $var12 " # Opslaan van de data If(!(Test-Path $loc)){ New-Item $loc -type file } $xmlconfig.save($loc) } # Function Clean-Folders # Deze Function maakt het mogelijk om directories op te schonen die lege directories # bevatten. # # Parameters: # [array] $folder: Locatie die opgeschoond moet worden Function Clean-Folder($folder){ Foreach($i In $folder){ # Ophalen van de directories $f = Get-ChildItem $i | Where-Object {$_.PSIsContainer -eq $True} #Controleer of er resultaten zijn If($f.length -gt 0){ # Loop door de items heen Foreach ($item in $f){ # Controleer of de directory geen bestanden bevat If($item.GetFiles().Count -eq 0){ # Opmaken van de directory $d = $i + "\" + $item # Controleer of deze "nog" bestaat If(Test-Path $d){ # Verwijder de directory Remove-Item $d -Recurse } } } } } } Function Init(){ $Error.Clear() # Als de createconfig parameter ingegeven is start de Function If($createconfig -ne ""){ Create-Config $createconfig } # Controleer of de parameter -config meegegeven is. Zo ja dan wordt het # configuratiebestand geladen If($config -ne ""){ # Bestaat het bestand If((Check-Config $config) -eq 0){ $xmlconfig = [xml]( Get-Content $config) $source = $xmlconfig.Configuration.SourceImages $sourceorg = @() Foreach($s In $xmlconfig.Configuration.SourceReorganisation.Source){ $sourceorg = $sourceorg + $s } $destimage = $xmlconfig.Configuration.DestinationImage $destthumb = $xmlconfig.Configuration.DestinationThumb $destorg = @() Foreach($d In $xmlconfig.Configuration.DestinationReorganisation.Destination){ $destorg = $destorg + $d } $archive = $xmlconfig.Configuration.ImageArchive $sizeimage = $xmlconfig.Configuration.SizeImage $sizethumb = $xmlconfig.Configuration.SizeThumb $sourceext = $xmlconfig.Configuration.SourceExtension $targetext = $xmlconfig.Configuration.TargetExtension $logdir = $xmlconfig.Configuration.Logdirectory $cleanfolder = @() Foreach($c In $xmlconfig.Configuration.CleanFolder.Folder){ $cleanfolder = $cleanfolder + $c } }Else{ exit 0 } } # Controles op waardes If((Check-Logdir $logdir) -ne 0){exit 0} If((Check-SourceExtension $sourceext) -ne 0){ exit 0 } If((Check-TargetExtension $targetext) -ne 0){ exit 0 } If((Check-Dimensions $sizeimage $sizethumb) -ne 0){ exit 0} If((Check-Directories $source) -ne 0){ exit 0} If((Check-Directories $destimage) -ne 0){ exit 0} If((Check-Directories $destthumb) -ne 0){ exit 0} If((Check-Directories $archive) -ne 0){ exit 0} If((Check-Directories $archive) -ne 0){ exit 0} # Ophalen van het afbeeldingformaat $imageFormat = Get-Imageformat $targetext # Ophalen van alle bestanden en directories uit de bron $arraySourcedir = Get-Sourcedirs $source $sourceext # Als er resultaten zijn in de bronarray If($arraySourcedir.length -gt 0){ # Loop door de procedures heen Foreach($item In $arraySourcedir){ Convert-Image $item $destimage $sizeimage $targetext $imageFormat Convert-Image $item $destthumb $sizethumb $targetext $imageFormat Move-Image $item $archive } }Else{ # Schrijf de error weg in het logbestand $message = "Er zijn geen afbeeldingen gevonden in de opgegeven directory!" Write-Host $message Write-Logfile $message } # Reorganiseer de directories Reorganise-Folders $sourceorg $destorg # Als de cleanfolder paramater aangegeven is start het opschonen If($cleanfolder){ If($cleanfolder.length -gt 0){ Clean-Folder $cleanfolder } } } Init