我正在尝试编写一个小型的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
答案 0 :(得分:0)
tl;博士:
使用:
$variable | Out-Host # or: Out-Host InputObject $variable
而不是
Write-Host $variable
获取有意义的输出格式。
下面的背景信息和调试提示。
尝试以下方法的组合:
使用交互式调试:
使用GUI编辑器Visual Studio Code和PowerShell 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