debugging 尝试测试代码,继续获取“System.____comobject”而不是变量值

kadbb459  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(113)

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

wwtsj6pe1#

    • TL;医生**:

use:

$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作为helper命令:

$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-HostOut-Host之间的另一个重要区别是,在PSv5+中,只有Write-Host * 通过信息流 * 写入主机(流编号6),而**Out-Host实际上直接写入主机,这意味着其输出不能用诸如6>*>的重定向来捕获**-参见about_Redirection
bgibtngc

bgibtngc2#

我发现捕获Out-Host$Host.UI.Write()方法的唯一方法是捕获控制台缓冲区,例如:

$Host.UI.Write('aaa')  # or Out-Host 'aaa'
$rect = [System.Management.Automation.Host.Rectangle]::new(0,0,3,1)
$buff = $Host.UI.RawUI.GetBufferContents($rect)
(1..3 | foreach {$buff[0,$_].Character}) -join ''
# The constructor is: [Rectangle]::new(Left,Top,Right,Bottom)

相关问题