如何使用PowerShell执行外部控制台应用程序并将结果发送到电子邮件?

时间:2010-01-28 12:18:54

标签: powershell

我需要执行一些定期的控制台应用程序,这些应用程序会给我一些结果(在控制台上)...我如何执行它并将其返回数据发送到我的电子邮件? 我试图使用[Diagnostics.Process] :: Start()并启动我的应用程序,但我不知道如何获得返回...我不想要exitCode,我想要应用程序在屏幕上打印的文本。 使用PS V2 CTP3。

***更新

提出的解决方案工作正常但我有一个问题...我需要执行的这个应用程序是来自firebird数据库的gfix,现在我发现了一个东西,我无法将gfix的输出重定向到文件,如果我在命令提示符下执行以下行:

gfix.exe -v -f dabatase.gdb> C:\ test.txt的

它在屏幕上打印输出,文件为空。 同样的事情,如果我尝试将它分配给变量...我不知道gfix与我使用的其他控制台应用程序有什么区别,但看起来它的输出无法重定向。

有人看到这个吗?

***更新2

即使我使用Start-transcript / Stop-Transcript,虽然在屏幕上我看到了gfix输出,但在文件中只有命令:/

***更新3

在这里找到解决方案 http://edn.embarcadero.com/br/article/25605

2 个答案:

答案 0 :(得分:3)

这样的事情可行:

# temporary file
$f = [io.path]::GetTempFileName()
# start process and redirect its output to the temp file
ping localhost > $f

# create and send email
$emailFrom = "user@yourdomain.com"
$emailTo = "user@yourdomain.com"
$subject = "results"
$body = (Get-Content $f) -join "`r`n"
$smtpServer = "your smtp server"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $body)

# delete the file
remove-item $f

我认为在这种情况下不需要[Diagnostics.Process]::Start()。除此之外,还有一个cmdlet Start-Process几乎完全相同。

答案 1 :(得分:3)

PowerShell v2现已推出,因此您可以考虑升级。

然后,您可以尝试: PS> [字符串] $ IPCONFIG = IPCONFIG PS> send-mailmessage -to some_email -from from_email -subject PowerShell -body $ ipconfig -bodyashtml -smtp my_smtp_server

现在,这取决于命令行输出的复杂程度,因为上述方法会将多行折叠为单行。