我有一个文件名,我希望提取这部分的两部分并添加到变量中,以便我可以比较它们是否相同。
$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}
考虑分裂,但看起来很乱。
答案 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