Tôi có thiết lập mã sau đây trong bước Công việc Tác nhân SQL không chạy. Tin nhắn nhận được chỉ đơn giản là:
Không thể bắt đầu thực hiện bước 1 (lý do: dòng (46): Lỗi cú pháp). Bước thất bại.
Thời gian của công việc là: 00:00:00
Dòng 46 của kịch bản này là here-string
:
,@DriveLetter = '$($c.DriveLetter)'
Kịch bản này chạy hoàn hảo bên ngoài SQL Server Agent.
Bảng ServerNames:
CREATE TABLE ServerTable (
ServerName varchar(50)
)
Bảng không gian đĩa sẽ là một cái gì đó tương tự như:
CREATE TABLE DiskSpace (
ID int IDENTITY(1,1),
ServerName varchar(50),
DriveLetter varchar(2),
DiskSpaceCapacityGB decimal(12,5),
DiskSpaceFreeGB decimal(12,5)
)
Tập lệnh 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
}
}
}
BIÊN TẬP
Thiết lập các bước bổ sung để thử sử dụng loại CmdExec như PowerShell -Command "& { }"
. Với việc thực thi này, tập lệnh chạy và nhật ký lỗi được điền cho các khối bắt thích hợp, nhưng không có dữ liệu không gian đĩa được ghi vào bảng.
Lịch sử đại lý cho lần chạy này hiển thị một thông báo cảnh báo:
Thông báo được thực thi với tư cách là người dùng: NT Service \ SQLAgent $ myInstance. CẢNH BÁO: Một số tên lệnh đã nhập bao gồm các động từ không được chấp thuận có thể khiến chúng ít được khám phá hơn. Sử dụng tham số Verbose để biết thêm chi tiết hoặc nhập Get-Verb để xem danh sách các động từ được phê duyệt. Quy trình thoát mã 0. Bước thành công.
Nếu tôi sử dụng bước cùng loại nhưng gọi tệp: PowerShell -File MyScript.ps1
Tôi nhận được thông báo tương tự như loại bước PowerShell ở trên vì lỗi cú pháp.