2016-12-15 3 views
0

Я пытаюсь запустить скрипты powershell, которые выполняют скрипты sql из C#.Вызов powershell из C# для запуска SQL-скрипта

Если я запустить Powershell сценарии из Powershell командной строки, он работает, но он не работает, когда я пытаюсь запустить его из C#

Вот функция, я использую для запуска Powershell сценариев

public static void RunPowershell(string fileName, string functionName, Dictionary<string, string> parameters) 
    { 
     string fullPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), fileName); 
     string script = File.ReadAllText(fullPath); 

     try 
     { 
      using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
      { 
       runspace.Open(); 
       PowerShell instance = PowerShell.Create(); 
       instance.Runspace = runspace; 

       instance.AddScript(script); 

       instance.Invoke(); 

       instance.Commands.Clear(); 
       var command = instance.AddCommand(functionName); 
       if (null != parameters) 
       { 
        foreach (var parameter in parameters) 
        { 
         command.AddParameter(parameter.Key, parameter.Value); 
        } 
       } 
       var result = instance.Invoke(); 
      } 
     } 
     catch(Exception e) 
     { 
      MessageBox.Show(e.Message); 
     } 
    } 

и мой сценарий PowerShell (Test2.ps1):

function RunScript(){ 
    Import-Module "SQLPS" -DisableNameChecking 
    Invoke-Sqlcmd -inputfile ".\TestSQL.sql" -ServerInstance . -Verbose 
} 

function ShowMessage(){ 
    [System.Windows.Forms.MessageBox]::Show("Hi from Powershell !") 
} 

TestSQL.sql выглядит следующим образом:

USE TEST 
GO 
INSERT INTO Employee VALUES('1', 'abc') 

Он показывает сообщение, когда я пытаюсь:

PowershellHelper.RunPowershell("Test2.ps1", "ShowMessage", null); 

Но не вставляет в таблицу, когда я пытаюсь:

PowershellHelper.RunPowershell("Test2.ps1", "RunScript", null); 

ответ

0

Это потому, что вы probalby не сценарий TestSQL в вашем текущем каталоге. Вам придется либо передать полный путь, либо переключить свой текущий каталог.

Invoke-Sqlcmd -inputfile "C:\FolderWhereYouhavetheSQL\TestSQL.sql" -ServerInstance . -Verbose 

или

cd "C:\FolderWhereYouhavetheSQL" 
Invoke-Sqlcmd -inputfile ".\TestSQL.sql" -ServerInstance . -Verbose 
+0

TestSQL.sql находится в том же каталоге, Test2.ps1. Я пробовал с полным путем, но это не сработало. –

+0

Каков результат, который вы получаете при запуске Test2.ps1 отдельно от powershell? –

+0

Когда я запускаю Test2.ps1 из командной строки powershell, я вижу, что скрипт выполнен правильно, а значения добавляются в таблицу. –

Смежные вопросы