Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Powershell子字符串(0,IndexOf)中不匹配时返回整个字符串_Powershell_Powershell 5.0 - Fatal编程技术网

在Powershell子字符串(0,IndexOf)中不匹配时返回整个字符串

在Powershell子字符串(0,IndexOf)中不匹配时返回整个字符串,powershell,powershell-5.0,Powershell,Powershell 5.0,我有一些Powershell可以处理Outlook文件夹中的邮件。大多数电子邮件都有一个页脚,以文本开头。我想转储此字符串之后的所有文本 我在Select Object中添加了一个表达式,如下所示: $cleanser = {($_.Body).Substring(0, ($_.Body).IndexOf("------"))} $someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser} 当Index

我有一些Powershell可以处理Outlook文件夹中的邮件。大多数电子邮件都有一个页脚,以文本开头。我想转储此字符串之后的所有文本

我在
Select Object
中添加了一个表达式,如下所示:

$cleanser = {($_.Body).Substring(0, ($_.Body).IndexOf("------"))}
$someObj | Select-Object -Property @{ Name = 'Body'; Expression = $cleanser}
IndexOf()
返回一个匹配项时,此选项就起作用了。。。但是当没有匹配时,我的
选择对象
输出
null


IndexOf
返回
null
时,如何更新表达式以返回原始字符串?

我同意@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}
与之前无数次一样,在对该问题的评论中提供了关键指针:

使用PowerShell,它实现基于正则表达式的字符串替换,在正则表达式不匹配时按原样返回输入字符串:

# The script block to use in a calculated property with Select-Object later.
$cleanser = { $_.Body -replace '(?s)------.*' }
如果要确保
------
仅在行首匹配,请使用
(?sm)^-----.
;如果还要删除前面的换行符,请使用
(?s)\r?\n----------.

  • (?s)
    是一个内联正则表达式选项,它使
    也匹配换行符,以便
    *
    有效地跨行匹配所有剩余文本

  • 通过不指定替换操作数,隐含了
    '
    (空字符串),这将有效地从输入字符串中删除匹配部分(从技术上讲,将返回删除匹配部分的原始字符串的副本)

  • 如果regex
    '(?s)--.*
    不匹配,
    $\ Body
    按原样返回(从技术上讲,返回的是输入字符串本身,而不是副本)


净效果是以
----
开头的任何内容都会被删除,如果存在的话。

($.Body)-替换'(?)---.'
@MathiasR.Jessen,问题不在于
$.Body
不是一个字符串-HAL9256解决的问题是只调用了一次
$.Body.IndexOf(“----”
),在用作计算属性一部分的
$cleaner
脚本块之外。谢谢。我更喜欢不太冗长的答案,而且我怀疑(尽管还没有测试过)它可能也更有效。不管怎样,谢谢:-)很高兴听到这很有帮助,@Adam;我的荣幸。