Проблемы с вызовом сценария powershell, который вызывает SQL-запросы из c # - PullRequest
1 голос
/ 14 марта 2012

У меня уже есть сценарий Powershell, который выполняет SQL-запрос, форматирует результаты и отправляет их по электронной почте на адрес электронной почты, указанный в командной строке как аргумент сценария. При желании также прикрепляет CSV результатов.

Я пытаюсь создать веб-интерфейс для скрипта powershell для тех, кто предпочитает использовать строки cmd. Я использую C # с веб-страницы ASP. Запуск скрипта из командной строки работает нормально, но когда я запускаю скрипт с веб-страницы, я получаю ошибку TSQL. Я отладил сценарий, чтобы узнать, что он запускает сценарий с правильными аргументами, но завершается неудачно, когда он попадает в командлет Invoke-SqlCmd. Я не видел ничего для этой ошибки в stackoverflow или остальной части Google. Предложения?

Unhandled Execution Error
[ParserException]
   ManagedBatchParser.Parser.Parse() +170
   Microsoft.SqlServer.Management.PowerShell.ExecutionProcessor.ExecuteTSql(String sqlCommand) +275

[CmdletInvocationException]
   System.Management.Automation.Runspaces.PipelineBase.Invoke(IEnumerable input) +485
   System.Management.Automation.Runspaces.Pipeline.Invoke() +84
   _Default.Button1_Click(Object sender, EventArgs e) +660
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3707

Сценарий PowerShell:

$serverName="server"
$dbName="perfmon"

$mailServer="exchange"
$mailUser="testUser"
$mailPass="pass"

$workingPath="D:\scripts"
$scriptFile=$workingPath + "\queryStats.sql"
$tmpSql=$workingPath + "\tmpSql.sql"
$timeout="600"

$mailPass=ConvertTo-SecureString $mailPass -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($mailUser,$mailPass)


$fromEmail="perfmonDB@test"
$toEmail=$args[0]
$getCSV=$args[1]


#add SQL snap ins
Add-PSSnapin SqlServerProviderSnapin100
Add-PSSnapin SqlServerCmdletSnapin100

$sqlCommand= "Invoke-Sqlcmd -ServerInstance $serverName -Database $dbName -InputFile $tmpSql -QueryTimeout $timeout"
echo "$sqlCommand" >> $workingPath\log.txt
$results=Invoke-Expression $sqlCommand

$emailResults = $results | format-table| Out-String
$emailResults = $results | convertto-html -property MachineName, InstanceName, CounterName, Average, Minimum, Maximum| Out-String
if($getCSV -eq "Yes")
{
  $csvResults = $results | Convertto-csv
  $results | Export-Csv $workingPath\results.csv
  Send-MailMessage -To ($toEmail) -Subject "Perfmon Query Results" –From ($fromEmail) -Body $emailResults -Credential $cred -SmtpServer ($mailServer) -BodyAsHtml -Attachments $workingPath\results.csv
}
else {
Send-MailMessage -To ($toEmail) -Subject "Perfmon Query Results" –From ($fromEmail) -Body $emailResults -Credential $cred -SmtpServer ($mailServer) -BodyAsHtml

}
Remove-item $workingPath\tmpSql.sql
Remove-item $workingPath\results.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...