snippetsqlMinor
How to delete the remote files older than N days on schedule from SQL Server 2012 (with SqlServerAgent job)?
Viewed 0 times
the2012deleteserversqlwiththansqlserveragentfileshow
Problem
Struggling to execute PowerShell commands in SqlServer Agent job of MS SQL Server 2012 R2 (Windows Server 2008R2, Windows 7 Prof)
I need to delete (.bak files older, than, say, 7 days in remote file share.
Before inserting the command into SqlServerAgent job, I tried to execute it from Windows command line:
-
using forfiles :
gives the error:
"ERROR: UNC paths (\machine\share) are not supported"
-
using Windows PowerShell:
dir \\RemoteHostName\sharedFolderName |? {$_.CreationTime -lt (get-date).AddDays(-7)} | del
The latter deletes the required remote files when used from Windows PowerShell command prompt but when executed in/from an SqlServerAgent job - fails
The history of such SqlServerAgent jobs shows, quoting:
-
The job succeeded. The job was invoked by User
Note the green check-marks on failed job and job steps
Again, zoomed-in the text output of the result:
Also, when executed this SqlServerAgent job step shows: "processing", then "Success"
though it is persistingly failing to delete required files.
The question(s):
-
Why does the purging of older files using Windows PowerShell commands succeedes from command line prompt and fails
I need to delete (.bak files older, than, say, 7 days in remote file share.
Before inserting the command into SqlServerAgent job, I tried to execute it from Windows command line:
-
using forfiles :
forfiles /P "\\RemoteHostName\sharedFolderName" /s /m *.bak /D -7 /C "cmd /c del @path"gives the error:
"ERROR: UNC paths (\machine\share) are not supported"
-
using Windows PowerShell:
dir \\RemoteHostName\sharedFolderName |? {$_.CreationTime -lt (get-date).AddDays(-7)} | del
The latter deletes the required remote files when used from Windows PowerShell command prompt but when executed in/from an SqlServerAgent job - fails
The history of such SqlServerAgent jobs shows, quoting:
-
The job succeeded. The job was invoked by User
domain\domainAccountName. The last step to run was step 1 - Executed as user:
localHostName\sqlbackup. The job script encountered the following errors. These errors did not stop script: A job step received an error at line in a PowerShellScript. The corresponding line is 'dir "\\RemoteHostName\sharedFolderName\" |? {$_.CreationTime -lt (get-date).AddDays(-7)} | del'. Correct the script and reschedule the job. The error information returned by PowerShell is: 'Cannot find path '\\RemoteHostName\sharedFolderName' because it does not exist. ' Process Exit Code 0. The step succeeded.
Note the green check-marks on failed job and job steps
Again, zoomed-in the text output of the result:
Also, when executed this SqlServerAgent job step shows: "processing", then "Success"
though it is persistingly failing to delete required files.
The question(s):
- How to make the job and step, containing errors, to show "Failed" instead of of "Succeeded"?
-
Why does the purging of older files using Windows PowerShell commands succeedes from command line prompt and fails
Solution
In order to make PowerShell errors cause a SQL Agent step to fail you have to make an adjustment to the
You can put this at the top of your script that should fix that:
This will allow the error PowerShell is returning to trickle up to SQL Server Agent process.
$erroractionpreference setting. By default this value is set to Continue so the steps will show successful because no error is raised up for SQL Server Agent to detect an issue in the actual PowerShell command occurred.You can put this at the top of your script that should fix that:
$erroractionpreference="stop".This will allow the error PowerShell is returning to trickle up to SQL Server Agent process.
Context
StackExchange Database Administrators Q#52184, answer score: 3
Revisions (0)
No revisions yet.