47

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 構文があるようですが、もっと簡潔で機能的な方法が必要だと思います。

4

3 に答える 3

78

Powershell の配列は@()構文で宣言されます。%の省略形ですforeach-object。すべてのファイル名で配列を宣言し、foreach でループしてみましょう。join-pathパスと子パスを 1 つのパスに結合します。

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

出力:

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

注意: 入力が単一の an 要素で構成されている場合、foreach はコレクションを返しません。配列が必要な場合は、明示的な型を使用するか、結果をラップします。そのようです、

[array]$pFiles = $files | % {join-path "c:\temp" $_ }
$pFiles = @($files | % {join-path "c:\temp" $_ })
于 2012-01-18T11:05:56.743 に答える
4

このような:

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

これは foreach ではわかりません。ごめん

Josh Einstein LINQ for Powershellのすばらしい仕事を利用する

あなたはこれを書くことができます:

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

LINQ の方法で同じ結果が得られますが、 foreach ( %) は使用されません。

于 2012-01-18T11:04:36.370 に答える
4

replace 演算子を使用することもできます。

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

C:\temp\file1.txt
C:\temp\file2.txt
C:\temp\file3.txt
于 2012-01-18T13:06:10.197 に答える