Powershell 尝试测试代码时,请不断获取;系统.“共同对象”;而不是变量值

Powershell 尝试测试代码时,请不断获取;系统.“共同对象”;而不是变量值,powershell,debugging,write-host,Powershell,Debugging,Write Host,我正在尝试编写一个小的powershell脚本,它可以做一些事情 1) 解析我的outlook中的收件箱项目 2) 搜索正则表达式字符串 3) 将与正则表达式字符串匹配的行转储到CSV中 我无法工作。它肯定会运行大约10分钟,但生成的csv是空的 下面是我希望它查找的内容的一个片段: 帐户名称:Jbond 我试着在不同的部分打一个“Write Host$variable”来看看发生了什么,但我得到的只是“System.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我正在尝试编写一个小的powershell脚本,它可以做一些事情

1) 解析我的outlook中的收件箱项目 2) 搜索正则表达式字符串 3) 将与正则表达式字符串匹配的行转储到CSV中

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

下面是我希望它查找的内容的一个片段:

帐户名称:Jbond

我试着在不同的部分打一个“Write Host$variable”来看看发生了什么,但我得到的只是“System.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我找不到一个在线的解决方案,只是把它转换成纯文本

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
添加类型-程序集“Microsoft.Office.Interop.Outlook”
$Outlook=新对象-ComObject Outlook.Application
$namespace=$Outlook.GetNameSpace(“MAPI”)
$inbox=$namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
$RE=[RegEx]'(?sm)帐户名\s*:\s*(?*?)$*'
$Data=ForEach($inbox.items中的项目){
$resultText=$item.item.Value
写入主机$resultText
如果($item.from-like)email@email.org"){
如果($item.body-匹配$RE){
[PSCustomObject]@{
AccName=$Matches.AccName
}
}
}
}
$Data
$Data |导出CSv'.\Data.CSv'-NoTypeInformation

tl;博士

使用:

而不是

Write-Host $variable
获取有意义的输出格式

背景信息和调试提示如下


尝试以下方法的组合:

使用交互式调试:

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

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


生成有用的调试输出:

通常,使用而不是
写主机
,这有两个优点:

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

    • 默认情况下,它们是静默的,仅在选择加入的基础上通过(临时)预先设置
      $DebugPreference='Continue'
      或传递
      -Debug
      开关生成输出(如果您的脚本/函数是高级脚本/函数,请注意,在Windows PowerShell中,每当调用
      Write Debug
      时,将显示提示)
    • 但是,如果在代码中保留
      Write Debug
      调用,则需要支付性能罚款
  • 调试输出被清楚地标记为这样,彩色,并以
    Debug:
    作为前缀

使用
Write Host
时遇到的问题是ll
Write-*
cmdlet执行简单的
.ToString()
参数字符串化,这通常会导致无用的表示,例如在您的情况下的
系统

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

$variable | Out-String | Write-Debug
如果要显式控制视图(列表与表格、宽视图与自定义视图),请插入
格式-*
调用;例如:

$variable | Format-List | Out-String | Write-Debug
通常只有标准的
Out-*
cmdlet使用PowerShell的输出格式系统


一种快速而肮脏的
写调试
替代方法是使用
而不是
写主机
——例如,用于快速插入稍后删除的调试命令;
Out主机
本身执行通常的输出格式设置,这简化了问题:

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

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

注意事项:除了格式化之外,
写入主机
输出主机
之间的另一个重要区别是,在PSv5+中,仅
写入主机
通过信息流写入主机(流编号
6
),而
确实直接写入主机,这意味着无法通过重定向(如
6>
*>
)捕获其输出。请参阅。

tl;dr

使用:

而不是

Write-Host $variable
获取有意义的输出格式

背景信息和调试提示如下


尝试以下方法的组合:

使用交互式调试:

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

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


生成有用的调试输出:

通常,使用而不是
写主机
,这有两个优点:

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

    • 默认情况下,它们是静默的,仅在选择加入的基础上通过(临时)预先设置
      $DebugPreference='Continue'
      或传递
      -Debug
      开关生成输出(如果您的脚本/函数是高级脚本/函数,请注意,在Windows PowerShell中,每当调用
      Write Debug
      时,将显示提示)
    • 但是,如果在代码中保留
      Write Debug
      调用,则需要支付性能罚款