Конвейер C #.Вызов () не возвращает коллекцию powershell

#c# #powershell #pipeline #invoke #psobject

#c# #powershell #конвейер #вызвать #psobject

Вопрос:

В Windows 10 на C # я пытаюсь вызвать сценарий powershell через конвейер.Вызов () для извлечения всех дисков на сетевом сервере для каждого сервера в сети. Но не могу заставить его возвращать данные в C #, когда на сервере несколько дисков.

У меня есть следующий код на C #:

 foreach (var server in _collServers)
{
    Pipeline pipeline2 = runspace.CreatePipeline();
    pipeline2 = runspace.CreatePipeline();
    scriptCommand = new Command(@"C:DEVMonitorMonitorbinscriptsGetDisks.ps1");
    CommandParameter commandParm = new CommandParameter("$server", server);
    scriptCommand.Parameters.Add(commandParm);
    pipeline2.Commands.Add(scriptCommand);
    var collDisks = pipeline2.Invoke();

    foreach (var item in collDisks)
    {
        var s = item.ToString();
    }
}
 

который выполняет следующий сценарий powershell (GetDisks.ps1), с именем компьютера, жестко заданным для определенного сервера на данный момент:

 $disks = Get-CimInstance -ClassName CIM_LogicalDisk -ComputerName SERVER01 | Where-Object { ($_.DeviceID -ge 'C') -and ($_.DriveType -eq 3)} | Select-Object DeviceID, VolumeName, Size, Freespace

$disksout = [System.Collections.Generic.List[PSObject]]::New()
ForEach($d in $disks) 
{
    $disk = [PSObject] @{
            'DeviceID' = $d.DeviceID
            'VolumeName' = $d.VolumeName
            'Size' = $d.Size
            'Freespace' = $d.Freespace
        }
    $disksout.Add($disk)
}
$disksout
 

но он не возвращает коллекцию PSObjects в collDisks.

введите описание изображения здесь

Это работает в ISE (и каждая перестановка, которую я пытаюсь выполнить, кажется, работает там).

Это работает, если я запускаю его на своем локальном компьютере, удалив -имя_компьютера SERVER01

 $disks = Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object { ($_.DeviceID -ge 'C') -and ($_.DriveType -eq 3)} | Select-Object DeviceID, VolumeName, Size, Freespace
 

введите описание изображения здесь

Это не имеет никакого значения, если я попытаюсь вместо этого использовать PSCustomObject или создать коллекцию объектов разными способами.

Комментарии:

1. Вы передаете аргумент $server параметру, но в вашем скрипте нет параметров, объявленных?

2. В скрипте у меня есть имя сервера, жестко заданное для одного конкретного сервера, чтобы запустить его (как это происходит непосредственно в PS). Обновили вопрос (SERVER01).

3. Затем удалите scriptCommand.Parameters.Add(commandParm);

4. это не повлияет на проблему, поскольку она не используется