我故意在下面写错:
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
,这意味着找不到用户。
此外,马特的建议,当试图将错误打印到日志文件,但导致它总是发送错误电子邮件(第二封电子邮件),即使没有错误:
try{
Start-Transcript -Path c:\temp\text.txt
$TermRep = Import-Csv $Path\TestFileTerm2.csv
} catch {
$Error[0]
}
答案 0 :(得分:0)
你遗漏的重要部分很可能包含你的答案。你有try块捕获错误。如果您没有在catch块内输出,您将看到您显示的输出。
try{
Start-Transcript -Path c:\temp\text.txt
$TermRep = Import-Csv $Path\TestFileTerm2.csv
} catch {
}
Stop-Transcript
以上不会显示Transcript或No的错误。如果您要在catch块中输出错误(类似于您在注释中所做的那样),那么您将看到错误。如果你做了类似的事情,你就没有表现出来。
try{
Start-Transcript -Path c:\temp\text.txt
$TermRep = Import-Csv $Path\TestFileTerm2.csv
} catch {
$Error[0]
}
Stop-Transcript
请记住,这只会显示上一个错误。不确定如何为多个错误播放此内容。 try catch意味着捕获一个你期望失败而不是几个。
我的$ErrorActionPreference
设置为继续,因为它的价值。
PS C:\temp> $ErrorActionPreference
Continue
答案 1 :(得分:0)
我在调用外部应用程序(例如dotnet.exe)时也看到了这一点,.NET异常显示在控制台中,但未记录在脚本文件中。
我发现的解决方法是在调用外部命令时重定向错误流,如下所示:
Start-Transcript log.txt
dotnet.exe asdf 2>&1
Stop-Transcript
通过重定向,来自dotnet.exe的错误包含在脚本中-不进行重定向,“ asdf是未知命令”错误只会在控制台中显示。