Действительно, ваша основная проблема ошибочно использовала %
вместо *
в качестве метасимвола подстановки с любой последовательностью символов, включая ни одного.
Однакоесть других вещей, которые стоит улучшить :
При работе с большими файлами не используйте $list = Get-Content "sample.txt"
для чтения массива строк в память сразу - вместо этого используйте конвейер PowerShell для обработки строк одна за другой путем передачи в командлет ForEach-Object
.
Не используйте Write-Host
для вывода результатов ;при этом выполняется запись только в консоль , и вы не сможете получить данные для последующей обработки;вместо этого используйте Write-Output
или, предпочтительно, используйте неявный вывод.
Вам не нужно строгое выражение с подстановочными знаками , соответствующее компоненту пути BILLS
- всевам нужно обрезать конечные пробелы с конца перед использованием литерал сравнение строк с 'BILLS'
.
Чтобы сложить все вместе:
Get-Content sample.txt | ForEach-Object {
$parts = $_ -split '\\'
if ($parts[7].TrimEnd() -ne 'BILLS') { $parts[6] }
}
$parts[6]
- это номер счета - обратите внимание, что, не присваивая его переменной или перенаправляя в другое место, он неявно выводит , так что цикл возвращает только номера счетов, в соответствии с запросом.
Вышеуказанное является эффективным с точки зрения памяти, но потенциально медленным .Если это проблема, прочитайте строки, используя .NET Framework напрямую.
[IO.File]::ReadLines("$PWD/sample.txt") | ForEach-Object {
$parts = $_ -split '\\'
if ($parts[7].TrimEnd() -ne 'BILLS') { $parts[6] }
}