В дополнение к полезный ответ Матиаса Р. Йессена альтернативой на основе оператора -split
:
Глядя на ваши входные данные, путь UNC в каждой строке указывается во втором (последнем) двойном кавычке ("..."
), поэтому вы можете разделить каждую строку на "
символов. и вернуть токен второго-последнего, то есть токен с индексом -2
(синтаксис PSv4 +, из-за использования метода массива .ForEach()
):
# $lstdata is assumed to be an array with the file's lines.
# You can also call .ForEach on (Get-Content ...) directly.
$lstdata.ForEach({ $_ -split '"')[-2] })
Если допустимо включить в результат двойные кавычки, включенные в результат, вы можете просто разделить на пробел , что делает унарная форма -split
:
$lstdata.ForEach({ (-split $_)[-1] })
В PSv3- , где метод массива .ForEach()
недоступен, вам придется использовать - заметно медленнее - ForEach-Object
командлет (чей псевдоним %
) в конвейере :
# Without double quotes
$lstdata | ForEach-Object { ($_ -split '"')[-2] }
# With double quotes.
$lstdata | ForEach-Object { (-split $_)[-1] }
Тем не менее, преимущество использования конвейера - это потенциал для регулирования памяти : если вы предоставите вход в тот же конвейер с Get-Content
и выведите результаты к файлу в том же конвейере, скажем, с Set-Content
, входной файл не нужно загружать в память в целом , поскольку чтение и запись будут происходить по одной строке за раз.