Task Scheduler doesn't execute batch file properly

倖福魔咒の 提交于 2020-01-28 02:25:51

问题


I have a batch file to run a powershell program. When I double click the batch file, it runs the powershell code to

  1. generate an EXCEL spreadsheet
  2. email this EXCEL spreadsheet

I even see this action happening.

However, when I use Task Scheduler to execute the batch file, it will run, but it will neither generate an EXCEL spreadsheet, and it certainly won't email the EXCEL spreadsheet.

I have created other tasks to run other batch programs to execute powershell programs, and I never had this problem.

I manually run the batch file with the same permissions used in the Task Scheduler, and have no problem.

I specified the complete path of the batch file in the Task Scheduler.

How do I even start troubleshooting this?

MORE INFORMATION

Here is the entire script, generate_GUPs_report.ps1

$DSN = 'Schools SQL Server ODBC'
$DirectoryToSave='D:\Script\'
$Filename='Daily_GUP_Report' 
$password = $NULL
$credentials = $NULL
$password = $NULL
$conn = $NULL
$cmd = $NULL
$k = $NULL

# constants

$xlCenter=-4108 
$xlTop=-4160 
$xlOpenXMLWorkbook=[int]51 


<#Previously created password file in D:\Script\central_cred.txt, read-host -assecurestring | convertfrom-securestring | out-file D:\Script\central_cred.txt#>
$password = get-content D:\Script\central_cred.txt | convertto-securestring
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "sem5",$password

$username = $credentials.UserName
$password = $credentials.GetNetworkCredential().Password


# SQL Query

$SQL1 = "SELECT
    dbo.V_SEM_COMPUTER.COMPUTER_NAME, dbo.V_SEM_COMPUTER.IP_ADDR1_TEXT as IP_Address, EVENT_DESC as Successful_GUP_Download
FROM
    dbo.V_AGENT_SYSTEM_LOG,  dbo.V_SEM_COMPUTER
WHERE
    EVENT_SOURCE = 'sylink'
    and (EVENT_DESC LIKE '%Downloaded new content update from Group Update Provider successfully.%'
        or EVENT_DESC LIKE '%Downloaded content from GUP%')
    and dbo.V_AGENT_SYSTEM_LOG.TIME_STAMP > DATEDIFF(second, '19700101', DATEADD(day, -1, GETDATE()))  * CAST(1000 as bigint)
    and dbo.V_SEM_COMPUTER.COMPUTER_ID = dbo.V_AGENT_SYSTEM_LOG.COMPUTER_ID
ORDER BY
    dbo.V_AGENT_SYSTEM_LOG.TIME_STAMP DESC"


$SQL2 = "SELECT
    COUNT(DISTINCT EVENT_DESC) AS Number_of_distinct_GUP_downloads_past_24hrs,COUNT(DISTINCT dbo.V_SEM_COMPUTER.COMPUTER_NAME) AS Number_of_Computer_successfully_downloaded_from_GUP_past_24hrs
FROM
    dbo.V_AGENT_SYSTEM_LOG,  dbo.V_SEM_COMPUTER
WHERE
    EVENT_SOURCE = 'sylink'
    and (EVENT_DESC LIKE '%Downloaded new content update from Group Update Provider successfully.%'
        or EVENT_DESC LIKE '%Downloaded content from GUP%')
    and dbo.V_AGENT_SYSTEM_LOG.TIME_STAMP > DATEDIFF(second, '19700101', DATEADD(day, -1, GETDATE()))  * CAST(1000 as bigint)
    and dbo.V_SEM_COMPUTER.COMPUTER_ID = dbo.V_AGENT_SYSTEM_LOG.COMPUTER_ID"

$SQL3 = "SELECT 
    dbo.V_SEM_COMPUTER.COMPUTER_NAME, dbo.V_SEM_COMPUTER.IP_ADDR1_TEXT as IP_Address, COUNT(*) as Number_of_Occurrences_in_Successful_GUP_Downloads_Log
FROM 
    dbo.V_AGENT_SYSTEM_LOG, dbo.V_SEM_COMPUTER
WHERE
    EVENT_SOURCE = 'sylink'
    and (EVENT_DESC LIKE '%Downloaded new content update from Group Update Provider successfully.%'
        or EVENT_DESC LIKE '%Downloaded content from GUP%')
    and dbo.V_AGENT_SYSTEM_LOG.TIME_STAMP > DATEDIFF(second, '19700101', DATEADD(day, -1, GETDATE()))  * CAST(1000 as bigint)
    and dbo.V_SEM_COMPUTER.COMPUTER_ID = dbo.V_AGENT_SYSTEM_LOG.COMPUTER_ID
