Подтвердить что ты не робот

Выберите/сопоставьте каждый элемент массива 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, который я мог бы использовать, но я полагаю, что должен быть более сжатый, функциональный способ сделать это.

4b9b3361

Ответ 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