Powershell mehrere Attachments (unbekannt) versenden

Ja, funktionieren tut es. Mir war nur die Semantik eben nicht klar und wollte nur drauf hinweisen. ;)
 
Ich will mich hier ja nicht groß einmischen, auch wenn ihr hier offensichtlich bei PowerShell Version 3 hängen geblieben seid. Ab Version 5.1 geht das alles weitaus kürzer, aber geschenkt ...

Die Behauptung von sikarr, dass [system.io.fileinfo[]] unnötig sei, ist einfach falsch.
Das ist gerade bei vielen und komplexen Dateien die schnellste und effektivste Methode von allen.

Und was bedeutet -gte ? GreaterThan(Or)Equal? Das funktioniert so nicht!
-ge muss es lauten -> Greater(Or)Equal
 
Micha45 schrieb:
Ich will mich hier ja nicht groß einmischen, auch wenn ihr hier offensichtlich bei PowerShell Version 3 hängen geblieben seid. Ab Version 5.1 geht das alles weitaus kürzer, aber geschenkt ...
Wie geht es denn weitaus kürzer als ein simpler One-Liner? Das interessiert mich jetzt wirklich... Bitte erhelle uns doch, statt hier einen auf beleidigte Leberwurscht zu machen.
Micha45 schrieb:
Die Behauptung von sikarr, dass [system.io.fileinfo[]] unnötig sei, ist einfach falsch.
Das ist gerade bei vielen und komplexen Dateien die schnellste und effektivste Methode von allen.
Code:
> dir $env:TEMP | % { $_.GetType().FullName + " extends " + $_.GetType().BaseType.FullName }
System.IO.DirectoryInfo
System.IO.DirectoryInfo
System.IO.DirectoryInfo
System.IO.DirectoryInfo
System.IO.DirectoryInfo
... alle Ordner ...
System.IO.FileInfo
System.IO.FileInfo
System.IO.FileInfo
System.IO.FileInfo
System.IO.FileInfo
System.IO.FileInfo
... alle Dateien ...
Aus welchem Grund sollte ich hier casten? System.IO.FileInfo kommt automatisch bei Dateien zurück und wie angemerkt, sollte sowieso auf den Parameter -File zurückgegriffen werden. Ein Cast bringt dir hier höchstens in der ISE für die Code Completion was, aber selbst diese ist eigentlich fortschrittlich genug um den Typen zu ermitteln...
Micha45 schrieb:
Und was bedeutet -gte ? GreaterThan(Or)Equal? Das funktioniert so nicht!
-ge muss es lauten -> Greater(Or)Equal
Oh ein Flüchtigkeitsfehler... Sollte beim ersten Run auffallen, wenn ein Syntaxfehler kommt...
 
Ich fühle mich jetzt weder berufen, hier jemanden zu erhellen, noch spiele ich die beleidigte Leberwurst.
Ihr macht das schon und es gibt ja vom Grundsätzlichen her nichts gegen eure Ausführungen einzuwenden.

Auf einen Fehler, oder von mir aus auch auf einen "Flüchtigkeitsfehler", wird man ja wohl noch hinweisen dürfen.
Wer spielt hier die beleidigte Leberwurst?
-gte kannte ich bisher nicht und es hätte ja sein können, dass mir dahingehend etwas entgangen ist.
 
@Yuuri
@sikarr

Der sagt mir sowas hier

-and : Die Benennung "-and" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die .....
Ergänzung ()

PowerShell:
$attachments = dir \\der\path | ? {

    where {$_.Name -match "test"} ` # test im Namen

    -and $_.Extension -eq ".txt" ` # Dateiendung .txt

    -and $_.LastWriteTime - [DateTime]::Now.AddDays( -7 ) -gte 0 # innerhalb von 1 Wochen

}
 
PowerShell:
$attachments = dir \\der\path | ? {

    $_.Name -match "test" ` # test im Namen

    -and $_.Extension -eq ".txt" ` # Dateiendung .txt

    -and $_.LastWriteTime - [DateTime]::Now.AddDays( -7 ) -ge 0 # innerhalb von 1 Wochen

}
Ich habe mal ein where-object wegenommen und die {} in der 3. Zeile entfernt, die waren zu viel und in der 7. Zeile das -gte in -ge geändert so wie es @Micha45 schon angemerkt hast. Ist ungetestet aber das sollte es eigentlich gewesen sein.
 
