Извлечение от n-го до n-го символов строкового объекта

#powershell #split

#powershell #разделение

Вопрос:

У меня есть имя файла, и я хочу извлечь две его части и добавить в переменные, чтобы я мог сравнить, совпадают ли они.

 $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}

Рассматривал возможность разделения, но выглядит беспорядочно.

Комментарии:

1. $_.name.Substring(35,4)

2. Спасибо! Это было просто — я должен был знать это и иметь ментальный блок!

Ответ №1:

Это можно сделать несколькими способами. Один из самых простых, как предположил ПетСерАл, с .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 ).

Ответ №2:

Еще один подход: возвращает 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