Результаты 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(); } }
- Как использовать SqlDataAdapter для обновления нескольких строк в c #
- Отображать изображения с их именем из базы данных в winforms?
- LIKE в c #, но работает в SQL Server Express
- Проблемы с Datetime с vb.net и MSSQL
- разрешение сервера sql, аннулировать разрешение для пользователя
- Обрезка значений базы данных SQL из моего приложения c #
- БД не будет повторно инициализировать местных подписчиков после изменения Схемы
- проблема в представлении просмотра при удалении внешнего ключа?
- Linq Grouping with Include
- Как узнать, успешно ли автоматическое обновление SQL Server из приложения C # WinForms
- Как запустить код с сервера sql в c #
- Возврат результатов и сообщений из хранимой процедуры SQL в winform C #
- Проверка параллелизма с платформой Entity Framework и хранимыми процедурами
Чтобы получить возможную ошибку 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;