Есть ли максимальная длина текста для параметра Select-String -Pattern?

У меня есть список из ~ 500 слов (имен таблиц базы данных), которые объединены в одну строку. Длина строки составляет ~ 12 500 символов.

'TABLE1|TABLE2|TABLE3|...

У меня нет сообщений об ошибках, но могу ли я быть уверен, что это сработает?

2
lit 6 Авг 2020 в 05:40

2 ответа

Лучший ответ

Здесь параметр -Pattern для Select-String принимает string[].

-Pattern <string[]>

    Required?                    true
    Position?                    0
    Accept pipeline input?       false
    Parameter set name           (All)
    Aliases                      None
    Dynamic?                     false

Теперь максимальная длина строки составляет 2147483647 байт. Вы можете получить максимальную емкость строки:

[text.stringbuilder]::new().MaxCapacity

Это означает, что максимальная длина RegEx Select-String может составлять 2147483647 байт (но, скорее всего, вы достигнете нехватки памяти до этого момента ;-)

4
Wasif Hasan 6 Авг 2020 в 02:53

В дополнение к теории, вот тест, который может вас успокоить.

Сначала мы просто создаем текстовый файл с 26 строками, каждая из которых содержит 1 символ английского алфавита, повторяемый 40 000 раз.

$(
97..122 | foreach {"$([char]$_)" * 40000}
) | out-file c:\temp\longstringtest.txt -Encoding utf8

Теперь мы протестируем поиск строки из 20000 символов b.

$pattern = "b" * 20000

If(Select-String -path C:\temp\longstringtest.txt -Pattern $pattern){"Found it!"}

Found it!

Мы можем поднять его до 40000

$pattern = "b" * 40000

If(Select-String -path C:\temp\longstringtest.txt -Pattern $pattern){"Found it!"}

Found it!

Просто чтобы убедиться, что это действительно работает

$pattern = "ba" * 40000

If(Select-String -path C:\temp\longstringtest.txt -Pattern $pattern){"Found it!"} # No output

Мне не хватило смелости протестировать максимальный размер, указанный Васифом, но я подтвердил, что до 200000 также работают нормально.

3
Doug Maurer 6 Авг 2020 в 03:17
63276076