Sql-Server-2012
使用 SQL Server 代理啟動的 PowerShell 腳本存檔備份
我想通過 SQL Server 代理執行 Powershell 腳本。如果我通過命令提示符手動執行此腳本,它可以正常工作,但 SQL Server Management Studio 中的作業歷史記錄告訴我第 8 行的語法錯誤。
SQL Server 代理執行時環境有什麼不同嗎?
這是我的腳本:
$ArchivesMPath = "E:\ArchivesBDD\Mensuelles" $SauvegardeMPath = "E:\SauvegardeBDD\Mensuelle" $ArchivesQPath = "E:\ArchivesBDD\Quotidiennes" $SauvegardeQPath = "E:\SauvegardeBDD\Quotidienne" $DAYSOFWEEK = "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" $MONTHS = "Decembre", "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre" $DAILYDIR = "$ArchivesQPath\$($DAYSOFWEEK[(get-date).AddDays(-1).DayOfWeek.value__])" if ([System.IO.Directory]::Exists($DAILYDIR)){ Remove-Item $DAILYDIR -Force -Recurse } New-Item -Path $DAILYDIR -ItemType directory Move-Item -Path "$SauvegardeQPath\*" -Destination $DAILYDIR if ((get-date).AddDays(-1).day -eq 1){ $MONTHLYDIR = "$ArchivesMPath\$($MONTHS[(get-date).month])" if ([System.IO.Directory]::Exists($MONTHLYDIR)){ Remove-Item $MONTHLYDIR -Force -Recurse } New-Item -Path $MONTHLYDIR -ItemType directory Move-Item -Path "$SauvegardeMPath\*" -Destination $MONTHLYDIR }
預先感謝您的幫助
我相信您遇到的問題與此 Stack Exchange 文章SQL 代理 - PowerShell 步驟“語法錯誤”中提到的SQL Server 代理令牌有關
摘自那篇文章
這不是很直覺,我從來沒有找到任何具體的解釋
$$ e.g. no exact BOL or white paper was found $$. SQL 代理作業中的語法錯誤是基於使用者令牌的 T-SQL 語法錯誤。所以這基本上意味著 PowerShell 子表達式運算符被視為 SQL Server 代理的令牌。因此,在 PowerShell 中,此 $( ) 似乎被視為 SQL Server 代理的保留字元序列。
在您的範例中,問題行是這樣的
$DAILYDIR = "$ArchivesQPath\$($DAYSOFWEEK[(get-date).AddDays(-1).DayOfWeek.value__])"
注意 $( 這是一個 Powershell 子表達式。這部分試圖被 SQL Server 代理解釋為一個標記。
我的建議是將子表達式分離到另一個 Powershell 變數中( $ DAILYDIRDAY) and then use that to finish building the $ DAILYDIR 變數。
試試這個:
$ArchivesMPath = "E:\ArchivesBDD\Mensuelles" $SauvegardeMPath = "E:\SauvegardeBDD\Mensuelle" $ArchivesQPath = "E:\ArchivesBDD\Quotidiennes" $SauvegardeQPath = "E:\SauvegardeBDD\Quotidienne" $DAYSOFWEEK = "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" $MONTHS = "Decembre", "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre" $DAILYDIRDAY = $DAYSOFWEEK[(get-date).AddDays(-1).DayOfWeek.value__] $DAILYDIR = "$ArchivesQPath\$DAILYDIRDAY"
並跟進 Powershell 腳本的其餘部分