提取字符串对象的第n到第n个字符

5
我有一个文件名,希望提取其中的两个部分并添加到变量中,以便比较它们是否相同。
$name = FILE_20161012_054146_Import_5785_1234.xml 

So I want...

$a = 5785
$b = 1234

if ($a = $b) {
  # do stuff
}

我尝试提取36到39个字符。
Select-Object {$_.Name[35,36,37,38]}

但是我得到了

{5, 7, 8, 5}

考虑过拆分,但看起来很混乱。


1
$_.name.Substring(35,4) - user4003407
谢谢!那很容易 - 我应该知道的,只是脑子一片空白! - TOGEEK
2个回答

2

有几种方法可以实现这个功能。正如PetSerAl所建议的那样,其中最直接的一种是使用.Substring()函数:

$_.name.Substring(35,4)

另一种方法是使用方括号,就像您尝试的那样,但它会给您一个 [char] 对象数组,而不是字符串。您可以使用 -join 并使用范围使其更容易:

$_.name[35..38] -join ''

针对你所做的事情,匹配一个模式,你也可以使用带有捕获组的正则表达式:

if ($_.name -match '_(\d{4})_(\d{4})\.xml$') {
    if ($Matches[1] -eq $Matches[2]) {
        # ...
    }
}

这种方式非常强大,但如果您不熟悉正则表达式,需要多了解一下。在此情况下,它正在查找以下划线_开头,后跟4个数字(0-9),然后是下划线,再跟着四个数字,最后以.xml结尾的字符串。括号将数字包裹起来,以便可以分别捕获它们并稍后引用(在$Matches中)。

0
另一种方法:返回1234子字符串四次。
$FileName = "FILE_20161012_054146_Import_5785_1234.xml"
# $FileName

$FileName.Substring(33,4)         # Substring method (zero-based)

-join $FileName[33..36]           # indexing from beginning (zero-based)

-join $FileName[-8..-5]           # reverse indexing:
                                  # e.g.     $FileName[-1] returns the last character

$FileArr = $FileName.Split("_.")  # Split (depends only on filename "pattern template")
$FileArr[$FileArr.Count -2]       #      does not depend on lengths of tokens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接