funkervogt
Goto Top

.txt Dateien aus Ordner in Array laden.

Hallöchen,

habe wieder einmal ein kleines Problemchen, welches
hoffentlich durch Eure Hilfe schnell als erledigt markiert
werden kann.

Ich hab einen Ordner in dem durch einen Task eine
ungewisse Zahl .txt Dateien hinein kopiert werden.

Diese sollen wiederum durch eine .ps1 per Mail
versand werden. Das versenden von einer .txt
klappt Problemlos. Nur wie bekomme ich mehrere
Textdateien in ein Array um diese dann an die

 $Attachment = new-object Net.Mail.Attachment($TextDateiEn)

zu übergeben un zu versenden. Also als Attachment.

Muss jetzt keine Arraylösung sein. Für mich aber der
plausibelste Ansatz.

$Count = @(Get-ChildItem $Pfad -include "*.txt")   
$Count.gettype() 
$Count1=$Count.count
$Count1

Ich weiß also schon mal wieviele Dateien ins Array müssen.


Nur wie gesagt, bekomme ich jetzt diese X .txt Dateien ins Array????


Danke schon mal fürs grübeln und posten Eurer Vorschläge.


Zwischenzeitlich habe ich schon mal herausgefunden, dass $Count bereits
mit den Namen der .txt Dateien gefüllt ist.

Wäre nur noch die Frage, wie ich diese aneinandergereit als Variable speichere.

$TextDateiEn = $Count+$Count[1]+ x --- für den Mailversand

Content-Key: 206225

Url: https://administrator.de/contentid/206225

Printed on: April 19, 2024 at 14:04 o'clock

Member: colinardo
colinardo May 08, 2013 updated at 12:23:18 (UTC)
Goto Top
Hallo FunkerVogt,

get-childitem -Path $Pfad -Filter *.txt | %{$att = New-Object Net.Mail.Attachment($_.FullName); $Mail.Attachments.Add($att)}
wobei $MAIL dein Mailobjekt ist und $Pfad dein Pfad zu den *.txt-Dateien.

Zur Info: %{} ist eine Abkürzung für ein foreach-object

Grüße Uwe
Member: colinardo
colinardo May 08, 2013 updated at 12:48:48 (UTC)
Goto Top
wenn es denn ein Array sein soll/muss:
$arr = new-object collections.arraylist
dir c:\Pfad\*.txt | %{$arr.Add($_.FullName)}
$arr | %{$Mail.Attachments.Add($_)}
oder alternativ noch als Hashtable ohne ein .Net-Object :
$hashTable = @{}
$i = 0
dir *.csv | %{$hashTable.Add($i,$_.FullName); $i +=1}
$hashTable.GetEnumerator() | %{$Mail.Atachments.Add($_.Value)}
Member: FunkerVogt
FunkerVogt May 08, 2013 at 13:28:04 (UTC)
Goto Top
Danke Colinardo,

hab Deine Varianten durchprobiert aber trotz anpassens Fehler erhalten.
Auf Fehlersuche hatte ich bis jetzt noch keine Lust (Schande über mich)!

Aber vielleicht kennst Du oder jemand anderes eine alternative Methode/Möglichkeit,
dem Attachmentfile (Net.Mail.Attachment($TextDateiEn)) per Zuweisung
mehrere Dateien unterzujubeln. Quasi $TextDateiEn = $Datei + $Datei2 + $Dateix.?

Trotzdem erst einmal vielen Dank.

Gruss

Uwe
Member: colinardo
colinardo May 08, 2013 at 13:37:33 (UTC)
Goto Top
Zitat von @FunkerVogt:
Aber vielleicht kennst Du oder jemand anderes eine alternative Methode/Möglichkeit,
dem Attachmentfile (Net.Mail.Attachment($TextDateiEn)) per Zuweisung
mehrere Dateien unterzujubeln. Quasi $TextDateiEn = $Datei + $Datei2 + $Dateix.?
geht immer nur One-by-One ...

poste halt deinen ganzen Code dann finden wir den Fehler. face-wink
Member: FunkerVogt
FunkerVogt May 08, 2013 at 13:48:36 (UTC)
Goto Top
Ich schick jetzt nich alles... das Sendmailgedöns spare ich mir einfach mal

