2013-05-16 4 views
0

У меня возникла следующая проблема. У меня есть сценарий powershell для отправки мне писем с прикрепленными файлами журналов. Единственная проблема в том, что мне нужны только файлы журналов, которые не пусты. Так я пытался использовать этот скрипт:Powershell отправить письмо

If ((Get-content "Log.txt") -gt 0) { 
    $smtp.Send($msg) 
    echo "email sent" 
    } else { 
    echo "File is blank" 
    } 

Кажется, что -gt 0 не работает для меня. Независимо от того, что я пробовал, powershell по-прежнему отправляет мне пустые журналы. Не могли бы вы показать мне, где я ошибаюсь? Я попытался это так:

If ((Get-Content $file) -eq $Null) { 
    "File is blank" 
    } else { 
    $smtp.Send($msg) 
    echo "email sent" 
    } 

Но она до сих пор не работает.

Заранее спасибо.

+0

Я не знаю много о PowerShell, я в принципе избежать Windows, в целом. Но я бы предположил, что вы можете проверить фактический размер файла вместо использования 'Get-content'. Затем используйте файлizeize, чтобы определить, следует ли отправлять файл. – user1596138

+0

Привет, Иосия, спасибо за комментарий. Я попытался с фактическим размером файла, но результат был тот же. Пустое имя файла отправляется. Если ((Get-ChildItem "Log.txt") |. Еогеасп -процесс ($ _ длина/1Мб -gt ("0,00"))) {$ smtp.Send ($ тзд) \t эхо «отправленное " \t} еще { \t эхо„файл пуст“ \t} дело в том, что если я создать пустой файл его размер 0KB, но файл журнала на сервере 1KB даже он пуст. – user1097593

+0

Прежде всего, я знаю, что вы новичок, просто подумал, что я дам вам знать, чтобы обернуть ваш код в backticks, чтобы отформатировать его в блоках. Во-вторых, то, что я сделал бы, это увидеть, насколько велик файл, если вы просто вложили в него один символ. Если он изменится на 2 КБ, просто рассмотрите что-нибудь <= 1KB как пустое. – user1596138

ответ

1

Get-Content прочитает все содержимое файла - только чтобы выбросить все это! Это огромная трата ресурсов.

Вместо этого получить информацию из самой файловой системы о файле с помощью get-item или get-childitem.

if ((get-item "log.txt").length -gt 0) { 
    do stuff 
} 

Также похоже, что вы используете устаревший метод отправки электронной почты. В PowerShell 2.0 и выше используйте Send-MailMessage - это намного проще в использовании. В самом деле, если у вас есть все лога в одном каталоге, вы можете перегонять это к два вкладышу:

$logs = get-childitem -path PATH_TO_LOGS|where-object{($_.length -gt 0) -and !$_.PSIsContainer}|select-object -expandproperty fullname 
Send-Mailmessage -attachments $logs OTHER_PARAMETERS_HERE 
+0

спасибо за помощь. Мне удалось это сделать, используя Send-Mailmessage и get-content t проверить, является ли файл пустым или нет. – user1097593

+1

Если это вам помогло, пожалуйста, подтвердите и/или отметьте его как ответ. – alroc