#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