Запуск сценариев Powershell через SQL

У меня есть script, который запускает Invoke-SQLCmd против SQLServer под названием Server1. Данные, собранные из этого, передаются вместе с другим script, который запускается с Server2, и результаты вставляются обратно в таблицу на сервере 1. На каждом Invoke-SQLCmd я использовал -user -password с учетной записью, которая имеет разрешения sa для обеих систем.

Когда я запускаю script из командной оболочки или из ISE Poershell, мои данные вставляются в таблицу, и все отлично работает; Когда я запускаю его из SQL, ничего не происходит. Я не получаю никаких выходов (возвращается "null" ), когда я использую xp_cmdshell, как показано ниже.

xp_cmdshell 'powershell.exe -file c:\script.ps1 -ExecutionPolicy Unrestricted'

Я поместил его в SQLjob и использовал учетную запись прокси, которая ссылается на мою учетную запись домена, у которой есть права администратора на обоих блоках, но все еще нет результатов, записанных в истории заданий, и никаких данных в моей таблице на Server1.

Что я делаю неправильно? это должно работать, если оно работает от ISE?

Ответ 1

У меня не было проблем с этим и даже создано несколько сообщений в блоге:

http://sev17.com/2009/04/05/executing-powershell-in-sql-server

http://sev17.com/2010/11/29/executing-powershell-in-sql-server-redux

Единственное, что я делаю по-другому, это использовать параметр -command с именем файла вместо файла -file, но это не должно меняться. Я также включаю имя файла в двойные кавычки, но это не должно иметь значения, если файл script не имеет пробелов в пути к файлу.

Кроме того, мне нужно будет посмотреть, что делает ваш script. Например, он подключается к другим машинам? Можете ли вы запустить простую команду в powershell, например, "powershell -command get-command"?

Ответ 2

Казалось бы, я не правильно загружал snapins. Хотя мои SQLsnapins были загружены для первого сеанса, он не передавал его второму PS script, на котором выполнялся invoke-SQLcmd. Моя вторая script добавила snapin командлета, но этого, возможно, не было достаточно.

Он должен был работать, но по какой-то причине добавление блока script здесь фиксировало его.:/

http://msdn.microsoft.com/en-us/library/cc281962.aspx

Спасибо тем, кто ответил.

Ответ 3

Что я делаю неправильно?

Я думаю, что в приведенном примере есть ошибка. Я бы ожидал:

xp_cmdshell 'powershell.exe -ExecutionPolicy Unrestricted -file c:\script.ps1'

Потому что: " Файл должен быть последним параметром в команде, потому что все символы, введенные после имени параметра Файл, интерпретируются как путь к файлу script, за которым следуют параметры script и их значения."

Источник: Справка командной строки PowerShell.exe