2013-06-12 33 views
19

Tôi đang cố gắng tìm hiểu cách gọi lệnh ghép ngắn PS từ C# và đã đi qua lớp PowerShell. Nó hoạt động tốt cho việc sử dụng cơ bản, nhưng bây giờ tôi muốn thực thi lệnh PS này:Gọi lệnh ghép ngắn powershell từ C#

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

Tôi đã cố gắng xây dựng lớp này thông qua lớp powershell, nhưng tôi không thể làm điều này. Đây là mã của tôi cho đến thời điểm này:

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. 

Tôi luôn có ngoại lệ khi tôi chạy. Có thể chạy lệnh ghép ngắn Where-Object như thế này không?

Trả lời

18

Length, -gt10000 không phải là tham số cho Where-Object. Chỉ có một thông số, FilterScript ở vị trí 0, với giá trị loại ScriptBlock có chứa biểu thức .

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

Nếu bạn có câu phức tạp hơn những gì bạn cần để phân hủy, xem xét sử dụng tokenizer (có sẵn trong v2 hoặc mới hơn) để hiểu cấu trúc tốt hơn:

# 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 

này bãi ra các thông tin sau. Nó không phong phú như trình phân tích cú pháp AST trong v3, nhưng nó vẫn hữu ích:

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

Hy vọng điều này sẽ hữu ích.

+0

Tuyệt vời, tôi hiểu ngay bây giờ. Cảm ơn lời giải thích và mã số :) – NullPointer

+1

Bạn được chào đón nhiều nhất. – x0n

+1

+1 Thx guy, đã tìm kiếm độ tuổi sau đó – algorhythm

Các vấn đề liên quan