Sql-Server-Agent

SQL Job PowerShell 任務失敗 與使用者相同的命令成功

  • April 8, 2020

簡單的要求:刪除遠端路徑上超過 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) o​​n 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 集成”

謝謝你的幫助,彼得。

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