2013-06-12 20 views
19

C#からPSコマンドレットを呼び出す方法を学び、PowerShellクラスを参照しています。これは、基本的な使用のために正常に動作しますが、今私は、このPSコマンドを実行したい:C#からpowershellコマンドレットを呼び出す

Get-ChildItem | where {$_.Length -gt 1000000} 

私はPowerShellのクラスを介してこれを構築しようとしたが、私はこれを行うように見えることはできません。これまでのコードです:

PowerShell ps = PowerShell.Create(); 
ps.AddCommand("Get-ChildItem"); 
ps.AddCommand("where-object"); 
ps.AddParameter("Length"); 
ps.AddParameter("-gt"); 
ps.AddParameter("10000"); 


// Call the PowerShell.Invoke() method to run the 
// commands of the pipeline. 
foreach (PSObject result in ps.Invoke()) 
{ 
    Console.WriteLine(
     "{0,-24}{1}", 
     result.Members["Length"].Value, 
     result.Members["Name"].Value); 
} // End foreach. 

これを実行すると、いつも例外が発生します。このようなWhere-Objectコマンドレットを実行することは可能ですか?

答えて

18

Length,-gtおよび10000は、Where-Objectのパラメータではありません。位置0にはFilterScriptの1つのパラメータしかありません。タイプScriptBlockの値はの式を含みます。あなたが分解する必要がある、より複雑な文を持っている場合は

PowerShell ps = PowerShell.Create(); 
ps.AddCommand("Get-ChildItem"); 
ps.AddCommand("where-object"); 
ScriptBlock filter = ScriptBlock.Create("$_.Length -gt 10000") 
ps.AddParameter("FilterScript", filter) 

、構造をよりよく理解するために(後でv2またはで利用可能)トークナイザを使用することを検討してください:

# use single quotes to allow $_ inside string 
PS> $script = 'Get-ChildItem | where-object -filter {$_.Length -gt 1000000 }' 
PS> $parser = [System.Management.Automation.PSParser] 
PS> $parser::Tokenize($script, [ref]$null) | select content, type | ft -auto 

これは、以下の情報をダンプします。それはv3のASTパーサほど豊かではありませんが、まだ有用です。

 
    Content     Type 
    -------     ---- 
    Get-ChildItem   Command 
    |      Operator 
    where-object   Command 
    -filter  CommandParameter 
    {     GroupStart 
    _      Variable 
    .      Operator 
    Length     Member 
    -gt     Operator 
    1000000     Number 
    }      GroupEnd 

これは役に立ちます。

+0

偉大な、私は今それを得る。説明とコードをありがとう:) – NullPointer

+1

あなたは大歓迎です。 – x0n

+1

+1 Thx男、後で年齢を探している – algorhythm

関連する問題