没有捕捉到成绩单的错误。

问题描述 投票:0回答:2

我故意在下面写了一个错误。

Try
{
Start-Transcript -Path $Errorlog

#$TermRep = Import-Csv $TermReport
#$Donna = Import-Csv $HRReport

$TermRep = Import-Csv $Path\TestFileTerm2.csv
$Donna = Import-Csv $Path\TestFileDonna.csv

#Job to match users between CSVs
$Job = ForEach($i in $TermRep){
$TID = $($i.'Person ID')
ForEach($u in $Donna){
$DID = $($u.UserID)
If($TID -eq $DID){
"Move-ADObject -Identity $TID -TargetPath 'PATH' `r`n"
            }
    }
}
Stop-Transcript
#Send email of results or statement of no results
$smtpServer = "blah.net"
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.From = $EmailFrom
$msg.To.Add($EmailTo)
#$msg.To.Add($EmailTo1)
#$msg.To.Add($EmailTo2)
$msg.Priority = "High"
If($Job -notlike ""){
$msg.Subject = "Open a ticket for Terminated Exception Users for Lit-hold changes."
$msg.Body = "Fix these users"
}
Else{
$msg.Subject = "Terminated Exception Users Script was run for Lit-holds"
$msg.Body = "No users need fixing."
}
$smtp.Send($msg)
}
Catch [system.exception]
{
#If the script errors (e.g. it cannot find one of the lists) send the following email.
$smtpServer = "blah.net"
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.From = $EmailFrom
$msg.To.Add($EmailTo)
#$msg.To.Add($EmailTo1)
#$msg.To.Add($EmailTo2)
$msg.Priority = "High"
$msg.Subject = "Open a ticket for Terminated Exception Users - Script Failure"
$msg.Body = "Script error."
$smtp.Send($msg)
}

具体说来 $TermRep = Import-Csv $Path\TestFileTerm2.csv 不存在。 然而,我的成绩单却显示为以下内容。

**********************
Windows PowerShell Transcript Start
Start time: 20151223165030
Username  : DOMAIN\Username 
Machine   : WKSTNName (Microsoft Windows NT 6.1.7601 Service Pack 1) 
**********************
Transcript started, output file is D:\DIR\LogFile2015-12-23.log
**********************
Windows PowerShell Transcript End
End time: 20151223165030
**********************

谁能告诉我,我遗漏了什么? 我是否不明白 Start-Transcript 工作?

如果有人能帮我,我想做的就是把错误日志存档。

更新的尝试

我试着改成。

Try{$TermRep = Import-Csv $Path\TestFileTerm.csv -verbose -EA stop}
Catch { Write "$DateTime Error: Import-Csv: $_" >>$Errorlog}

如果我把每个命令都设置为 try-catch 它将错误打印到日志文件,但它不再运行错误的电子邮件功能(第二封电子邮件),即使我试图导入一个不存在的CSV。 相反,它运行了 Else 在第一封邮件中,这意味着没有找到用户。

此外,Matt的建议,当尝试打印错误到日志文件,但导致它总是发送错误邮件(第二封邮件),即使没有错误。

try{
    Start-Transcript -Path c:\temp\text.txt
    $TermRep = Import-Csv $Path\TestFileTerm2.csv
} catch {
    $Error[0]
}
powershell powershell-2.0 error-log
2个回答
0
投票

你省略的重要部分很可能包含了你的答案。你有尝试块捕捉错误。如果你没有在捕获块中输出,你会看到你所显示的输出。

try{
    Start-Transcript -Path c:\temp\text.txt
    $TermRep = Import-Csv $Path\TestFileTerm2.csv
} catch {
}

Stop-Transcript

以上不会显示错误,Transcript或no。如果你在捕获块中输出错误(类似于你在注释中所做的),那么你会看到错误。如果你做了类似的事情,你就不会显示它。

try{
    Start-Transcript -Path c:\temp\text.txt
    $TermRep = Import-Csv $Path\TestFileTerm2.csv
} catch {
    $Error[0]
}

Stop-Transcript

请记住,这将只显示最后一个错误。不知道你想怎么玩这个多个错误。尝试捕捉是为了捕捉一个你期望失败的错误,而不是几个。


我的 $ErrorActionPreference 被设置为Continue(继续),这是值得的。

PS C:\temp> $ErrorActionPreference
Continue

0
投票

我在调用外部应用程序(如dotnet.exe)时也看到过这种情况,.NET异常在控制台中显示,但没有记录在成绩单文件中。

我发现的修复方法是在调用外部命令时重定向错误流,就像下面这样。

Start-Transcript log.txt
dotnet.exe asdf 2>&1
Stop-Transcript

有了重定向,dotnet.exe的错误就会被包含在成绩单中--没有重定向,则是" "。asdf是一个未知的命令"错误只会在控制台中显示。

© www.soinside.com 2019 - 2024. All rights reserved.