您好,感谢您一起来看看! 我是PS和SQL的新手,但学到了很多。
环境:客户端:win7 64位,server2008r2 sp1上的服务器sql2008r2,powershell3.0, 活动目录
我想做什么:从客户端运行每周查询并通过电子邮件发送结果。
我可以在控制台中手动运行powershell脚本并且工作正常,但是当我将其设置为预定作业时,它会完成脚本,但内部的sql查询失败/不运行。 这是脚本:
#Date
$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('MMM-dd')
#Connection Strings
$Database = "database"
$Server = "server"
#SMTP Relay Server
$SMTPServer = "mail.server"
#Export File
$AttachmentPath = "path"
#Errorlog
$errorlog= "log path"
$SqlQuery = gc sqlquery.sql
# Connect to SQL and query data, extract data to SQL Adapter
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "server=$Server;database=$Database;integrated security=true;"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$nRecs = $SqlAdapter.Fill($DataSet) 2>&1 |Tee-Object -File $errorlog
$nRecs | Out-Null
#Populate Hash Table
$objTable = $DataSet.Tables[0] 2>&1 |Tee-Object -File $errorlog
#Export Hash Table to CSV File
$objTable | Export-CSV $AttachmentPath 2>&1 |Tee-Object -File $errorlog
#Remove quotes from CSV file
(get-content $AttachmentPath) |
foreach-object {$_ -replace '"', ''} |
set-content $AttachmentPath
#Remove first line from CSV file
(get-content $AttachmentPath |
select -skip 1) |
set-content $AttachmentPath
#Send SMTP Message
$Mailer = new-object Net.Mail.SMTPclient($SMTPServer)
$From = "from"
$To = "to"
$Subject = "Some text " + $currentdate
$Body = "Some more text.`n" + (import-csv -path $AttachmentPath | out-string)
$Msg = new-object Net.Mail.MailMessage($From,$To,$Subject,$Body)
$Msg.IsBodyHTML = $False
$Attachment = new-object Net.Mail.Attachment($AttachmentPath)
$Msg.attachments.add($Attachment)
$Mailer.send($Msg)
exit
现在,我最初在sql server日志中收到登录错误,表明它正在尝试使用NT AUTHORITY \ ANONYMOUS USER登录,并意识到计划的作业未设置为保存我的密码。更改了它,现在它使用我的域凭据登录;在sql server日志中没有更多登录失败错误。
我已经看到很多问题(在论坛上)使用PowerShell安排工作,但似乎找不到任何有我特定问题的人。
想法? 任何帮助将不胜感激:)
答案 0 :(得分:3)
我相信这是因为这条线:
$SqlQuery = gc sqlquery.sql
假设您正在执行这样的计划任务:
powershell.exe -file "C:\dir\myscript.ps1"
当您将powershell脚本作为预定作业运行时,它会在"C:\Windows\system32"
文件夹中启动。
注意:当您指定“开始”目录
时也会发生这种情况因此,当您的Get-Content执行时,它会在"C:\Windows\system32\sqlquery.sql"
无论何时我在需要访问任何文件的计划任务中运行脚本,我总是使用完整路径名来处理所有内容,因为你无法假设事情的起始或执行地点。