Sql-Server-2012

使用 SQL Server 代理啟動的 PowerShell 腳本存檔備份

  • June 13, 2018

我想通過 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 腳本的其餘部分

引用自:https://dba.stackexchange.com/questions/209591