2015-06-27 63 views
0

我有一個PowerShell模塊在PowerShell窗口中運行良好,但是當我將相同的確切代碼放入SQL Server代理作業步驟並嘗試執行它時,它失敗並顯示以下消息。SQL代理 - PowerShell步驟「語法錯誤」

Date    27.6.2015 1:00:00 
Log    Job History (JobName) 
Step ID   1 
Server    ServerName 
Job Name   JobName 
Step Name   Step1 
Duration   00:00:00 
Sql Severity  0 
Sql Message ID  0 
Operator Emailed   
Operator Net sent  
Operator Paged  
Retries Attempted 0 

消息

無法啓動的步驟1的執行(原因:線路(46):語法錯誤)。 該步驟失敗。

下面是有問題的代碼

$text = $table | Where-Object {$_.Pending_Messages -gt $threshold} | Out-String 
$html = "<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""><html xmlns=""http://www.w3.org/1999/xhtml""><head>$style</head><body>$name <br />$warning<br /><br /><table><tr><td>Pending_Messages</td><td>Transaction Profile ID</td><td>Description</td><td>name</td><td>Last Activity</td><td>Address</td><td>Minimum Sent Time</td><td>Awake</td></tr>" 
foreach ($Row in $table.Rows) { 
    if ($($Row[0]) -gt $threshold) { # <--- This is line 46 
    $ToSend = 1 
    write-host "value is : $($Row[0])" 
    $html += "<tr><td>" + $row[0] + "</td><td>" + $row[1] + "</td><td>" + $row[2] + "</td><td>" + $row[3] + "</td><td>" + $row[4] + "</td><td>" + $row[5] + "</td><td>" + $row[6] + "</td><td>" + $row[7] + "</td></tr>" 
    #break 
    } 
} 

出了什麼問題?

+1

@authprivate:請不要編輯並將非代碼文本清晰地更改爲「此表單」。例如,代碼刻度應該僅用於代碼,不適用於'powershell'。 – usr2564301

+0

懷疑是有問題的東西,但是如果($($ Row $ [$] $ threshold)''可能只是'if($ Row [0] -gt $ threshold)''。可能'$ Row [0]'被視爲一個字符串? 'if([int]($ Row [0])-gt $ threshold)' – Matt

+0

我推薦使用'$ table.Rows |其中{$ _ [0] -gt $ threshold} | Foreach-Object {$ Row = $ _; <#循環迭代代碼#>}'。不知道它是否可以解決問題,但是'foreach'關鍵字是同步的,而管道不是。 – Eris

回答

0

您還沒有說過您正在運行的SQL Server或Windows操作系統的版本,但是the Agent runs its own version of powershell與您安裝的任何版本不同。

在SQL Server 2012中,SQLPS工具推出的PowerShell 2.0

在SQL Server 2008中/ 2008R2,SQLPS工具推出的PowerShell 1.0

所以,你可以使用語法功能,是唯一可用在比你的代理正在運行的更高版本的powershell中,這就是爲什麼你得到語法錯誤信息的原因。

+0

謝謝dpw,也感謝所有發表意見的人。很高興知道代理運行它自己的版本的PowerShell。我發現罪魁禍首是$()語法。 – Shawn