尝试测试代码,请不断获取“ System .____ comobject”而不是变量值

时间:2019-08-02 13:36:31

标签: powershell debugging write-host

我正在尝试编写一个小型的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

1 个答案:

答案 0 :(得分:0)

tl;博士

使用:

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

而不是

Write-Host $variable

获取有意义的输出格式。

下面的背景信息和调试提示。


尝试以下方法的组合:

使用交互式调试:

  • 使用GUI编辑器Visual Studio CodePowerShell extension在代码中放置断点并交互检查变量值。 (在Windows PowerShell中,您也可以使用ISE,但是它已过时。)

  • 请方便地使用*-PSBreakpoint cmdlets来管理在控制台(终端)窗口中运行脚本时遇到的断点。一种简单的替代方法是向脚本中添加Wait-Debugger条语句,当它们被命中时,它们将无条件中断。


产生有用的调试输出:

通常,使用Write-Debug而不是Write-Host,它有两个优点:

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

    • 默认情况下,它们是静音的,并且仅通过(临时)预先设置$DebugPreference = 'Continue'或通过-Debug开关(如果您使用脚本/函数是高级脚本/函数,不过请注意,在 Windows PowerShell 中,每当击中Write-Debug调用时,它都会显示提示
    • 但是,您确实要因在代码中留下Write-Debug个调用而导致性能损失。
  • 调试输出已明确标记为此类,并带有颜色和前缀DEBUG:

您在Write-Host上遇到的问题是, ll Write-* cmdlet对其参数进行简单的.ToString()字符串化,这通常会导致无用的表示方式,例如如System.____comobject一样。

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

$variable | Out-String | Write-Debug

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

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

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


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