我试图从较大的字符串中隔离并返回一个小变量字符串。
我很挣扎,因为我从中提取的较大字符串是列表格式。我可以成功地将其拆分为子串,但我不知道如何在不返回整个字符串的情况下选择其中一个子串。该字符串由命令行进程生成。
$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
我确信有一百万种方法可以做到这一点,所以如果我的方法都不合适,我会接受其他建议。任何帮助将不胜感激。提前致谢!
答案 0 :(得分: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
不是有效的迭代变量(您不应该使用$_
,这是自动< / em>变量,完全作为枚举变量,而.substring
访问会破坏语法。)
如果您使用$_
代替$_.substring
,那么循环在技术上会起作用(即使$_
不应该用作迭代变量),但是对于整个多行字符串,循环只会执行一次。
即使$_.substring
确实引用了一行(它没有),-contains
也是错误的运算符,因为它会测试LHS集合是否包含完整的RHS值。
另外,使用break
退出循环,而不是return
。
使用顶部演示的-match
方法是更好的方法,但如果您确实希望使用foreach
循环来解决此问题:
$DesiredAppTitle = foreach ($token in -split $StringList) {
if ($token -match '^AnotherAppTitle') { $token; break }
}