1

我正在尝试编写一个小的 powershell 脚本来做一些事情

1) 在我的 Outlook 中解析收件箱项目 2) 搜索 RegEx 字符串 3) 将与 RegEx 字符串匹配的行转储到 CSV

我无法让#3 工作。它肯定会运行大约 10 分钟,但生成的 csv 是空的。

这是我希望它寻找的片段:

账户名称:Jbond

我试着在各个部分打一个“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
4

1 回答 1

0

tl;博士

利用:

$variable | Out-Host # or: Out-Host InputObject $variable

而不是

Write-Host $variable

获得有意义的输出格式。

背景信息和调试提示如下。


尝试以下方法的组合:

使用交互式调试:

  • 使用带有PowerShell 扩展的GUI 编辑器Visual Studio Code在代码中放置断点并以交互方式检查变量值。(在 Windows PowerShell 中,您也可以使用 ISE,但它已过时。)

  • 不太方便的是,使用*-PSBreakpointcmdlet管理在控制台(终端)窗口中运行脚本时遇到的断点。一个简单的替代方法是在脚本中添加Wait-Debugger语句,当命中时,它会无条件中断。


产生有用的调试输出:

一般来说,使用Write-Debug而不是Write-Host,它有两个优点:

  • 您可以随时在代码中留下Write-Debug调用以进行按需调试:

    • 默认情况下它们是无声的,并且仅在选择加入的基础上产生输出,通过预先(临时)设置$DebugPreference = 'Continue'或传递-Debug开关(如果您的脚本/函数是高级的,但请注意,在Windows PowerShell中,这将在任何时候出现提示来电Write-Debug)。
    • Write-Debug但是,您确实会因为在代码中留下调用而付出性能损失。
  • 调试输出清楚地标记为这样,着色并以DEBUG:.

您遇到的问题Write-Host是所有cmdlet 对其参数Write-*执行简单.ToString()的字符串化,这通常会导致无用的表示,例如System.____comobject在您的情况下。

获得与控制台相同的丰富输出格式,请使用以下技术,该技术Out-String用作辅助命令:

$variable | Out-String | Write-Debug

如果您想显式控制视图(列表、表格、宽和自定义),请插入Format-*调用;例如:

$variable | Format-List | Out-String | Write-Debug

通常只有标准Out-*cmdlet 使用 PowerShell 的输出格式化系统。


一个快速而肮脏的替代方法Write-Debug是使用Out-Host而不是Write-Host- 例如,用于快速插入稍后将删除的调试命令;Out-Host本身执行通常的输出格式化,这简化了事情:

# Default for-display formatting
$variable | Out-Host  # or: Out-Host -InputObject $variable

# Explicit formatting
$variable | Format-List | Out-Host

警告Write-Host:除了格式化之外,和之间的另一个重要区别Out-Host是,在 PSv5+ 中,仅通过信息流(流号)写入主机,而Write-Host真正直接写入主机,这意味着无法通过重定向捕获其输出,例如或- 见。6Out-Host6>*>about_Redirection

于 2019-08-02T14:15:00.327 回答