我目前正在使用一个简单的Powershell脚本,它接受电子邮件地址的txt列表,并在Exchange Online中将它们转换为共享邮箱,这是正常工作的。我通过列出已经共享的邮箱来强制发出警告,通过列出不存在的邮箱来强制发出错误。我试图将输出重定向到一个txt文件,这样我就可以保存所有警告和错误的列表。我的脚本一直生成一个空白的txt文件。
$Mailboxes = Get-Content -Path .Convert.txt
$logs = foreach ($Mailbox in $Mailboxes) {
Set-Mailbox -Identity $Mailbox -Type Shared
}
$logs | Out-File -FilePath logs.txt -Append
而不是Out-File,我也尝试过使用$logs *>> logs.txt
和Add-Content
。我还尝试从脚本中删除输出并在控制台中运行.convert.ps1 *> logs.txt
。最后,我尝试将Foreach循环更改为Foreach- object循环,也失败了,但我可能没有正确使用该循环。
Get-Content -Path .Convert.txt | & {
process {
Set-Mailbox -Identity $_ -Type Shared -ErrorAction Continue -WarningAction Continue
}
} *>&1 | ForEach-Object {
[pscustomobject]@{
Type = $_.GetType().Name
Message = $_.ToString()
}
} | Out-File -Filepath logs.txt -Append
使用这个脚本,我仍然在控制台中看到警告,并且它们没有填充我的logs.txt文件,但是现在正确地记录了错误。
最好在这里使用try/catch以确保以相同的方式捕获终止和非终止错误
$Mailboxes = Get-Content -Path .Convert.txt
$logs = foreach ($Mailbox in $Mailboxes) {
try {
Set-Mailbox -Identity $Mailbox -Type Shared -ErrorAction Stop
}
catch {
# Inside catch $_ will be the error record object. Use .ToString() method to get the error message
"ERROR: " + $_.ToString()
}
}
# logs will contain any standard output as well as the error message strings
$logs | Out-File -FilePath logs.txt -Append
如果您只想捕获日志中的错误,或者希望为错误提供单独的日志,您可以直接从catch块将消息写入日志
$Mailboxes = Get-Content -Path .Convert.txt
$logs = foreach ($Mailbox in $Mailboxes) {
try {
Set-Mailbox -Identity $Mailbox -Type Shared -ErrorAction Stop
}
catch {
# Inside catch $_ will be the error record object. Use .ToString() method to get the error message
# Send error message to log using out-file or set-content
"ERROR: " + $_.ToString() | Out-File -FilePath errors.txt -Append
}
}
# logs will contain only standard output
$logs
:
- 所有你想知道的异常
- about_Try_Catch_Finally 另一个选项是使用-ErrorVariable Parameter