Выберите/сопоставьте каждый элемент массива Powershell с новым массивом
У меня есть массив имен файлов в Powershell, и я хотел бы добавить путь к каждому из них и получить результат в новом массиве.
В С# я мог бы сделать это с помощью Linq...
var files = new string[] { "file1.txt", "file2.txt" };
var path = "c:\temp\";
var filesWithPath = files.Select(f => path + f).ToArray();
Но каков идиоматический способ сделать это в Powershell? Похоже, есть синтаксис foreach, который я мог бы использовать, но я полагаю, что должен быть более сжатый, функциональный способ сделать это.
Ответы
Ответ 1
Массив в Powershell объявлен с синтаксисом @()
. %
является сокращением для foreach-object
. Позвольте объявить массив со всеми именами файлов и перебрать его с помощью foreach. join-path
объединяет путь и дочерний путь в один путь.
$files = @("file1.txt", "file2.txt")
$pFiles = $files | % {join-path "c:\temp" $_ }
$pFiles
Выход:
c:\temp\file1.txt
c:\temp\file2.txt
Примечание: если вход состоит из одного элемента, foreach не возвращает коллекцию. Если требуется массив, либо используйте явный тип, либо перенесите результаты. Вот так,
[array]$pFiles = $files | % {join-path "c:\temp" $_ }
$pFiles = @($files | % {join-path "c:\temp" $_ })
Ответ 2
Вот так:
$a = @("file1.txt","file2.txt")
$b = "c:\temp\"
$c = $a | % { $b + $_ }
Я не могу понять это без использования foreach. К сожалению
Использование отличной работы от Джоша Эйнштейна LINQ для Powershell
вы можете написать это:
$a = @("file1.txt","file2.txt")
$b = "c:\temp\"
$c = $a | Linq-Select -Selector {$b + $_ }
имеет одинаковые результаты в методе LINQ, но не использует foreach (%
).
Ответ 3
Вы также можете использовать оператор replace:
PS> 'file1.txt','file2.txt','file3.txt' -replace '(^.+$)','C:\temp\$1'
C:\temp\file1.txt
C:\temp\file2.txt
C:\temp\file3.txt