ablaze 10 Geschrieben 16. März 2013 Melden Teilen Geschrieben 16. März 2013 Hallo zusammen, ich habe ein Problem bei einem kleinen PowerShell Script. Ziel ist es eine Ausgabe eines PowerShell Befehels per E-Mail zuu versenden. Wenn möglich hätte ich gern die Ausgabe im Body und nicht als Anhang. So weit bin ich schon. 1) Ausagbe in eine Variable schreiben $log=(Get-ChildItem C:\Backup | Sort-Object LastWriteTime) 2) E-Mailvesand send-mailmessage -from [ABSENDER] -to [EMPFÄNGER] -subject [BETREFF] -body $log -smtpServer [MAILSERVER] Es kommt jedoch folgende Fehlermeldung: Send-MailMessage : "System.Object[]" kann nicht in den Typ "System.String" konvertiert werden, der für den Parameter "Body" erforderlich ist. Die angegebene Methode wird nicht unterstützt. Gibt es evt. einen anderen Ansatz? Danke und Grüße Sebastian Zitieren Link zu diesem Kommentar
Fresh0razoR 10 Geschrieben 16. März 2013 Melden Teilen Geschrieben 16. März 2013 Ja, du bekommst ein Objekt zurück vom oberen Befehl, von dem musst du den String verwenden. I.d.R. reicht ein ".toString()" am Ende, evtl. jedoch gibt es auch eine Eigenschaft, genau den String enthält. Zeig bitte mal was du genau ausgeführt hast. Gruß Fresh Ah, sorry erst jetzt genau geguckt ;) Also wenn du $log | Get-Member schreibst, siehst du alle Eigenschaften. Dort sind ein paar die interessant sind für dich. Probier mal: send-mailmessage -from [ABSENDER] -to [EMPFÄNGER] -subject [BETREFF] -body $log.Fullname -smtpServer [MAILSERVER] Zitieren Link zu diesem Kommentar
ablaze 10 Geschrieben 16. März 2013 Autor Melden Teilen Geschrieben 16. März 2013 Hallo Fresh, vielen Dank für deine Antwort. Ich habe deinen PowerShell Vorschlag mal ausgeführt, es kommt folgende Meldung: Send-MailMessage : Das Argument für den Parameter "Body" 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 dann den Befehl erneut aus. Bei Zeile:1 Zeichen:137 + send-mailmessage -from [MAILSERVER] -to [EMPFÄNGER] -subject "Backup PST-File" -body <<<< $pstlog.Fullname -smtpServer [MAILSERVER] + CategoryInfo : InvalidData: (:) [Send-MailMessage], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SendMailMessage Der Inhalt der Variable "log" passt. Grüße Sebastian Zitieren Link zu diesem Kommentar
Fresh0razoR 10 Geschrieben 16. März 2013 Melden Teilen Geschrieben 16. März 2013 Hi, sorry mea culpa. Du hast eine Liste und die hat keinen String. Bitte folgendes vor dem Send-MailMessage noch ausführen: $logstring = log | Out-String dann kannst du deinen alten SendMailmessage Befehl wieder verwenden (ohne Fullname). Gruß Fresh Zitieren Link zu diesem Kommentar
ablaze 10 Geschrieben 16. März 2013 Autor Melden Teilen Geschrieben 16. März 2013 Du meintest bestimmt: $logstring = $log | Out-String Anschließend habe ich Send-MailMessage ohne ".fullname" ausgeführt, erhalte jedoch wieder eine Fehlermeldung: Send-MailMessage : "Discoverysuchpostfach.pst Administrator.pst" kann nicht in den Typ "System.String" konvertie rt werden, der für den Parameter "Body" erforderlich ist. Die angegebene Methode wird nicht unterstützt. Bei Zeile:1 Zeichen:137 + send-mailmessage -from [MAILSERVER] -to [EMPFÄNGER] -subject "Backup PST-File" -body <<<< $pstlog.Fullname -smtpServer [MAILSERVER] + CategoryInfo : InvalidData: (:) [Send-MailMessage], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SendMailMessage Noch als kleine Ergänzung, in der Variablen $log steht eine Ordnerauslage von "get-childitem" Verzeichnis: C:\Backup\PST Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 16.03.2013 01:01 271360 Discoverysuchpostfach.pst -a--- 16.03.2013 01:01 271360 Administrator.pst Zitieren Link zu diesem Kommentar
Fresh0razoR 10 Geschrieben 16. März 2013 Melden Teilen Geschrieben 16. März 2013 In der Exception steht noch das "Fullname" drin! Prüfe nochmal was du aufgerufen hast. Bitte gib auch mal folgendes ein und zeig mal was raus kommt: Get-Member -Inputobject $log sowie $log | Get-Member Gruß Fresh Zitieren Link zu diesem Kommentar
ablaze 10 Geschrieben 16. März 2013 Autor Melden Teilen Geschrieben 16. März 2013 (bearbeitet) Bezüglich dem "Fullname", dass muss irgendwie durch ne falsche Zwischenablage zustande gekommen sein. Ich hatte es auch mal mit probiert. Sobald ich die Variable "log" im send-mailmessage Command in Gänsefüßchen setze klappt der Versand der E-Mail. Jedoch fehlt ein Teil der Ausgabe. Also mein Script schaut nun folgendermaßen aus. PS C:\> $log=(Get-ChildItem C:\Backup\PST | Sort-Object LastWriteTime) PS C:\> send-mailmessage -from "exchange@contoso.dom" -to "administrator@contoso.dom" -subject "Backup PST-File" -body "$log" -smtpServer exchange.contoso.dom Im Body der E-Mail steht nur "Discoverysuchpostfach.pst Administrator.pst " In der Variable log jedoch PS C:\> $log Verzeichnis: C:\Backup\PST Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 16.03.2013 01:01 271360 Discoverysuchpostfach.pst -a--- 16.03.2013 01:01 271360 Administrator.pst Anbei auch die zwei Ausgaben PS C:\> Get-Member -Inputobject $log TypeName: System.Object[] Name MemberType Definition ---- ---------- ---------- Count AliasProperty Count = Length Address Method System.Object&, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934... Clone Method System.Object Clone() CopyTo Method System.Void CopyTo(array array, int index), System.Void CopyTo(array array, long index) Equals Method bool Equals(System.Object obj) Get Method System.Object Get(int ) GetEnumerator Method System.Collections.IEnumerator GetEnumerator() GetHashCode Method int GetHashCode() GetLength Method int GetLength(int dimension) GetLongLength Method long GetLongLength(int dimension) GetLowerBound Method int GetLowerBound(int dimension) GetType Method type GetType() GetUpperBound Method int GetUpperBound(int dimension) GetValue Method System.Object GetValue(Params int[] indices), System.Object GetValue(int index), System... Initialize Method System.Void Initialize() Set Method System.Void Set(int , System.Object ) SetValue Method System.Void SetValue(System.Object value, int index), System.Void SetValue(System.Objec... ToString Method string ToString() IsFixedSize Property System.Boolean IsFixedSize {get;} IsReadOnly Property System.Boolean IsReadOnly {get;} IsSynchronized Property System.Boolean IsSynchronized {get;} Length Property System.Int32 Length {get;} LongLength Property System.Int64 LongLength {get;} Rank Property System.Int32 Rank {get;} SyncRoot Property System.Object SyncRoot {get;} PS C:\> $log | Get-Member TypeName: System.IO.FileInfo Name MemberType Definition ---- ---------- ---------- Mode CodeProperty System.String Mode{get=Mode;} AppendText Method System.IO.StreamWriter AppendText() CopyTo Method System.IO.FileInfo CopyTo(string destFileName), System.IO.FileInfo CopyTo(s... Create Method System.IO.FileStream Create() CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType) CreateText Method System.IO.StreamWriter CreateText() Decrypt Method System.Void Decrypt() Delete Method System.Void Delete() Encrypt Method System.Void Encrypt() Equals Method bool Equals(System.Object obj) GetAccessControl Method System.Security.AccessControl.FileSecurity GetAccessControl(), System.Secur... GetHashCode Method int GetHashCode() GetLifetimeService Method System.Object GetLifetimeService() GetObjectData Method System.Void GetObjectData(System.Runtime.Serialization.SerializationInfo in... GetType Method type GetType() InitializeLifetimeService Method System.Object InitializeLifetimeService() MoveTo Method System.Void MoveTo(string destFileName) Open Method System.IO.FileStream Open(System.IO.FileMode mode), System.IO.FileStream Op... OpenRead Method System.IO.FileStream OpenRead() OpenText Method System.IO.StreamReader OpenText() OpenWrite Method System.IO.FileStream OpenWrite() Refresh Method System.Void Refresh() Replace Method System.IO.FileInfo Replace(string destinationFileName, string destinationBa... SetAccessControl Method System.Void SetAccessControl(System.Security.AccessControl.FileSecurity fil... ToString Method string ToString() PSChildName NoteProperty System.String PSChildName=Discoverysuchpostfach.pst PSIsContainer NoteProperty System.Boolean PSIsContainer=False PSParentPath NoteProperty System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::\\srv-bak-... PSPath NoteProperty System.String PSPath=Microsoft.PowerShell.Core\FileSystem::\\srv-bak-01\bac... PSProvider NoteProperty System.Management.Automation.ProviderInfo PSProvider=Microsoft.PowerShell.C... Attributes Property System.IO.FileAttributes Attributes {get;set;} CreationTime Property System.DateTime CreationTime {get;set;} CreationTimeUtc Property System.DateTime CreationTimeUtc {get;set;} Directory Property System.IO.DirectoryInfo Directory {get;} DirectoryName Property System.String DirectoryName {get;} Exists Property System.Boolean Exists {get;} Extension Property System.String Extension {get;} FullName Property System.String FullName {get;} IsReadOnly Property System.Boolean IsReadOnly {get;set;} LastAccessTime Property System.DateTime LastAccessTime {get;set;} LastAccessTimeUtc Property System.DateTime LastAccessTimeUtc {get;set;} LastWriteTime Property System.DateTime LastWriteTime {get;set;} LastWriteTimeUtc Property System.DateTime LastWriteTimeUtc {get;set;} Length Property System.Int64 Length {get;} Name Property System.String Name {get;} BaseName ScriptProperty System.Object BaseName {get=if ($this.Extension.Length -gt 0){$this.Name.Re... VersionInfo ScriptProperty System.Object VersionInfo {get=[System.Diagnostics.FileVersionInfo]::GetVer... bearbeitet 16. März 2013 von ablaze Zitieren Link zu diesem Kommentar
Fresh0razoR 10 Geschrieben 16. März 2013 Melden Teilen Geschrieben 16. März 2013 Hi, also kurz zur Erklärung: Oberster Befehl zeigt an, welchen Typ $log hat. Die eckigen Klammern [] zeigen an, dass es ein Array (also eine Liste) mit mehreren Objekten ist. Der untere zeigt alle Typen der im Array vorhandenen Objekte an. Durch $log | out-String wandeln wir FileInfo in String um, weil String in den Body-Parameter von Send-Mailmessage übergeben werden muss. Wenn also in der Mail etwas abgeschnitten ist, kann das verschiedene Ursachen haben: - Out-String schneidet etwas ab - SendMailMessage hat im Body-Parameter eine Beschränkung - weitere Gründe... Probier mal bitte einfach einen sehr sehr langen String per Mail zu senden. Evtl. mal googeln, ob es da ein Limit gibt. Ansonsten einfach mal nach dem Out-String die Variable ausgeben (einfach den Variablen Namen eingeben). Gruß Fresh Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.