У меня уже есть сценарий 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