У меня есть следующий код настройки в шаге задания агента SQL, который не выполняется. Полученное сообщение просто:
Невозможно начать выполнение шага 1 (причина: строка (46): синтаксическая ошибка). Шаг не удался.
Продолжительность работы составляет: 00:00:00
Строка 46 этого сценария here-string
:
,@DriveLetter = '$($c.DriveLetter)'
Этот сценарий отлично работает вне агента SQL Server.
Таблица ServerNames:
CREATE TABLE ServerTable (
ServerName varchar(50)
)
Таблица дискового пространства будет выглядеть примерно так:
CREATE TABLE DiskSpace (
ID int IDENTITY(1,1),
ServerName varchar(50),
DriveLetter varchar(2),
DiskSpaceCapacityGB decimal(12,5),
DiskSpaceFreeGB decimal(12,5)
)
Скрипт PowerShell:
This command is to allow SQL Agent job to show failure in event PowerShell script errors
Default behavior in SQL Agent for PowerShell steps it 'Continue'
$erroractionpreference = "Stop"
$sqlInstance = 'server1'
$sqlDatabase = 'database1'
$qServerList = @"
Select ServerName From ServerTable
"@
$srvList = Invoke-Sqlcmd -ServerInstance $sqlInstance -Database $sqlDatabase -Query $qServerList |
Where-Object {$_ -ne '' -or $_ -ne $null} | Select-Object -ExpandProperty ServerName
foreach ($s in $srvList)
{
if (Test-Connection -ComputerName $s -Count 1 -ErrorAction 'SilentlyContinue')
{
try
{
$cServer = Get-WmiObject Win32_Volume -ComputerName $s -ErrorAction 'Stop' |
where {$.DriveType -eq 3 -and $.DriveLetter } |
Select-Object @{Label="ServerName";Expression={$s}},
@{Label="DriveLetter";Expression={$.DriveLetter}},
@{Label="DiskSpaceCapacityGB";Expression={"{0:N0}" -f($.Capacity/1GB)}},
@{Label="DiskFreeSpaceGB";Expression={"{0:N2}" -f($_.FreeSpace/1GB)}}
foreach ($c in $cServer)
{
$qAddServerDiskSpace = @"
EXEC [dbo].[StoredProcInsert]
@ServerName = '$($c.ServerName)'
,@DriveLetter = '$($c.DriveLetter)'
,@DiskSpaceCapacityGB = $($c.DiskSpaceCapacityGB)
,@DiskFreeSpaceGB = $($c.DiskFreeSpaceGB)
"@
try
{
Invoke-Sqlcmd -ServerInstance $sqlInstance -Database $sqlDatabase -Query $qAddServerDiskSpace -ErrorAction 'Stop'
}
catch
{
$ErrorMsg = $_.Exception.Message
$fullMsg = "Error writing executing dbo.StoredProcInsert for $s - $ErrorMsg"
Return $fullMsg
}
}
}
catch
{
$ErrorMsg = $_.Exception.Message
$qAddPSErrorLog = @"
EXEC [dbo].[StoredProcInsert_Error]
@ServerName = '$($cServer.ServerName)'
, @ErrorText = '$($ErrorMsg)'
"@
try
{
Invoke-Sqlcmd -ServerInstance $sqlInstance -Database $sqlDatabase -Query $qAddPSErrorLog -ErrorAction 'Stop'
}
catch
{
$ErrorMsg = $_.Exception.Message
$fullMsg = "Error writing executing dbo.StoredProcInsert_Error for $s - $ErrorMsg"
Return $fullMsg
}
}
}
else
{
$qAddPSErrorLog = @"
EXEC [dbo].[StoredProcInsert_Error]
@ServerName = '$($cServer.ServerName)'
, @ErrorText = 'Unable to ping server'
"@
try
{
Invoke-Sqlcmd -ServerInstance $sqlInstance -Database $sqlDatabase -Query $qAddPSErrorLog -ErrorAction 'Stop'
}
catch
{
$ErrorMsg = $_.Exception.Message
$fullMsg = "Error writing executing dbo.StoredProcInsert_Error for $s - $ErrorMsg"
Return $fullMsg
}
}
}
РЕДАКТИРОВАТЬ
Установите дополнительные шаги, чтобы попытаться использовать тип CmdExec как PowerShell -Command "& { }"
. При таком выполнении сценарий запускается, и журнал ошибок заполняется для соответствующих блоков перехвата, но данные дискового пространства не записываются в таблицу.
История агента для этого запуска показывает предупреждающее сообщение:
Сообщение выполнено от имени пользователя: NT Service \ SQLAgent $ myInstance. ВНИМАНИЕ: Некоторые импортированные имена команд содержат неутвержденные глаголы, которые могут сделать их менее доступными для обнаружения. Используйте параметр Verbose для более подробной информации или введите Get-Verb, чтобы увидеть список утвержденных глаголов. Код выхода процесса 0. Шаг успешно выполнен.
Если я использую тот же тип шага, но вызываю файл: PowerShell -File MyScript.ps1
я получаю то же сообщение, что и тип шага PowerShell выше для синтаксической ошибки.