Выбрать / отобразить каждый элемент массива Powershell в новый массив - PullRequest
30 голосов
/ 18 января 2012

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

В C # я мог бы сделать это с помощью Linq ...

var files = new string[] { "file1.txt", "file2.txt" };
var path = "c:\temp\";
var filesWithPath = files.Select(f => path + f).ToArray();

Но какой идиоматический способ сделать это в Powershell?Похоже, есть синтаксис foreach, который я мог бы использовать, но я полагаю, что должен быть более лаконичный и функциональный способ сделать это.

Ответы [ 3 ]

55 голосов
/ 18 января 2012

Массив в 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" $_ })
3 голосов
/ 18 января 2012

Вы также можете использовать оператор замены:

PS> 'file1.txt','file2.txt','file3.txt' -replace '(^.+$)','C:\temp\$1'

C:\temp\file1.txt
C:\temp\file2.txt
C:\temp\file3.txt
3 голосов
/ 18 января 2012

Вот так:

$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 (%).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...