@sikarr
Hab jetzt beide -and weg genommen da Fehler aufgetreten sind.
Das Problem ist er findet nun nicht mal den Pfad:

PowerShell:
$attachments = dir \\der\path | ? {

    $_.Name -match ".*test.*" ` # test im Namen
}

=
Send-MailMessage : Das Argument für den Parameter "Attachments" kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL
oder leer ist, und führen Sie den Befehl erneut aus.
 
Poste doch mal bitte das genaue Script was du benutzt, weil \\der\pfad ist nicht gerade Aussagekräftig oder tausch nur die Wörter aus falls du dich damit sicherer fühlst.

Update:
Als 1 Zeiler gehts, liegt also an den Zeilenumbrüchen, da ich meine Scripte nicht so schreibe kann ich dir auch gerade nicht sagen woran das genau liegen könnte.
 
Zuletzt bearbeitet:
@sikarr
Bitteschön:
PowerShell:
$pw = Get-Content J:\Pfad\zum\Passwort\Datei.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential "absender@email.com", $pw


$attachments = dir \\Der\Pfad\zu\den\dateien | ? {

    $_.Name -match ".*test.*" ` # test im Namen
    
    -and $_.Extension -eq ".txt" ` # Dateiendung .txt

    -and $_.LastWriteTime - [DateTime]::Now.AddDays( -7 ) -ge 0 # innerhalb von 1 Wochen


}

Send-MailMessage -Credential $cred -SmtpServer 'smtp.office365.com' -Port '587' -Attachments $attachments -to $EMail -cc 'eine_cc@ad.com' -from 'absender@email.com' -UseSsl -Subject "DerText" -body "weiterer text" -encoding ([System.Text.Encoding]::UTF8)
Ergänzung ()

asoo einen Fehler gefunden:
Er sucht wie oben genannt im J Verzeichnis wo mein Skript liegt aber nicht im \\..... verzeichnis
 
Zuletzt bearbeitet:
PowerShell:
$attachments = dir "\\Pfad\derDatein" | ? {$_.Name -match "test" -and $_.Extension -eq ".txt" -and $_.LastWriteTime - [DateTime]::Now.AddDays( -7 ) -ge 0}
So funktionierts bei mir.
Kleine Anmerkung du hast im RegEx ".*test.*", ein match prüft innerhalb des String den Ausdruck, du musst also nicht noch explizit angeben das davor oder danach beliebige Zeichen auftreten dürfen, der gesuchte Ausdruck reicht in den Anführungszeichen. ;)
Ergänzung ()

Micha45 schrieb:
Ab Version 5.1 geht das alles weitaus kürzer, aber geschenkt ...
Dann erleuchte uns.
 
Zuletzt bearbeitet:
Wenn ihr ein Command über mehrere Zeilen für mehr Übersichtlichkeit nutzen wollt, dann nimmt man eigentlich Space + Backticks, also (ungetestet):

PowerShell:
$attachments = dir "\\Pfad\derDatein" | ? {$_.Name -match "test" `
-and ...
...

(Der Linux User nimmt in Bash z.B. auch Space + Backslash)
 
  • Gefällt mir
Reaktionen: sikarr
Komisch der sucht ständig im J: Verzeichnis wo das skript liegt
Habs nun raus kopiert von euch und nur den Pfad angepasst etc.

Meldung bleibt:
Send-MailMessage : Das Argument für den Parameter "Attachments" kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL
oder leer ist, und führen Sie den Befehl erneut aus.
Is ja logisch er findet die Datei unter J nicht
 
Hab ich mit " oder auch mit '
geht nicht... der sucht immer in "J:" (nehm ich an)
entferne ich die 2x -and und führe es dann aus, sehe ich das er in J: sucht
Fehler:Send-MailMessage : Die Datei "J:\Pfad\dfskafjdksjtest.txt" konnte nicht gefunden werden.

mit den 2x -and Fehler=
Send-MailMessage : Das Argument für den Parameter "Attachments" kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben
Sie ein Argument an, das nicht NULL oder leer ist, und führen Sie den Befehl erneut aus.
 
Wen ich den Pfad nach dir '\\hallo\pfad' ein \ anhänge findet er gleich die daten (als empfehlungsbeispiel) zb. 'hallo\pfad\' zeigt er gleich an in der Vorschau alle Daten darin.
Ergänzung ()

wen ich nur den Bereich attachments ausführe...
Wie zeige ich mir den Inhalt danach von $attachments an?
 

Ähnliche Themen

Zurück
Oben