Sql-Server-Agent
SQL Job PowerShell 任務失敗 與使用者相同的命令成功
簡單的要求:刪除遠端路徑上超過 20 天的文件。
PS C:\Users\Administrator> Get-ChildItem ` -Path \\FileServer\SQLBackups\SQLServer\ ` -File -Recurse -Force | Where-Object { ($_.LastWriteTime -lt (Get-Date).AddDays(-20)) } | Remove-Item
上面的命令成功(為了可讀性添加了虛反引號和換行符)。
相關的SQL 2016 Job(反引號和換行符沒有加,但是命令文本是一樣的)
@subsystem=N'PowerShell', @command=N'Get-ChildItem -Path \\FileServer\SQLBackups\SQLServer\ -File -Recurse -Force | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-20))}|Remove-Item', @proxy_name=N'XPProxy'
PowerShell返回的錯誤資訊是:
‘找不到與參數名稱’文件’匹配的參數。
沒有權限問題(參考 proxy_name);SQL Powershell 版本:
Major Minor Build Revision ----- ----- ----- -------- 4 0 -1 -1
SQL
@@VERSION
:Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 版權所有 (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 (Build 9600:) (管理程序)
下面是
Get-ChildItem
函式的實際參數列表。為什麼 SQL 不能使用-File
參數?Get-ChildItem [[-Path] <String[]>] [[-Filter] <String>] [-Attributes {ReadOnly | Hidden | System | Directory | Archive | Device | Normal | Temporary | SparseFile | ReparsePoint | Compressed | Offline | NotContentIndexed | Encrypted | IntegrityStream | NoScrubData}] [-Depth <UInt32>] [-Directory] [-Exclude <String[]>] [-File] [-Force] [-Hidden] [-Include <String[]>] [-Name] [-ReadOnly] [-Recurse] [-System] [-UseTransaction] [<CommonParameters>]
CDC:
Get-ChildItem -Path \\FileServer\SQLBackups\SQLServer\ -File -Recurse -Force | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-20))}|Remove-Item
https://www.sqlservercentral.com/forums/topic/powershell-for-network-path http://www.midnightdba.com/Jen/2013/05/quick-tip-navigating-to-a-unc-within-sqlps/
在 SQL Job中將這一行添加
cd C:
到我的 Powershell 任務允許 UNC 引用來解析遠端伺服器文件目錄。引用一位智者的話:“SQL Server 代理有時會以非常不直覺的方式與 powershell 集成”
謝謝你的幫助,彼得。