Invoke-Sqlcmd не может быть запущен

У меня есть сценарий PowerShell, который проверяет уровень процессора сервера, на котором он работает, а затем, если он превышает определенный порог, он запускает хранимую процедуру SQL и электронную почту.

Сценарий правильно работает на моем сервере разработки с последней версией PowerShell. Тем не менее, у меня проблемы с запуском Invoke-Sqlcmd Команда на живом сервере, мне нужно получить значения процессора. Для примера это можно назвать LIVESERVER. Это работает PowerShell 2.0, который, я думаю, является проблемой:

Термин "Invoke-Sqlcmd" не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

Я бы не стал вносить какие-либо изменения в этот сервер, так как это критично для бизнеса (если это не простая задача обновления PowerShell без перезагрузок и т. Д.).

Можно ли запустить мой сценарий с моего сервера разработки и указать сервер, с которого нужно получать данные о процессоре? Я не уверен, как синтаксис будет работать для достижения этой цели.

Вот мой сценарий:

# Email 
$recipients = @("Ricky <ricky@email.com>")

# Loop 20 times
for ($i= 1; $i -le 20; $i++) {
    # Find CPU average usage percentage for given time period
    $cpuutil = (Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 20 |
               select -ExpandProperty countersamples |
               select -ExpandProperty cookedvalue |
               Measure-Object -Average).Average

    # Display average CP output
    $cpuutil

    # If CPU average percentage is higher than given value, run stored procedure and
    # e-mail to notify
    if ($cpuutil -ge 60) {
        Invoke-Sqlcmd -Query "SELECT * FROM [Vehicle].[dbo].[tblIndicator]" -ServerInstance "LIVESERVER"
    }

    if ($cpuutil -ge 60) {
        Send-MailMessage -From "serverchecks@email.com" -To $recipients -Body "SP Ran" -Subject "Stored Procedure" -Dno onSuccess, onFailure -SmtpServer 111.1.1.111
    } else {
        Start-Sleep -s 10
    }
}

5 ответов

Решение

PowerShell v2 не загружает модули автоматически, поэтому вам нужно загрузить соответствующие модули или оснастки самостоятельно:

Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100

[ Источник]

Если import-module не работает, вам нужно сначала запустить install-module. Установка SSMS или SSDT по умолчанию не включает модуль sqlserver.

install-module sqlserver
update-module sqlserver
import-module sqlserver

Это должно помочь вашей отладке!

if (-not (Get-Command Invoke-Sqlcmd -ErrorAction SilentlyContinue)) {
    Write-Error "Unabled to find Invoke-SqlCmd cmdlet"
}

if (-not (Get-Module -Name SqlServer | Where-Object {$_.ExportedCommands.Count -gt 0})) {
    Write-Error "The SqlServer module is not loaded"
}

if (-not (Get-Module -ListAvailable | Where-Object Name -eq SqlServer)) {
    Write-Error "Can't find the SqlServer module"
}

Import-Module SqlServer -ErrorAction Stop

Убедитесь, что вы установили модуль Powershell с SQL Server:

Затем попробуйте импортировать модуль SQLPS:

Import-Module SQLPS

Смотрите также: https://blogs.msdn.microsoft.com/psssql/2008/09/02/sql-server-2008-management-tools-basic-vs-complete-explained/

На этот вопрос потратил почти час. У меня было следующее сообщение об ошибке, когда я запускал скрипты с помощью MS Build.

SQLCMD: термин «SQLCMD» не распознается как имя командлета, функции, файла сценария или работающей программы.

Наконец я обнаружил, что перезапуск сервера Windows после установки SQL-сервера сделал чудо. Теперь мои скрипты работают гладко.

Другие вопросы по тегам