我试图从较大的字符串中分离并返回一个小变量字符串。
我正在挣扎,因为我从其中提取的更大的字符串是列表格式。我可以成功地将其拆分为子字符串,但不知道如何在不返回整个字符串的情况下选择其中的一个子字符串。字符串由命令行进程生成。
$StringList
AppTitle1.1.1221.aaa111
AppSubTitle
AnotherAppTitle1.1.1221.aaa111
AnotherAppSubTitle
...and等
我可以使用正则表达式在空格处拆分列表字符串为子字符串(在任何给定行中都没有空白)。
$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
我确信有无数种方法可以做到这一点,所以如果我的方法看起来都不太合适,我愿意接受其他建议。如能提供任何协助,将不胜感激。提前感谢!
发布于 2018-03-29 02:02:06
# 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
注意使用regex匹配操作符和锚^
来确保搜索项在令牌的开头匹配,并使用-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 }
}
https://stackoverflow.com/questions/49546698
复制相似问题