Подтвердить что ты не робот

Вызов командлетов powershell из С#

Я пытаюсь узнать, как вызывать командлеты PS из С#, и наткнулся на класс PowerShell. Он отлично работает для базового использования, но теперь я хотел выполнить эту команду PS:

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 следующим образом?

4b9b3361

Ответ 1

Length, -gt и 10000 не являются параметрами Where-Object. В позиции 0 есть только один параметр FilterScript со значением типа 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

Это выдает следующую информацию. Это не так богато, как анализатор АСТ в версии 3, но он по-прежнему полезен:

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

Надеюсь, что это поможет.