Не зафиксировать ошибку с расшифровками

Я намеренно написал ошибку в следующем:

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]
}

person Nate    schedule 23.12.2015    source источник
comment
Что вы ожидаете увидеть, чего не видите?   -  person dfundako    schedule 24.12.2015
comment
@dfundako Я ожидал увидеть что-то вроде сообщения об ошибке, говорящего мне, что он не может импортировать csv, потому что файл не существует.   -  person Nate    schedule 24.12.2015
comment
В каком состоянии $ErrorActionPreference?   -  person Matt    schedule 24.12.2015
comment
Возможный дубликат start-Transcript не записывает все выходные данные в файл журнала. .?   -  person Eris    schedule 24.12.2015
comment
@Matt Он настроен на продолжение   -  person Nate    schedule 24.12.2015
comment
@Eris Я не думаю, что это дубликат, принятое решение - это ссылка на страницу, которая не найдена, и вывод в вопросе больше, чем я получаю.   -  person Nate    schedule 24.12.2015
comment
Собираюсь проверить, но мне интересно, это из-за того, что в вашем блоке try нет улова. Этот код непригоден для использования, поскольку в нем нет улова... предположительно, он у вас есть, иначе у вас будет синтаксическая ошибка, так что ошибка может быть именно в этом.   -  person Matt    schedule 24.12.2015
comment
Да, у меня есть загвоздка, просто для этой части это было не важно.   -  person Nate    schedule 24.12.2015
comment
Вместо этого я просто описал каждый шаг следующим образом: Try{$TermRep = Import-Csv $Path\TestFileTerm.csv -verbose -EA stop} Catch { Write "$DateTime Error: Import-Csv: $_" >>$Errorlog} пока кто-нибудь не придумает лучший способ сделать это.   -  person Nate    schedule 24.12.2015
comment
Это если вы хотите, чтобы мы воспроизвели вашу студентку   -  person Matt    schedule 24.12.2015
comment
Catch просто говорит Catch [system.exception]{ и отправляет электронное письмо с сообщением об ошибке.   -  person Nate    schedule 24.12.2015
comment
Ваша стенограмма делает то, что вы сказали. Я также чувствую, что это начинает становиться проблемой XY. В конце концов, вы просто пытаетесь отправить сообщение об ошибке по электронной почте? Вы не используете содержимое файла стенограммы в своем коде, поэтому я не вижу смысла.   -  person Matt    schedule 24.12.2015
comment
Я не хочу отправлять ошибку по электронной почте. Я хочу создать журнал для каждого запуска скрипта (ежедневно), чтобы сидеть в каталоге скрипта. Я ожидал, что если я start-transcript, а затем попробую поддельный import-csv, я получу сообщение об ошибке, сообщающее, что его нельзя открыть/нет такого файла.   -  person Nate    schedule 24.12.2015
comment
Ладно. Если это так, то мой ответ охватывает это.   -  person Matt    schedule 24.12.2015
comment
@Мэтт, спасибо, что остался со мной. Я обновил свои две попытки (одна из них — ваше предложение), чтобы объяснить ошибку, которую я получаю, когда пытаюсь это сделать.   -  person Nate    schedule 24.12.2015
comment
Почему бы не использовать Start-Process? stackoverflow .com/questions/11531068/   -  person Eris    schedule 24.12.2015
comment
Измените свой тест на if($job){} и обнулите его в начале файла $job = $null. Ваша проблема с расшифровкой решена уже реально. Теперь мы возвращаемся к вам прошлый вопрос о $job   -  person Matt    schedule 24.12.2015


Ответы (2)


Важная часть, которую вы пропустили, вполне возможно, содержит ваш ответ. У вас есть блок try, перехватывающий ошибки. Если вы не выполняете вывод внутри блока catch, вы увидите вывод, который вы показываете.

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

Stop-Transcript

Вышеупомянутое не будет показывать ошибки Transcript или нет. Если бы вы затем вывели ошибку в блоке catch (аналогично тому, что вы делали в комментариях), вы бы увидели ошибку. Если вы сделали что-то подобное, вы не показываете этого.

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

Stop-Transcript

Имейте в виду, что это покажет только последнюю ошибку. Не уверен, как вы хотите воспроизвести это для нескольких ошибок. Попытка перехвата предназначена для захвата одного, который, как вы ожидаете, потерпит неудачу, а не нескольких.


Мой $ErrorActionPreference настроен на Продолжить, чего бы это ни стоило.

PS C:\temp> $ErrorActionPreference
Continue
person Matt    schedule 24.12.2015
comment
Я добавил весь свой код без $msg.body. Если я try-catch определю какую-либо конкретную ошибку и выведу ее в файл, сообщение об ошибке не будет отправлено по электронной почте. Он отправляет электронное письмо, в котором говорится, что обрабатывать нечего — Else версия первого электронного письма, а не второго письма со сценарием. Я думаю, это имеет смысл, поскольку он заменяет ошибку? Вот почему я изначально просто искал способ написать все, что он делает для этого небольшого раздела, независимо от того, будет ли это неудачей или успехом. - person Nate; 24.12.2015

Я также видел это при вызове внешних приложений (например, dotnet.exe), когда исключения .NET отображались в консоли, но не регистрировались в файле расшифровки.

Исправление, которое я нашел, заключалось в перенаправлении потока ошибок при вызове внешней команды, например:

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

При перенаправлении ошибка от dotnet.exe включается в расшифровку — без перенаправления ошибка «asdf — неизвестная команда» будет отображаться только в консоли.

person tholesen    schedule 13.05.2020