Как выполнить внешнее консольное приложение с помощью PowerShell и отправить результат по электронной почте? - PullRequest
1 голос
/ 28 января 2010

Мне нужно запустить некоторые периодические консольные приложения, которые дают мне некоторые результаты (на консоли) ... Как я могу выполнить его и отправить его данные возврата на мою электронную почту? Я попытался использовать [Diagnostics.Process] :: Start (), и он запускает мое приложение, но я не знаю, как получить возврат ... Я не хочу exitCode, я хочу текст, который приложение печатает на экране , Использование PS V2 CTP3.

*** ОБНОВЛЕНИЕ

Представленные решения работали нормально, но у меня есть проблема ... это приложение, которое мне нужно выполнить, это gfix из базы данных firebird, и теперь я обнаружил, что не могу перенаправить вывод 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 ]

3 голосов
/ 28 января 2010

PowerShell v2 вышел, так что вы можете подумать об обновлении.

Тогда вы можете просто попробовать: PS> [строка] $ ipconfig = ipconfig PS> send-mailmessage -to some_email -из from_email -subject PowerShell -body $ ipconfig -bodyashtml -smtp my_smtp_server

Теперь, это зависит от того, насколько сложен вывод вашей командной строки, потому что вышеописанный метод свернет несколько строк в один.

3 голосов
/ 28 января 2010

Примерно так может работать:

# 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() не требуется. Кроме того, есть командлет Start-Process, который делает почти то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...