2016-10-12 24 views
2

ファイル名があります。この2つの部分を抽出して変数に追加して、同じかどうかを比較できます。文字列オブジェクトのn番目からn番目の文字を抽出します。

$name = FILE_20161012_054146_Import_5785_1234.xml 

だから私は、私は第39回キャラクター

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

に第36回を抽出することを試みたが、私は

{5, 7, 8, 5}

を取得

$a = 5785 
$b = 1234 

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

が持っている...したいです分裂を考えたが乱雑に見える。

+1

'$ _。名前.Substring(35,4)' – PetSerAl

+0

ありがとう!それは簡単でした - 私はそれを知っていて、精神的なブロックを持っていたはずです! – JDGEEK

答えて

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)。

0

さらに別のアプローチ:1234部分文字列を4回返します。

$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 
関連する問題