【问题标题】:Trying to test code, keep getting "System.____comobject" instead of variable value尝试测试代码,不断获取“System.__comobject”而不是变量值
【发布时间】:2021-11-05 04:31:37
【问题描述】:

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

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

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

这是我希望它查找的内容的 sn-p:

账户名: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

【问题讨论】:

    标签: powershell debugging write-host


    【解决方案1】:

    tl;dr

    用途:

    $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 时遇到的问题是所有Write-* cmdlet 对其参数执行简单的.ToString() 字符串化,这通常会导致无用的表示,例如您的System.____comobject案例。

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

    $variable | Out-String | Write-Debug
    

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

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

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


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

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

    警告:除了格式化之外,Write-HostOut-Host 之间的另一个重要区别是,在 PSv5+ 中,只有 Write-Host 通过信息流写入主机 (流号6),而Out-Host真正直接写入主机,这意味着无法通过6&gt;*&gt;等重定向捕获其输出 - 请参阅about_Redirection .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多