$Datei = ""  
$Pfad2 = Get-Location
$fileItem = Get-Item "*.txt"   
$filename = $fileItem.Name 


# liefert den übergeordneten Ordner

$Pfad3 = Split-Path $Pfad2 -Parent
$Pfad4 = Split-Path $Pfad2 -leaf

# prüft ob im Ordner min 1 .txt Datei vorhanden ist 
$CheckDat = $Pfad3 + "\" + $Pfad4 + "\*.txt"  

# zählt die Anzahl der .txt Dateien im Ordner
$Count = @(Get-ChildItem $CheckDat -include "*.txt")   
$Count.gettype() 
$Count1=$Count.count


If (Test-Path $CheckDat)
    {
    "Datei existiert"  
If ($Count1 -gt 0)
{
# Zuweisung des Attatchments bei mehreren Dateien

for($i=0; $i -lt $Count1; $i++)
{
$Datei = $Count[$i]

}
}

else

{
# Zuweisung des Attatchments bei einer Datei
$Datei = $Pfad3 + "\" + $Pfad4 + "\" + $filename  
$Attachment = new-object Net.Mail.Attachment($Datei)
}

# MAilversand

     function sendmail($body)

Bitte nix zu den Variablen sagen und ist sicherlich auch nich professionell aber
meiner einer steckt noch in den Powershellkinderschuhen.

Das Skript ist auch gewachsen. Hieß zuerst die Dateien enthalten nur eine .txt Datei
nun wurden es vielleicht doch mehr.
Member: colinardo
colinardo May 08, 2013 updated at 16:00:10 (UTC)
Goto Top
OK zu dem Code sag ich jetzt mal nix, weil jeder mal anfängt !

habe nur die IF-Bedingung rausgenommen die überprüft wie viele Dateien vorhanden sind, die brauchen wir bei dem Befehl der verwendet wird nicht. Den Rest habe ich so gelassen wie er ist da wären zu viele Kommentare nötig...

Warum es bei dir nicht funktioniert hat ist weil du wahrscheinlich für das versenden eine Function benutzt und das Mail-Object nicht Public deklariert hast. Habe Dir eine sendmail-Function gebaut der du die Attachments einfach als Liste von Dateien übergibst (bzw. die Ausgabe des get-childitem-Befehls verwenden kannst).

Function sendmail($FROM,$TO,$SUBJECT,$BODY,$ATTACHMENTS){
  $SMTPHOST = "mailserver"  
  $SMTPPORT = 25
  $SMTPClient = New-object System.Net.Mail.SmtpClient($SMTPHOST,$SMTPPORT)
  $SMTPClient.EnableSsl = $true
  $Mail = new-object System.Net.Mail.MailMessage
  $Mail.from = $FROM 
  $Mail.to.add($TO)
  $SMTPUSER = "SMTPUSERNAME"  
  $SMTPPass = "SUPERGEHEIMESPASSWORT"  
  $SMTPClient.Credentials = new-object System.Net.NetworkCredential($SMTPUSER,$SMTPPass)
  $Mail.Subject = $SUBJECT
  $Mail.Body = $BODY
  if ($ATTACHMENTS -ne $NULL){
    foreach ($att in $ATTACHMENTS){
      $Mail.Attachments.Add($att.FullName)
    }
  }
  $SMTPClient.Send($Mail)
}



$Datei = ""  
$Pfad2 = Get-Location
$fileItem = Get-Item "*.txt"   
$filename = $fileItem.Name 


# liefert den übergeordneten Ordner

$Pfad3 = Split-Path $Pfad2 -Parent
$Pfad4 = Split-Path $Pfad2 -leaf

# prüft ob im Ordner min 1 .txt Datei vorhanden ist 
$CheckDat = $Pfad3 + "\" + $Pfad4 + "\*.txt"  

# zählt die Anzahl der .txt Dateien im Ordner
$Count = @(Get-ChildItem $CheckDat -include "*.txt")   
$Count.gettype() 
$Count1=$Count.count

# das hier wurde eingefügt
$file_attachments = get-childitem -Path $Pfad2 -Filter *.txt
#-------------------------

# Mailversand NEU --------------
sendmail "der@sender.com" "der@empfaenger.com" "DEIN BETREFF" "DER INHALT" $file_attachments  
# ------------------------------

Grüße Uwe