beginner2020
Goto Top

Powershell - Schleifeproblem - variablen Werte

Hallo liebe Community,

ich komme bei einem Logikfehler nicht weiter, der wahrscheinlich aufgrund der zusammengetragenen Code-Schnipsel aufgetreten ist.
Powershell ist ziemlich Neuland - seid gestern.

Aufgabe: pdf2email
In einem Verzeichnis liegen mehrere PDF/A Dateien, in denen eine E-Mailadresse gesucht werden soll.
Die einzelne PDF soll dann als Anhang an die ausgelesene E-Mailadresse versandt werden.
Nach erfolgreichen E-Mailversand wird das PDF verschoben, das nächste PDF wird ausgelesen, bis kein Dokument mehr in dem Verzeichnis vorhanden ist.

Was funktioniert:
- auslesen der PDF und extrahieren des E-Mail Stings in eine Variable
- auslesen des Dateinames in eine Variable für Dateiahang

Was funktioniert nicht:
Die Abarbeitung der Schleife, bei mehreren vorhandenen Dateien wird je vorhandener Datei ein Wert in die Variable eingetragen.
In den Variablen sollte jedoch nur die Werte der ersten Datei geschrieben werden.

Könnt ihr mir weiterhelfen?

Add-Type -Path ‘C:\pdf2mail\addon\itextsharp.dll’
$i = 1
Get-ChildItem "C:\pdf2mail\pdf" -Filter *.* |   
Foreach-Object {
$reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $_.FullName 
       

for ($page = 1; $page -le $reader.NumberOfPages; $page++)
{
    $strategy = new-object  'iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy'              
    $currentText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader, 1, $strategy);
    [string[]]$Text = [system.text.Encoding]::UTF8.GetString([System.Text.ASCIIEncoding]::Convert( [system.text.encoding]::default  , [system.text.encoding]::UTF8, [system.text.Encoding]::Default.GetBytes($currentText)));      
}
$Reader.Close();

$text = $Text -replace "\s{1,}", ""  
$separator = "vorEmail:","nachEmail"  
$option = [System.StringSplitOptions]::RemoveEmptyEntries
$emailto = $text.Split($separator,$option)[1]
$emailto

}

$attachment = Get-ChildItem "C:\pdf2mail\pdf" -Filter *.* | select name  
'$attachment'  
$attachment

Output:
E-Mailadresse1
E-Mailadresse2
$attachment

Der Output sieht wie folgt aus:
E-Mailadresse1
E-Mailadresse2
$attachment

Name                                      
----                                      
PDF-name1
PDF-name2

Die Variablen auf den ersten Zeilenwert zu begrenzen mit funktioniert leider nicht wie erwartet.

Vielen Dank

Beginner2020

Content-ID: 554582

Url: https://administrator.de/forum/powershell-schleifeproblem-variablen-werte-554582.html

Ausgedruckt am: 23.04.2025 um 00:04 Uhr

emeriks
Lösung emeriks 06.03.2020 aktualisiert um 10:41:41 Uhr
Goto Top
Hi,
Aufgabe ungenau formuliert.
Liefert jedes PDF genau eine Email-Adresse und soll dann jedes PDF einzeln an die daraus extrahierte Email-Adresse gesendet werden oder sollen mehrere PDF an nur eine Email-Adresse gesendet werden?

Falls erstes, dann sollte der Fehler in den Zeilen >23 liegen. Diese müssten dann noch vor dem "}" in Zeile 22. Zeile 24 müsste dabei angepasst werden, weil Du dann ja den Namen des zu sendenden PDFs bereits hast.
Sprich: Die Aktionen zum Versenden jedes einzelnen PDF's müssen in den Block oberhalb Zeile 22.

Tipp am Rande:
Rücke die Zeilen je Block ein, dann ist das übersichtlicher zu verstehen, besonders bei Logik-Fehlern.

Dein Text 1:1 würde dann so aussehen:
Add-Type -Path ‘C:\pdf2mail\addon\itextsharp.dll’
$i = 1
Get-ChildItem "C:\pdf2mail\pdf" -Filter *.* |   
Foreach-Object {
  $reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $_.FullName 

  for ($page = 1; $page -le $reader.NumberOfPages; $page++)
  {
    $strategy = new-object  'iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy'              
    $currentText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader, 1, $strategy);
    [string[]]$Text = [system.text.Encoding]::UTF8.GetString([System.Text.ASCIIEncoding]::Convert( [system.text.encoding]::default  , 
    [system.text.encoding]::UTF8, [system.text.Encoding]::Default.GetBytes($currentText)));      
  }
  $Reader.Close();

  $text = $Text -replace "\s{1,}", ""  
  $separator = "vorEmail:","nachEmail"  
  $option = [System.StringSplitOptions]::RemoveEmptyEntries
  $emailto = $text.Split($separator,$option)[1]
  $emailto
}

$attachment = Get-ChildItem "C:\pdf2mail\pdf" -Filter *.* | select name  
'$attachment'  
$attachment

Output:
E-Mailadresse1
E-Mailadresse2
$attachment
Du erkennst den Unterschied?

E.
Beginner2020
Beginner2020 08.03.2020 um 20:12:29 Uhr
Goto Top
Hallo emeriks,

vielen Dank, dass du dir die Zeit genommen hast mir zu helfen.

Ich habe deinen Ratschlag umgesetzt, leider ohne Erfolgt und bin mittlerweile auf das Script von colinardo gewechselt.

Skript zum Auslesen und Automatischen Versenden von E-Mails