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

时间:2016-10-12 15:59:06

标签: powershell split

我有一个文件名,我希望提取这部分的两部分并添加到变量中,以便我可以比较它们是否相同。

$name = FILE_20161012_054146_Import_5785_1234.xml 

所以我想...

$a = 5785
$b = 1234

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

我试图将第36个字符提取到第39个字符

Select-Object {$_.Name[35,36,37,38]}

但我得到

{5, 7, 8, 5}

考虑分裂,但看起来很乱。

2 个答案:

答案 0 :(得分: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),后跟下划线和4位数字,然后是字符串末尾的.xml。数字包含在括号中,因此它们将被单独捕获以便稍后引用(在$Matches中)。

答案 1 :(得分: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