Подстрока PowerShell «Индекс вне длины строки» - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть список имен файлов, которые я должен разделить определенным образом. Самый простой способ, который я знаю, - это использовать для них Substring.

Имена файлов форматируются как; VLAN_ [Случайное имя] _ [Случайное число] .ini

Так что я предположил, что использовал Substring для получения имени файла с 5-го по 4-е последнее положение

$FileList = Get-ChildItem -Path $FileDir | Where-Object -Property name -like "VLAN_*"

ForEach($File in $FileList){
    [String]$SheetName = $File.Name # Name Formatted like: VLAN_[Random Name]_[Random Number].ini
    $SheetName = $SheetName.Substring(5,$Sheetname.Length-4)
    Write-Host $File.Name
    Write-Host $SheetName
    Read-Host
}

Когда я пытался с это вернуло мне сообщение об ошибке «Индекс не в длине строки», но когда я использовал 4 или менее в качестве начальной точки для моей подстроки, это сработало. Это как-то связано с символом "_"? Кроме того, когда я начинаю с 0, последние 4 символа удаляются, как они должны, но если отправная точка не равна 0, она никогда не удаляет последние 4 символа.

Вот результат, который я получаю с обоими Методы подстроки:

# Substring(5,$Sheetname.Length-4)

"Index is not in String length" Error

VLAN_BMA_201.ini
VLAN_BMA_201.ini

"Index is not in String length" Error

VLAN_CCTV_120.ini
VLAN_CCTV_120.ini
# Substring(4,$Sheetname.Length-4)

VLAN_BMA_201.ini
_BMA_201.ini

VLAN_CCTV_120.ini
_CCTV_120.ini

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Если имена ваших файлов всегда имеют одинаковую структуру с подчеркиванием, вы можете значительно упростить эту задачу с помощью метода split следующим образом:

ForEach($File in $FileList){
    ($File.BaseName -split '_' )[1..2] -join '_'
}
1 голос
/ 15 апреля 2020

Второй параметр в Substring() - это длина подстроки, поэтому, когда вы говорите, что это <LengthOfString>-4, и вы начинаете подстроку с позиции 5, вы всегда будете выходить за пределы длины строки. Вам нужно добавить первые 5 пропущенных символов к тому, что вычитаете, к длине подстроки. Вместо этого попробуйте $SheetName = $SheetName.Substring(5,$Sheetname.Length-9), и вы получите то, что хотите.

В качестве альтернативы используйте простое регулярное выражение:

if ($SheetName -match 'VLAN_(?<stuffIcareAbout>.+)\.ini')
{
    $SheetName = $Matches.stuffICareAbout
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...