#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : A scheduled task reports success but does nothing, or fails 0x1 Fix : Make the task's environment match the one you tested in Source: https://jbtecwiz.com/support/srv-app-taskscheduler Run as : Elevated PowerShell Expect : 30 minutes Risk : medium Reversible : yes WHEN THIS IS THE RIGHT FIX The task runs and the program fails. HOW TO UNDO IT Set-ScheduledTask with the previous action definition. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 6" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' A scheduled task reports success but does nothing, or fails 0x1' -ForegroundColor White Write-Host ' Make the task''s environment match the one you tested in' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium Reversible 30 minutes' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Read the task''s configuration.' -Command { Get-ScheduledTask -TaskName 'Nightly Export' | Select-Object -ExpandProperty Actions Get-ScheduledTask -TaskName 'Nightly Export' | Select-Object -ExpandProperty Principal } Invoke-Step -Number 2 -Do 'Set the Start in field. A script that uses relative paths fails with no working directory set, which is the single most common cause of a task that works by hand and not on schedule.' -Why 'Without it, the task starts in C:\Windows\System32, so every relative path in the script points somewhere unexpected. The script does not error in a way that is obvious -- it writes its output into System32 or fails to find its input.' -Command { $a = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\export.ps1' -WorkingDirectory 'C:\Scripts' Set-ScheduledTask -TaskName 'Nightly Export' -Action $a } Invoke-Step -Number 3 -Do 'Check the account it runs as has the rights it needs -- including Log on as a batch job, and access to any network share.' -Command { Get-ScheduledTask -TaskName 'Nightly Export' | Select-Object -ExpandProperty Principal | Format-List UserId,LogonType,RunLevel } Invoke-Step -Number 4 -Do 'A mapped drive does not exist for a task running as another account. Use UNC paths.' -Why 'Drive mappings are per-session. A task running under a service account in session 0 has none of them, and the script fails on the first reference to Z:.' -Manual Invoke-Step -Number 5 -Do 'Capture the output so the failure is visible next time.' -Command { $a = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -File C:\Scripts\export.ps1 *> C:\Logs\export.log' Set-ScheduledTask -TaskName 'Nightly Export' -Action $a } Invoke-Step -Number 6 -Do 'Read the task''s own history for what it thought happened.' -Command { Get-WinEvent -LogName 'Microsoft-Windows-TaskScheduler/Operational' -MaxEvents 60 | Where-Object Message -like '*Nightly Export*' | Format-Table TimeCreated,Id,Message -Wrap } Write-Rule " Confirm it worked" Show-Prose 'The task returns 0x0 and its output file shows the work was done.' 'White' Write-Host '' if (-not $DryRun) { Start-ScheduledTask -TaskName 'Nightly Export' Start-Sleep 30 Get-ScheduledTaskInfo -TaskName 'Nightly Export' | Format-List LastRunTime,LastTaskResult,NextRunTime } Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/srv-app-taskscheduler' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Set-ScheduledTask with the previous action definition.' 'DarkGray' Write-Rule