Powershell 尝试测试代码时,请不断获取;系统.“共同对象”;而不是变量值
我正在尝试编写一个小的powershell脚本,它可以做一些事情 1) 解析我的outlook中的收件箱项目 2) 搜索正则表达式字符串 3) 将与正则表达式字符串匹配的行转储到CSV中 我无法工作。它肯定会运行大约10分钟,但生成的csv是空的 下面是我希望它查找的内容的一个片段: 帐户名称:Jbond 我试着在不同的部分打一个“Write Host$variable”来看看发生了什么,但我得到的只是“System.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我找不到一个在线的解决方案,只是把它转换成纯文本Powershell 尝试测试代码时,请不断获取;系统.“共同对象”;而不是变量值,powershell,debugging,write-host,Powershell,Debugging,Write Host,我正在尝试编写一个小的powershell脚本,它可以做一些事情 1) 解析我的outlook中的收件箱项目 2) 搜索正则表达式字符串 3) 将与正则表达式字符串匹配的行转储到CSV中 我无法工作。它肯定会运行大约10分钟,但生成的csv是空的 下面是我希望它查找的内容的一个片段: 帐户名称:Jbond 我试着在不同的部分打一个“Write Host$variable”来看看发生了什么,但我得到的只是“System.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
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'
开关生成输出(如果您的脚本/函数是高级脚本/函数,请注意,在Windows PowerShell中,每当调用-Debug
时,将显示提示)Write Debug
- 但是,如果在代码中保留
调用,则需要支付性能罚款Write Debug
- 默认情况下,它们是静默的,仅在选择加入的基础上通过(临时)预先设置
- 调试输出被清楚地标记为这样,彩色,并以
作为前缀Debug:
Write Host
时遇到的问题是llWrite-*
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
调用,则需要支付性能罚款