我有一些Powershell,可以处理Outlook文件夹中的邮件。大多数电子邮件的页脚都以文本"------"
开头。我想在此字符串之后转储所有文本。
我已向Select-Object
添加了一个表达式,如下所示:
$cleanser = {($_.Body).Substring(0, ($_.Body).IndexOf("------"))}
$someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser}
这在IndexOf()
返回匹配项时起作用...但是在没有匹配项时,我的Select-Object
输出null
。
当IndexOf
返回null
时,如何更新表达式以返回原始字符串?
答案 0 :(得分:3)
我同意@ mklement0和@PetSerAl正则表达式提供最佳答案。好极了!正则表达式可以解救!
编辑: 修正我的原始帖子。
遵循@Adam在表达式中使用脚本块的想法,您只需要在脚本块中添加更多逻辑以首先检查索引,然后再使用它:
$cleanser = {
$index = ($_.Body).IndexOf("------");
if($index -eq -1){
$index = $_.Body.Length
};
($_.Body).Substring(0, $index)
}
$someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser}
答案 1 :(得分:3)
PetSerAl就像以前无数次一样,已经在对该问题的评论中提供了关键的指针:
使用PowerShell的-replace
operator,该工具实现基于正则表达式的字符串替换,如果正则表达式不匹配,则按原样返回输入字符串 :
# The script block to use in a calculated property with Select-Object later.
$cleanser = { $_.Body -replace '(?s)------.*' }
如果要确保------
仅在一行的开始处匹配,请使用(?sm)^------.*
;如果您还想删除前面的换行符,请使用(?s)\r?\n------.*
(?s)
是一个内联正则表达式选项,它也使.
匹配换行符,以便.*
有效地匹配所有剩余的文本。
由于未指定替换操作数,因此暗示''
(空字符串),从而有效地从输入字符串(技术上称为复制原始字符串并删除匹配部分)。
如果正则表达式'(?s)------.*'
与不匹配匹配,则$_.Body
将按原样返回(从技术上讲,返回的是输入字符串本身,而不是副本) )。
最终结果是,删除所有以------
开头的内容,如果存在的话 。