GROUP BY
    dbo.V_SEM_COMPUTER.COMPUTER_NAME, dbo.V_SEM_COMPUTER.IP_ADDR1_TEXT
ORDER BY
    Number_of_Occurrences_in_Successful_GUP_Downloads_Log DESC" 



# Create Excel file to save the data

if (!(Test-Path -path "$DirectoryToSave")) #create it if not existing 
  { 
  New-Item "$DirectoryToSave" -type directory | out-null 
  } 

$excel = New-Object -Com Excel.Application
$excel.Visible = $True
$wb = $Excel.Workbooks.Add()
$currentWorksheet=1

$ws = $wb.Worksheets.Item(1)
$ws.name = "GUP Download Activity"


$qt = $ws.QueryTables.Add("ODBC;DSN=$DSN;UID=$username;PWD=$password", $ws.Range("A1"), $SQL1)

if ($qt.Refresh()){
    $ws.Activate()
    $ws.Select()
    $excel.Rows.Item(1).HorizontalAlignment = $xlCenter
    $excel.Rows.Item(1).VerticalAlignment = $xlTop
    $excel.Rows.Item("1:1").Font.Name = "Calibri" 
    $excel.Rows.Item("1:1").Font.Size = 11 
    $excel.Rows.Item("1:1").Font.Bold = $true 
}

$ws = $wb.Worksheets.Item(2)
$ws.name = "Totals"


$qt = $ws.QueryTables.Add("ODBC;DSN=$DSN;UID=$username;PWD=$password", $ws.Range("A1"), $SQL2)

if ($qt.Refresh()){
    $ws.Activate()
    $ws.Select()
    $excel.Rows.Item(1).HorizontalAlignment = $xlCenter
    $excel.Rows.Item(1).VerticalAlignment = $xlTop
    $excel.Rows.Item("1:1").Font.Name = "Calibri" 
    $excel.Rows.Item("1:1").Font.Size = 11 
    $excel.Rows.Item("1:1").Font.Bold = $true 
 }


$ws = $wb.Worksheets.Item(3)
$ws.name = "GUP Downloads per Computer"


$qt = $ws.QueryTables.Add("ODBC;DSN=$DSN;UID=$username;PWD=$password", $ws.Range("A1"), $SQL3)

if ($qt.Refresh()){
    $ws.Activate()
    $ws.Select()
    $excel.Rows.Item(1).HorizontalAlignment = $xlCenter
    $excel.Rows.Item(1).VerticalAlignment = $xlTop
    $excel.Rows.Item("1:1").Font.Name = "Calibri" 
    $excel.Rows.Item("1:1").Font.Size = 11 
    $excel.Rows.Item("1:1").Font.Bold = $true 
 }

$filename = "D:\Script\Daily_GUP_Report.xlsx"
if (test-path $filename ) { rm $filename } 
$wb.SaveAs($filename,  $xlOpenXMLWorkbook) #save as an XML Workbook (xslx) 
$wb.Saved = $True #flag it as being saved 
$wb.Close() #close the document 
$Excel.Quit() #and the instance of Excel 
$wb = $Null #set all variables that point to Excel objects to null 
$ws = $Null #makes sure Excel deflates 
$Excel=$Null #let the air out 

Start-Process "D:\Script\send_GUP_report_schools.bat"

And here are the contents of the batch file that runs if I double-click, but not if I schedule through Task Scheduler

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe D:\Script\generate_GUPs_report.ps1

And here is action in Task Scheduler


回答1:


I had a similar problem trying to schedule a script that automates Microsoft Word. In my case, I was eventually able to work around it by setting the DCOM Identity.

Steps

  1. Start > Run: dcomcnfg
    • If you're running 32 bit office on a 64 bit OS, use mmc comexp.msc /32
  2. Expand Component Services > Computers > My Computer > DCOM Config
  3. Find Microsoft Excel Application
  4. Right click, Properties, Identity tab.
  5. Set it to This user and put in the same credentials you put in for the scheduled task.


来源:https://stackoverflow.com/questions/25209037/task-scheduler-doesnt-execute-batch-file-properly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!