【问题标题】:Splitting a string and selecting a substring in PowerShell在 PowerShell 中拆分字符串并选择子字符串
【发布时间】:2018-09-07 20:36:08
【问题描述】:

我正在尝试从一个较大的字符串中分离并返回一个小的变量字符串。

我正在苦苦挣扎,因为我从中提取的较大字符串是列表格式。我可以成功地将其拆分为子字符串,但我不知道如何在不返回整个字符串的情况下选择其中一个子字符串。该字符串由命令行进程生成。

$StringList
AppTitle1.1.1221.aaa111
     AppSubTitle
AnotherAppTitle1.1.1221.aaa111
     AnotherAppSubTitle

...等等

我可以使用正则表达式将列表字符串逐行拆分为子字符串,以便在空格处拆分(任何给定行中都没有空格)。

$StringList -split "\s"

但是,一旦我将字符串拆分为所需的子字符串,我就不确定如何选择所需的子字符串。列表的长度(即其中存在的应用程序的数量)和我需要在该列表中检索标题的应用程序的位置是完全可变的,因此我不能简单地使用子字符串引用号。我尝试了几种选择子字符串的方法,但每种方法都只是返回了整个字符串,或者什么都不返回。

这是我尝试过的两种方法。第一个返回整个字符串列表,第二个什么也不返回。

$DesiredAppTitle = Select-String -InputObject $StringList -Pattern "AnotherAppTitle"

$DesiredAppTitle = foreach ($_.substring in $StringList)
{
     if ($_.substring -contains "AnotherAppTitle")
    {
         return $_.name
    }
}

我希望它返回的是:

AnotherAppTitle1.1.1221.aaa111

我确信有一百万种方法可以做到这一点,所以如果我的方法看起来都不合适,我愿意接受其他建议。任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: powershell


    【解决方案1】:
    # Multi-line input string.
    $StringList = @'
    AppTitle1.1.1221.aaa111
         AppSubTitle
    AnotherAppTitle1.1.1221.aaa111
         AnotherAppSubTitle
    '@
    
    # Split it into whitespace-separated tokens.
    $tokens = -split $StringList
    
    # Match the token of interest.
    $tokens -match '^AnotherAppTitle'
    

    以上产出:

    AnotherAppTitle1.1.1221.aaa111
    

    注意使用带有锚点^ 的正则表达式匹配运算符以确保搜索词在标记的开头匹配,并使用-split 运算符的一元形式,它将输入拆分为任何非空空格运行。


    至于你尝试了什么

    如果您将多行字符串传递给Select-String,则将其视为单个“行”,如果匹配,则输出整个“行”。

    foreach ($_.substring in $StringList) 甚至不会运行,因为$_.substring 不是一个有效的迭代变量(你不应该使用$_,它是一个自动 变量,作为枚举变量在全部,.substring 访问会破坏语法)。

    如果您使用$_ 而不是$_.substring,则循环在技术上可以工作(尽管$_ 不应该用作迭代变量),但循环只会执行一次,因为整个多行字符串。 即使$_.substring 确实引用了一行(它没有),-contains 也是错误的运算符,因为它会测试 LHS 集合是否包含完整的 RHS 值。

    另外,使用break 退出循环,而不是return

    使用顶部演示的-match 方法是更好的方法,但如果您确实想使用foreach 循环解决此问题:

    $DesiredAppTitle = foreach ($token in -split $StringList) {
      if ($token -match '^AnotherAppTitle') { $token; break }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2019-12-16
      • 2014-10-12
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多