Результаты T-SQL в файл .txt, отправьте уведомление, если null? Из сценария powershell - PullRequest
0 голосов
/ 03 марта 2010

Отказ от ответственности: я все еще отстой в написании сценариев, будьте осторожны, если это глупый вопрос! :)

То, что я делаю, довольно просто. Я использую SqlServerCmdletSnapin, который дает мне возможность выполнять t-sql запросы в powershell 1.0 и возвращать его либо в консоль, либо в файл. В настоящее время я отправляю его в файл .txt, мой код пока здесь:

$sqlcheck = Invoke-Sqlcmd -Query "select * from client" -ServerInstance "TESTDB1\TESTSQL1" | out-file -filepath "C:\MyFolder\Client_Result.txt" 

Вышеприведенное возвращает строку sql (пример):

1 CAAT PI 2003-08-05 13:34:00 PI 2003-08-05 13: 34: 00

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

Я уже написал функцию электронной почты для этого, но на чем я спотыкаюсь, так это на самом деле, как я собираюсь проверять пустые результаты или я предполагаю $ null результаты. Я, вероятно, использую совершенно неправильную логику, но я пишу что-то вроде этого:

$sqlcheck = Invoke-Sqlcmd -Query "select * from client" -ServerInstance "TESTDB1\TESTSQL1" | out-file -filepath "C:\MyFolder\Client_Result.txt" 
if($sqlcheck -is [Array]){
if($sqlcheck[1] -match "OK"){
echo "Status is OK" > C:\MyFolder\Result.log
}
}
else{
Send-Email
}

Очевидно, не работает! Кто-нибудь, пожалуйста, дай мне немного знаний. :)

Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 марта 2010

В дополнение к тому, что упоминает stej, вместо явной проверки на -is [array] вы можете использовать оператор подвыражения массива @(), чтобы убедиться, что результатом является массив.

$sqlcheck = @(Invoke-Sqlcmd -Query "select * from client" `
                            -ServerInstance "TESTDB1\TESTSQL1")
if ($sqlcheck.Count -eq 0) {
    Send-MailMessage ...
}
else {
    $sqlcheck > C:\MyFolder\Client_Result.txt
}

В этом случае $ sqlcheck всегда будет массивом с 0, 1 или n элементами. Также обратите внимание, что PowerShell 2.0 имеет встроенный командлет Send-MailMessage.

1 голос
/ 03 марта 2010

Есть две проблемы.

Во-первых, out-file ничего не выводит. Так что в $sqlcheck всегда будет $null. Вы можете разделить его на два утверждения:

 $sqlcheck = Invoke-Sqlcmd -Query ...
 $sqlcheck | out-file ...

Во-вторых, индексы начинаются с 0, поэтому $sqlcheck[1] является ошибкой. Это должно быть $sqlcheck[0].

Вы также можете пропустить проверку типа и использовать сопоставление для всех элементов в $sqlcheck (простой объект или массив объектов). Как правило, безопаснее использовать синтаксис @(<item>), как предлагает Кит.

if ($sqlcheck -and $sqlcheck -match ...) { ... }

Для некоторых экспериментов посмотрите на

if ($null) { 'true' }
if (@($null)) { 'true' }
if (,@($null)) { 'true' }
if (('a','b','c') -match 'c') { 'true' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...