重定向Powershell foreach循环输出到txt文件



我目前正在使用一个简单的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.txtAdd-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

相关内容

  • 没有找到相关文章

最新更新