2

Powershell で配列を操作する .NET の方法を使用しようとしているコードがいくつかあり、.remove メソッドが必要な要素を削除していません (例 2 と 3 のプロセス名 "wssm")。私は何か間違ったことをしていて、それが何であるかわかりません。

  1. テスト例は、.add を使用して特定の要素を設定すると機能します。

    -----------EX1-----------

    $foo = New-object System.Collections.Arraylist
    
    $foo.add("red")
    
    $foo.add("blue")
    
    $foo.remove("red")
    

    $foo単一の要素値「青」を返します (これは良いことです)。

  2. Get-process の結果を (以下の 2 つの異なる方法を使用して) 配列に入力し、要素値 "wssm" を削除しようとすると、それを見つけて削除できないようです。

    ------------EX2--------------

    $test = New-object System.Collections.Arraylist(,(get-process |select processname))
    
    $test.Remove("wssm")
    

    -------------EX3------------

    $test = New-object System.Collections.Arraylist
    
    $test2= get-process |select processname 
    
    $test.Addrange($Test2)
    
    $test.Remove("wssm")
    

例 2 と 3 は、「wssm」を含む要素を削除せず、プロセス名の配列リスト全体を返すだけで (wssm は配列に存在するものとして示されています)、エラーはスローされません。

私がするとき

$foo |get-member

次のように返されます。

TypeName: System.String

そして .remove IS がメソッドとしてリストされています。私がするとき:

$test |get-member

次のように返されます。

TypeName: Selected.System.Diagnostics.Process

そして .remove はメソッドとしてリストされていません (これがエラーをスローしない理由は不明です)。

の結果に$fooはヘッダーが含まれず、$test の結果には、get-process ステップで選択した「プロセス名」のヘッダーが含まれます。

これは多次元配列の問題ですか? .remove("wssm") ステップで正しい構文を使用していないだけですか? または、配列を別の方法で宣言する必要がありますか?

助けてくれてありがとう。

4

2 に答える 2

2

誰かがこのコードを書いたのを見ましたが、その後削除されました:

$test = New-object System.Collections.Arraylist(,(get-process |select -expandProperty processname))

これは良いことですが、なぜ削除されるのかわかりません。

プロパティを展開しない場合、新しいオブジェクトの「タイプ」は、「System.Diagnostics.Process」である「get-process」によって決定されるようです。

$test = New-object System.Collections.Arraylist(,(get-process |select  processname))

「-expandProperty」を使用すると、system.string になります。

$test = New-object System.Collections.Arraylist(,(get-process |select -expandProperty processname))

実際、これは expandProperty がどのように機能するかを示す非常に良い例です。

于 2013-05-24T18:59:44.850 に答える
2

ArrayListの出力を入力するとGet-Process、オブジェクトの配列が作成されます。Remove()配列にそのような文字列オブジェクトが含まれていないため、文字列「wssm」でメソッドを呼び出しても何も起こりません。代わりに、そのプロセス名でオブジェクトを識別し、そのオブジェクトを配列から削除する必要があります。

$wssm = $test | ? { $_.ProcessName -eq "wssm" }
$test.Remove($wssm)
于 2013-05-24T19:03:31.770 に答える