Вместо того, чтобы снова использовать (gc $ bigfile), что заставит PowerShell считывать в $ bigfile в память каждый объект, переданный ему с помощью командлета ForEach-Object, вам, вероятно, следует прочитать файл в переменную и затем индекс массива от этого, вот так:
$bigfile = gc 'c:\scripts\bigfile.txt'
$bigfile | Select-String "melissao" | % {$bigfile[($_.LineNumber -3)..($_.LineNumber +1)]}
Кроме того, поскольку нумерация строк начинается с 1, а индексация массива начинается с 0, вам придется вернуться назад на 3, а не на 2, чтобы получить строку на два пробела выше «melissao», и перейти вперед на 1, а не на 2 , чтобы получить строку на два пробела ниже "мелиссао". В результате вы получите 5 нужных вам строк, а «мелиссао» между двумя линиями над и под ним.
Я не очень знаком с grep -C 2, поэтому я не знаю точно ли это повторяет эту функциональность.