Результаты Powershell не собираются в C #

Когда нажата кнопка1, выполняется следующий код, который запускает сценарий PowerShell для получения текущих экземпляров SQL Server. Однако, когда это выполняется, результирующий набор (переменная результатов) имеет счет 0 строк из вывода PowerShell. Когда я запускаю тот же код в собственной PowerShell, он отображает 3 строки с именами экземпляров.

Может ли кто-нибудь посоветовать, если я что-то упустил?

private void button1_Click(object sender, EventArgs e) { //If the logPath exists, delete the file string logPath = "Output.Log"; if (File.Exists(logPath)) { File.Delete(logPath); } string[] Servers = richTextBox1.Text.Split('\n'); //Pass each server name from the listview to the 'Server' variable foreach (string Server in Servers) { //PowerShell Script string PSScript = @" param([Parameter(Mandatory = $true, ValueFromPipeline = $true)][string] $server) Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force; Import-Module SQLServer; Try { Set-Location SQLServer:\\SQL\\$server -ErrorAction Stop; Get-ChildItem | Select-Object -ExpandProperty Name; } Catch { echo 'No SQL Server Instances'; } "; //Create PowerShell Instance PowerShell psInstance = PowerShell.Create(); //Add PowerShell Script psInstance.AddScript(PSScript); //Pass the Server variable in to the $server parameter within the PS script psInstance.AddParameter("server", Server); //Execute Script Collection<PSObject> results = new Collection<PSObject>(); try { results = psInstance.Invoke(); } catch (Exception ex) { results.Add(new PSObject((Object)ex.Message)); } //Loop through each of the results in the PowerShell window foreach (PSObject result in results) { File.AppendAllText(logPath, result + Environment.NewLine); // listBox1.Items.Add(result); } psInstance.Dispose(); } } 

Чтобы получить возможную ошибку PowerShell, я бы попробовал sth. как это:

 private void button1_Click(object sender, EventArgs e) { //If the logPath exists, delete the file string logPath = "Output.Log"; if (File.Exists(logPath)) { File.Delete(logPath); } string[] Servers = richTextBox1.Text.Split('\n'); //Pass each server name from the listview to the 'Server' variable foreach (string Server in Servers) { //PowerShell Script string PSScript = @" param([Parameter(Mandatory = $true, ValueFromPipeline = $true)][string] $server) Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force; Import-Module SQLServer; Try { Set-Location SQLServer:\\SQL\\$server -ErrorAction Stop; Get-ChildItem | Select-Object -ExpandProperty Name; } Catch { echo 'No SQL Server Instances'; } "; using (PowerShell psInstance = PowerShell.Create()) { psInstance.AddScript(PSScript); psInstance.AddParameter("server", Server); Collection<PSObject> results = psInstance.Invoke(); if (psInstance.Streams.Error.Count > 0) { foreach (var errorRecord in psInstance.Streams.Error) { MessageBox.Show(errorRecord.ToString()); } } foreach (PSObject result in results) { File.AppendAllText(logPath, result + Environment.NewLine); // listBox1.Items.Add(result); } } } } 

Причина, по которой он не работает, заключается в том, что psInstance.AddParameter только добавляет параметры в команды, он не работает со сценарием. Вам нужно найти другой способ получить параметр $ server в скрипте. Попробуйте эти два примера powershell, чтобы понять, что я имею в виду. Первый будет выводить все процессы (игнорирует AddParameter), а второй показывает только процессы svchost.

1)

 $ps = [system.management.automation.powershell]::create() $ps.AddScript("get-process") $ps.AddParameter("name","svchost") $ps.invoke() 

2)

 $ps = [system.management.automation.powershell]::create() $ps.AddCommand("get-process") $ps.AddParameter("name","svchost") $ps.invoke() 

Мне удалось обойти эту проблему, используя Win32_service вместо SQLPS.

 Param([Parameter(Mandatory = $true, ValueFromPipeline = $true)][string] $server) $localInstances = @() [array]$captions = GWMI Win32_Service -ComputerName $server | ?{$_.Name -match 'mssql *' -and $_.PathName -match 'sqlservr.exe'} | %{$_.Caption} ForEach($caption in $captions) { if ($caption -eq 'MSSQLSERVER') { $localInstances += 'MSSQLSERVER' } else { $temp = $caption | %{$_.split(' ')[-1]} | %{$_.trimStart('(')} | %{$_.trimEnd(')')} $localInstances += ""$server\$temp"" } } $localInstances; 
  • C # Форма, не вставляющая значения в базу данных SQL Server
  • Как подключиться к удаленной базе данных SQL Server в приложении winforms?
  • Неверное определение имени столбца SQL из запроса
  • как вставить суммирование двух значений в конец в базе данных sql
  • Как установить слово «Недоступно» для нулевых значений в DataGridView
  • Фильтровать, введя текстовое поле
  • Редактирование дубликатов значений в базе данных
  • Невозможно выполнить скрипт из c # с помощью smo
  • Как изменить ширину столбца в DataGridView?
  • Применение трехуровневой архитектуры в приложении Windows Form
  • Каков самый простой, но прочный интерфейс от WinForms к базе данных SQL Server?
  • Interesting Posts

    Sql Server 2008 Перекрестная привязка таблицы таблиц (отношений)

    Постоянное сканирование Sql-сервера – уточнение?

    Группировать по одному значению в разных столбцах в SQL Server

    Синтаксис LINQ Query, связанный с порядком выполнения T-SQL?

    Проблемы с переносом основной идентичности ASP.NET с SQL Server на MySQL

    Новичок: таблица изменения событий кэша с каждой датой

    Попытка добавить два оператора sql и получить ошибку с помощью операторов SELECT

    sql-запрос ничего не возвращает, в то время как он должен

    Записывают ли varchars в SQLServer свою кодировку?

    Запятая разделяет две отдельные колонки

    Каков наилучший способ выбора строковых полей на основе диапазонов символов?

    SQL: нумерация строк, возвращаемых оператором SELECT

    Желательно ли обрабатывать транзакции и ошибки в ASP.NET или SQL Server?

    Как я могу запросить перекрывающиеся диапазоны дат?

    Как заменить символ в SQL

    Давайте будем гением компьютера.