?

Log in

No account? Create an account
С помощью коммандлета add-type введенного в PowerShell V2 можно добавить небольшую функцию высчитывающую реальный размер в байтах:
 
add-type -type  @'
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace Win32Functions
{
    public class ExtendedFileInfo
    {
        [DllImport("kernel32.dll", SetLastError=true, EntryPoint="GetCompressedFileSize")]
        static extern uint GetCompressedFileSizeAPI(string lpFileName, out uint lpFileSizeHigh);

        public static ulong GetCompressedFileSize(string filename)
        {
            uint high;
            uint low;
            low = GetCompressedFileSizeAPI(filename, out high);
            int error = Marshal.GetLastWin32Error();
            if (high == 0 && low == 0xFFFFFFFF && error != 0)
            throw new Win32Exception(error);
            else
            return ((ulong)high << 32) + low;
        }
    }
}
'@

[Win32Functions.ExtendedFileInfo]::GetCompressedFileSize( "c:\windows\notepad.exe")


Чтобы перевести в мегабайты, можно переписать вывод следующим образом:
$size = [Win32Functions.ExtendedFileInfo]::GetCompressedFileSize( "
c:\windows\notepad.exe
")
$size / 1MB

Tags:

15го октября зарелизился PowerShellPack - огромная коллекция скриптов. PowerShellPack содержит тонну скриптов Powershell второй версии, которые можно использовать для создания всевозможных прикольных и полезных вещей. Сейчас я покажу как используя модуль из PowerShellPack, сделать скрипт для планирования ежедневной отправки почты с информацией об установленных программах на указанной системе.
 
Что касается использования автоматической отправки в PowerShell, то это делается совсем не сложно, благодаря отличной новой команде Send-MailMessage. Send-MailMessage отправляет почту с авторизацией текущего пользователя (или произвольного пользователя) и SMTP сервера.  Send-MailMessage позволяет отправлять почту в формате HTML, используя параметр  –BodyAsHtml и ConvertTo-HTML позволяет содержимое вывода командлета форматировать в HTML. Если письмо необходимо отправить с вступлением и подписью, то всегда можно воспользоваться параметрами  ConvertTo-HTML: –PreContent и –PostContent.
 
Вот небольшой кусок скрипта, который будет отправлять электронное сообщение единожды. Обратите внимание, что вместо написания очень длинныой строки с множеством параметров, я все параметры Send-MailMessage форматировал в виде таблицы с разделением символа конвеера:
$password = Get-Content c:\temp\password.txt | ConvertTo-SecureString
[string]$Encoding="utf-8"
$messageParameters = @{
Subject = "Отчет об установленных программах для $env:ComputerName.$env:USERDNSDOMAIN - $((Get-Date).ToShortDateString())"
Body = Get-WmiObject Win32_Product |
Select-Object Name, Version, Vendor |
Sort-Object Name |
ConvertTo-Html |
Out-String
From = "me@me.ru"
To = "MakcoH@gmail.com"
SmtpServer = "smtp.me.ru"
credential = New-Object System.Management.Automation.PsCredential "login",$password
Encoding = [System.Text.Encoding]::GetEncoding($Encoding)
}
Send-MailMessage @messageParameters -BodyAsHtml Чтобы поместить пароль в
c:\temp\password.txt для дальнейшего использования скрипта. Можно воспользоваться следующим скриптом единожды: read-host -assecurestring | convertfrom-securestring | out-file c:\temp\password.txt
Now that we've got that chunk of code down, let's go ahead and make sure that any problems we encounter get put into a file somewhere.  I can do this by setting one of PowerShell’s magic variables $ErrorActionPreference = “Stop”, and adding a try/catch around all of my code:

Итак, допустим что часть кода не сработает как надо, тогда давайте двинемся дальше и все ошибки скрипта поместим в файл. Мы можем сделать это установив переменную $ErrorActionPreference = “Stop” и добавив блок try/catch на весь мой скрипт.

 $ErrorActionPreference = "Stop"                        
        try {           

$password = Get-Content c:\temp\password.txt | ConvertTo-SecureString
[string]$Encoding="utf-8"
$messageParameters = @{
Subject = "Отчет об установленных программах для $env:ComputerName.$env:USERDNSDOMAIN - $((Get-Date).ToShortDateString())"
Body = Get-WmiObject Win32_Product |
Select-Object Name, Version, Vendor |
Sort-Object Name |
ConvertTo-Html |
Out-String
From = "me@me.ru"
To = "MakcoH@gmail.com"
SmtpServer = "smtp.me.ru"
credential = New-Object System.Management.Automation.PsCredential "login",$password
Encoding = [System.Text.Encoding]::GetEncoding($Encoding)
}
Send-MailMessage @messageParameters -BodyAsHtml
} catch { $_ | Out-File c:\TEMP\ProblemsSendingReport.log.txt -Append -Width 1000 }
Наконец, воспользуемся модулем TaskScheduler из PowerShell Pack, чтобы указанное письмо отправлялось каждый день. Для этого нужно будет установить PowerShellPack, на компьютер, где будет запускаться скрипт. Планирование этой задачи на 9 часов утра будет выглядеть следующим образом:

New-Task |            
    Add-TaskAction -Hidden -Script {            


 $ErrorActionPreference = "Stop"                        
        try {           


$password = Get-Content c:\temp\password.txt | ConvertTo-SecureString
[string]$Encoding="utf-8"
$messageParameters = @{
Subject = "Отчет об установленных программах для $env:ComputerName.$env:USERDNSDOMAIN - $((Get-Date).ToShortDateString())"
Body = Get-WmiObject Win32_Product |
Select-Object Name, Version, Vendor |
Sort-Object Name |
ConvertTo-Html |
Out-String
From = "me@me.ru"
To = "MakcoH@gmail.com"
SmtpServer = "smtp.me.ru"
credential = New-Object System.Management.Automation.PsCredential "login",$password
Encoding = [System.Text.Encoding]::GetEncoding($Encoding)
}
Send-MailMessage @messageParameters -BodyAsHtml
} catch { $_ | Out-File c:\TEMP\ProblemsSendingReport.log.txt -Append -Width 1000 } } | Add-TaskTrigger -Daily -At "9:00 AM" | Add-TaskTrigger -OnRegistration | Register-ScheduledTask "DailySoftReport"



Tags:

Вступление

Наконец-то решил создать блог на русском языке о своих интересах, так как своими мыслями и идеями проще и интереснее делиться на родном языке. Параллельно я буду продолжать вести свой англоязычный блог.
О чем же я буду здесь писать? В первую очередь о том, с чем сталкиваюсь каждый день на работе - это PowerShell и Microsoft System Center Configuration Manager.
Заходите почаще и комментируйте! :)