2012-01-18 8 views
21

Tengo una matriz de nombres de archivos en Powershell, y me gustaría agregar una ruta a cada uno de ellos y obtener el resultado en una nueva matriz.Seleccionar/asignar cada elemento de una matriz de Powershell a una nueva matriz

En C# que podría hacer esto utilizando LINQ ...

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

Pero cuál es la forma idiomática de hacer esto en Powershell? Parece que hay una sintaxis foreach que podría usar, pero creo que debe haber una forma más concisa y funcional de hacerlo.

Respuesta

35

Una matriz en Powershell se declara con la sintaxis @(). % es la abreviatura de foreach-object. Vamos a declarar una matriz con todos los nombres de archivo y recorrerla con foreach. join-path combina una ruta y una ruta hija en una ruta única.

$files = @("file1.txt", "file2.txt") 
$pFiles = $files | % {join-path "c:\temp" $_ } 
$pFiles 

Salida:

c:\temp\file1.txt 
c:\temp\file2.txt 
+0

Muchas gracias, no había visto nada sobre ese% de taquigrafía. –

+0

Esto es bueno, parece que si la matriz fuente solo tiene 1 elemento, el resultado no será una matriz ... ¿lo entiendes? – chosenbreed37

+0

@ chosenbreed37 Esto es alrededor de cuatro años una pregunta. Por favor, publique uno nuevo, para que reciba más atención de la comunidad. – vonPryz

2

De esta manera:

$a = @("file1.txt","file2.txt") 
$b = "c:\temp\" 
$c = $a | % { $b + $_ } 

no puedo resolver esto w/o un foreach. Lo sentimos

Utilizando el gran trabajo de Josh Einstein LINQ for Powershell

puede escribir esto:

$a = @("file1.txt","file2.txt") 
$b = "c:\temp\" 
$c = $a | Linq-Select -Selector {$b + $_ } 

tener mismos resultados de una manera LINQ, pero no el uso de un foreach (%).

+3

w/o 'foreach' será' $ c = $ a | . {process {$ b + $ _}} '. Es básicamente lo mismo, pero funciona más rápido. –

+0

Gracias chicos, ¡aceptaría todas estas respuestas si pudiera! –

+0

@RomanKuzmin gracias por esto, nunca uses este tipo de 'foreach'! ¿Tiene algún valor porcentual en la ejecución más rápida respecto de un%? gracias –

2

Usted podría también utilizar el operador de reemplazar:

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

C:\temp\file1.txt 
C:\temp\file2.txt 
C:\temp\file3.txt 
Cuestiones relacionadas