12

PowerShellのTFSPowerToolsコマンドレットを使用して、サーバーからチェンジセットと関連する作業項目に関する情報を取得しようとしています。私は問題を私が理解していない振る舞いに要約しました、そして私はそれがTFS特有ではないことを望んでいます(それでそこにいる誰かが私に問題を説明することができるかもしれません:))

これが私が仕事に取り掛かることができる唯一のコマンドです:

Get-TfsItemHistory C:\ myDir -recurse -stopafter 5 | %{書き込みホスト$_。WorkItems[0]["タイトル"]}

Get-TfsItemHistoryは5つのChangeSetのリストを返し、それらをforeachにパイプして、最初に関連付けられたWorkItemのタイトルを出力します。それで、私の問題は何ですか?私は大きなスクリプトを書き込もうとしていますが、C#プログラムのように見えるようにコーディングすることを好みます(PowerShell構文で泣きます)。上記を他の方法で記述しようとすると、WorkItemsコレクションはnullになります。

次のコマンド(論理的に同等であると解釈します)は機能しません(WorkItemsコレクションはnullです)。

$ items = Get-TfsItemHistory C:\ myDir -recurse -stopafter 5
$ items | ForEach-Object {Write-Host$_。WorkItems[0]["Title"]}

私が本当に好むもの:

$ items = Get-TfsItemHistory C:\ myDir -recurse -stopafter 5
foreach($itemsの$item)
{{
    $ item.WorkItems[0]["タイトル"]
    #他のことをたくさんする
}

'foreach'演算子とForEach-Objectコマンドレットの違いについての記事を読みましたが、それはパフォーマンスに関する議論のようです。これは、配管がいつ使用されているかについての問題のようです。

これらの3つのアプローチすべてが機能しない理由はわかりません。任意の洞察をいただければ幸いです。

4

1 に答える 1

15

これは確かに紛らわしいです。今のところ、回避策は次のようなアイテムを取得することです。

$items = @(Get-TfsItemHistory . -r -Stopafter 25 | 
           Foreach {$_.WorkItems.Count > $null; $_})

これにより、このプロパティにデータが入力されるように見えるWorkItemsコレクションにアクセスします(私は知っています-WTF?)。@()foreachキーワードを使用したい場合は、配列を生成するために使用する傾向があります。foreachキーワードを使用すると、$nullを含むスカラー値が繰り返されます。したがって、クエリが何も返さない場合、$items$ nullが割り当てられ、foreachはnullに設定された状態でループを1回繰り返し$itemます。現在、PowerShellは一般的にnullを非常にうまく処理します。ただし、その値を.NET Frameworkに戻すと、通常はそれほど寛容ではありません。は@()、0、1、またはN個の要素を含む配列を保証します。0の場合、foreachループはその本体をまったく実行しません。

ところで、あなたの最後のアプローチ---foreach ($item in $items) { ... }はうまくいくはずです。

于 2010-10-24T17:26:07.037 に答える