我正在尝试编写一个小的powershell脚本,它可以执行一些操作
1)解析Outlook中的收件箱项目2)搜索RegEx字符串3)将与RegEx字符串匹配的行转储到CSV中
我无法让#3工作。它确实运行了大约10分钟,但得到的csv是空的。
下面是我希望它查找的内容的一个片段:
账户名称:杰邦德
我试着在不同的地方打一个"Write-Host $variable"来看看发生了什么,但是我得到的只是"System.____comobject",我在网上找不到一个解决方案来把它转换成纯文本。
Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
$RE = [RegEx]'(?sm)Account Name\s*:\s*(?<AccName>.*?)$.*'
$Data = ForEach ($item in $inbox.items){
$resultText = $item.item.Value
Write-Host $resultText
if ($item.from -like "email@email.org"){
if ($item.body -match $RE){
[PSCustomObject]@{
AccName = $Matches.AccName
}
}
}
}
$Data
$Data | Export-CSv '.\data.csv' -NoTypeInformation
2条答案
按热度按时间wwtsj6pe1#
use:
而不是
以获得有意义的输出格式。
背景信息和调试提示如下。
尝试以下方法的组合:
*-PSBreakpoint
cmdlets来管理在控制台(终端)窗口中运行脚本时遇到的断点不太方便,一个简单的替代方法是在脚本中添加Wait-Debugger
语句,当遇到断点时,它将无条件中断。一般来说,使用
Write-Debug
而不是Write-Host
有两个优点:Write-Debug
调用,以便随时进行按需调试:$DebugPreference = 'Continue'
或传递-Debug
开关(如果您的脚本/函数是高级脚本/函数,但请注意,在 * Windows PowerShell * 中,每当Write-Debug
调用被命中时,它将显示 * 提示符 *)。Write-Debug
调用,则会导致性能损失。DEBUG:
。您在使用
Write-Host
时遇到的问题是,llWrite-*
cmdlet对其参数执行简单的.ToString()
字符串化,这通常会导致无用的表示,例如您所使用的System.____comobject
。要获得与控制台中相同的丰富输出格式,请使用以下技术,该技术使用
Out-String
作为helper命令:如果你想显式地控制视图(列表、表格、宽视图、自定义视图),插入一个
Format-*
调用;例如:通常只有标准的
Out-*
cmdlet使用PowerShell的输出格式化系统。Write-Debug
的一个快捷的替代方法是使用Out-Host
而不是Write-Host
-例如,用于快速插入稍后将删除的调试命令;Out-Host
本身执行通常的输出格式化**,这简化了问题:Write-Host
和Out-Host
之间的另一个重要区别是,在PSv5+中,只有Write-Host
* 通过信息流 * 写入主机(流编号6
),而**Out-Host
实际上直接写入主机,这意味着其输出不能用诸如6>
或*>
的重定向来捕获**-参见about_Redirection
。bgibtngc2#
我发现捕获
Out-Host
或$Host.UI.Write()
方法的唯一方法是捕获控制台缓冲区,例如: