发布
社区首页 >问答首页 >在PowerShell中拆分字符串并选择子字符串

在PowerShell中拆分字符串并选择子字符串
EN

Stack Overflow用户
提问于 2018-03-29 01:36:41
回答 1查看 1.2K关注 0票数 0

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

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

代码语言:javascript
代码运行次数:0
复制
$StringList
AppTitle1.1.1221.aaa111
     AppSubTitle
AnotherAppTitle1.1.1221.aaa111
     AnotherAppSubTitle

...and等

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

代码语言:javascript
代码运行次数:0
复制
$StringList -split "\s"

但是,一旦将字符串拆分成所需的子字符串,我就不知道如何选择所需的子字符串。列表的长度(即当前应用程序的数量)和在列表中检索标题所需的应用程序的位置都是完全可变的,所以我不能简单地使用子字符串引用号。我尝试过几种选择子字符串的方法,但每种方法都只是返回了整个字符串,或者根本没有返回。

以下是我尝试过的两种方法。第一个返回整个字符串列表,第二个则不返回任何内容。

代码语言:javascript
代码运行次数:0
复制
$DesiredAppTitle = Select-String -InputObject $StringList -Pattern "AnotherAppTitle"

代码语言:javascript
代码运行次数:0
复制
$DesiredAppTitle = foreach ($_.substring in $StringList)
{
     if ($_.substring -contains "AnotherAppTitle")
    {
         return $_.name
    }
}

我想要它回来的是:

代码语言:javascript
代码运行次数:0
复制
AnotherAppTitle1.1.1221.aaa111

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-29 02:02:06

代码语言:javascript
代码运行次数:0
复制
# 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'

上述收益率:

代码语言:javascript
代码运行次数:0
复制
AnotherAppTitle1.1.1221.aaa111

注意使用regex匹配操作符和锚^来确保搜索项在令牌的开头匹配,并使用-split操作符的一元形式,它将输入除以任何非空空格。

至于,你尝试过

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

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

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

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

如上面演示的那样,使用-match方法是更好的方法,但是如果您想用foreach循环来解决这个问题:

代码语言:javascript
代码运行次数:0
复制
$DesiredAppTitle = foreach ($token in -split $StringList) {
  if ($token -match '^AnotherAppTitle') { $token; break }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49546698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档