调用函数后,Powershell发送电子邮件消息附件与源文件不同

时间:2018-08-17 14:32:03

标签: powershell

#robocopy backup scripts on each server copy their log files to one of two locations: \\backup_server\backup\logs\success if the backup is 
#successful, or \\backup_server\backup\logs\fail if the backup fails. This script looks at those two locations to check for failures or 
#missing log files, then reports them to the helpdesk.

Function test-servers {
param ($serverlist)
    foreach($server in $serverlist){
        if(test-path \\backup_server\backup\logs\success\$server){
            add-content -path \\backup_server\backup\logs\errorlog.txt -value $server -force
            add-content -path \\backup_server\backup\logs\errorlog.txt -value $success -force
        }
        elseif(test-path \\backup_server\backup\logs\fail\$server){
            add-content -path \\backup_server\backup\logs\errorlog.txt -value $server -force
            add-content -path \\backup_server\backup\logs\errorlog.txt -value $failure -force
        }
        else{
            add-content -path \\backup_server\backup\logs\errorlog.txt -value $server -force
            add-content -path \\backup_server\backup\logs\errorlog.txt -value $missing -force
        }
        } 

}

$date = get-date

$loglocation = "The log file archive can be found in \\backup_server\backup\logs\archive\"

$filename = (get-date).tostring("MM-dd-yyyy")

$success = "Error log found, backup was successful."

$failure = "Error log found, backup was completed with errors."

$missing = "Error log not found, check server."

[System.Collections.ArrayList]$Serverlist = Get-Content \\backup_server\backup\logs\serverloglist.txt

remove-item \\backup_server\backup\logs\errorlog.txt

new-item -path \\backup_server\backup\logs\ -name "errorlog.txt" -itemtype "file"

add-content -path \\backup_server\backup\logs\errorlog.txt -value $date -force

test-servers -serverlist $serverlist

add-content -path \\backup_server\backup\logs\errorlog.txt -value $loglocation -force

#email out log file and clean up file system
send-mailmessage -from "no-reply@example.com" -to "helpdesk@example.com" -smtpserver "mail.example.com" -port 25 -subject "Nightly Robocopy Log Files" -Attachments "\\backup_server\backup\logs\errorlog.txt" -body "Nightly server backup completed, see attachment for details"

exit

背景:我在一家小型公司的IT部门工作,我们正在管理大约2台通用文件服务器,这些服务器每天晚上执行简单的robocopy批量备份。那里没有问题。为了限制向服务台发送的“ Server_1已完成每晚备份”票证的数量,我编写了一个快捷脚本,用于确认每晚备份的完成。我们每晚备份中的所有日志文件都将复制到“成功”或“失败”文件夹,此脚本检查每个位置并记下哪个文件位于哪个文件夹中并通过电子邮件发送单张票证。然后,将失败的备份日志复制到当前日期的存档文件夹中,并复制主要日志文件的副本。该系统运行出色,附件日志文件包含有关哪个服务器发生故障或成功的所有正确信息。

所以这是我的难题。附加到发送邮件消息电子邮件的日志文件与源文件不是同一日志文件! \\ backup_server \ backup \ logs \目录中剩余的日志文件的第1行具有当前日期和时间(尽管日志文件通过电子邮件发送后有几秒钟),与send-mailmessage发送的副本一样,但是每台服务器的夜间日志都丢失了(参见图片)。因此,沿着这条线的某个地方,将创建2个日志文件,它们具有完全相同的文件名和文件路径,首先是正确的日志,然后是几秒钟的错误日志。我看到这种情况的唯一方法是我的功能出现问题。但是它只被调用了一次,所以我看不到它如何写两个不同的文件。该脚本由服务器上的任务计划程序调用,并且根据任务历史记录每天仅运行一次,而事实是,我们每天仅从该脚本收到一封电子邮件。

为简洁起见,我删除了脚本的末尾,其中复制并清理了旧日志,其中包含几行copy-and remove-item。我已经遍历了脚本中每个cmdlet的手册页,并深入研究了每一篇涉及send-mailmessage和在SE上使用功能的帖子。

仅调用一次new-item cmdlet来创建单个文件,而是创建该文件的两个单独实例的脚本又如何呢?我的功能是否有问题,或者发送邮件消息对其附件有未知的影响?

因为这是我在SE网络上的第一篇文章,所以我了解它可能不符合所有规则。我已竭尽所能浏览常见问题解答,并继续发布有关该主题的文章。如果可以通过任何方式改善该问题,欢迎您提出建议。

Log File Example,左侧是我们作为电子邮件附件收到的文件,右侧是左侧的\\ backup_server \ backup \ logs \ errorlog.txt

编辑:我更新了脚本,在开始时删除了函数,只是将foreach循环放在正在调用函数的位置,以确认脚本中函数调用不是问题。

1 个答案:

答案 0 :(得分:0)

我调整了一下脚本,任务按计划在早上运行,问题仍然存在。但是,在手动运行脚本进行一些测试之后,归档文件中的日志和电子邮件日志均相同!因此看来错误不是脚本本身引起的,而是我在任务计划程序中调用它的方式引起的。由于安排任务运行Powershell脚本是一个完全不同的问题,因此我认为这个问题已解决。如果有3个人对解决方案感兴趣,我将把问题搁置一周,然后删除。