2012-10-31 3 views
6

Ich arbeite an einem PowerShell-Skript für den Helpdesk, das beim Migrieren von Benutzerdomänenordnern von einem Server auf ein NAS-Gerät verwendet werden soll. Der Helpdesk-Benutzer gibt die Benutzernamen in die Datei "userhomelist.txt" ein.E-Mail mit mehreren Anhängen

Mein Problem ist, dass ich nicht das Skript zum Anhängen aller Protokolldateien erhalten kann. Nur die letzte Protokolldatei ist an die E-Mail angehängt. Ich denke, ich muss eine Zeichenfolge für mehrere Anhänge verwenden, aber ich denke, dass es einen anderen Weg gibt.

#----- STEP #1 retrieve contents of input file ---# 
$INPUTFILEPATH = 'c:\temp\userhomelist.txt' 

#----- read input file contents ----# 
$inputdata = Get-Content $INPUTFILEPATH 

#----- Top section of email body ----# 
$msgreport = new-object Net.Mail.MailMessage 
$msgreport = "To view log files, go to directory where this PowerShell Script was run from. `r" 
$msgreport = $msgreport + "`r`n" 

#read in each username 
foreach ($username in $inputdata) 
{ 

#----- STEP #2 robocopy files from \\server to \\nasdevice location ----# 
Start-Process -FilePath robocopy -ArgumentList "\\server\userhomes\$username \\nasdevice\userhomes\$username /mir /sec /r:1 /w:1 /tee /NP /Z /log+:userhome-move-$username.log" 
$file = "c:\temp\userhome\userhome-move-$username.log" 
$msgreport = $msgreport + "$username robocopy has been completed." + "`n" 

##----- STEP #3 change file and directory ownership to user ----# 
Start-Process -FilePath subinacl -ArgumentList "/subdirectories \\nasdevice\userhomes\$username\*.* /setowner=$username" 
$msgreport = $msgreport + "$username file and directory ownership changes have been completed." + "`n" 
$msgreport = $msgreport + "`r`n" 
} 

#----- Email Results ----# 
$SmtpClient = new-object system.net.mail.smtpClient 
$MailMessage = New-Object system.net.mail.mailmessage 
$SmtpServer = "emailserver.business.com" 
$SmtpClient.host = $SmtpServer 
$MailMessage.From = "[email protected]" 
$MailMessage.To.add("[email protected]") 
$MailMessage.Subject = "User migrations" 
$MailMessage.IsBodyHtml = 0 
$MailMessage.Body = $msgreport 
$MailMessage.Attachments.Add($file) 
$SmtpClient.Send($MailMessage) 
+0

sind Sie in Powershell Version 1? –

+0

v2 auf Win7 64-Bit-Desktop. – rainhailrob

Antwort

10

Ich schlage vor, send-mailmessage Cmdlets zu verwenden, wenn Sie in Powershell v2 oder v3 sind. Es hat einen -attachments Parameter, der Array von Zeichenfolge (string[]) akzeptiert.

Sie können Ihre Variable $file als $file = @() vor der foreach Benutzerschleife ändern. Innerhalb der foreach tun:

$file += "c:\temp\userhome\userhome-move-$username.log" 

Änderung $msgreport als [string] Typ

und dann mit dem send-mailmessage Cmdlets tun:

send-mailmessage -SmtpServer "emailserver.business.com" ` 
-From "[email protected]" -to "[email protected]" ` 
-Subject "User migrations" -BodyAsHtml -Body $msgreport -Attachments $file 
+0

Sorry, aber wie ändere ich $ msgreport als [string] type? – rainhailrob

+0

@rainhailrob einfach "$ msgreport = new-object Net.Mail.MailMessage" weglassen und '$ msgreport + = ..text hier ...' nach dem ersten '$ msgreport =" verwenden, um Log-Dateien anzuzeigen, .... '. Sie können und einige' n'r am Ende der Zeilen für Carriage Return-Formatierung ... –

+0

Also würde diese E-Mail jedes Protokoll separat oder eine E-Mail mit allen Protokollen? – rainhailrob