#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. это не повлияет на проблему, поскольку она не используется