Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

powershell - Task Scheduler doesn't execute batch file properly

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:Scriptcentral_cred.txt, read-host -assecurestring | convertfrom-securestring | out-file D:Scriptcentral_cred.txt#>
$password = get-content D:Scriptcentral_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:ScriptDaily_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:Scriptsend_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:WindowsSystem32WindowsPowerShellv1.0powershell.exe D:Scriptgenerate_GUPs_report.ps1

And here is action in Task Scheduler

enter image description here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...