Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Извлечение информации из Excel с помощью PowerShell (http://forum.oszone.net/showthread.php?t=319726)

Alexchandr 13-10-2016 13:41 2677701

Извлечение информации из Excel с помощью PowerShell
 
Добрый день.
Помогите пожалуйста составить скрипт PowerShell который:
1.Открывал заданный файл Excel, содержащий имена и даты.
2.Находил в нем строчки с датой отличающейся от сегодняшней менее чем на 20 дней.
3.Отсылал найденные строчки по электронной почте.

Kazun 13-10-2016 14:52 2677728

Код:

$body = Import-Excel "C:\Users.xlsx" | Where {
        $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.MM")
        $t.Days -gt 0 -and $t.Days -le 20
} | Out-String

if($body)
{
send-mailmessage -from "User01 <user01@example.com>" -to "User02 <user02@example.com>" -subject "Date" -body $body -smtpServer smtp.fabrikam.com
}

Пример файла:


Пример вывода:
Код:

Имя  Дата
---  ----
Поля 1.11.2000

Модуль: https://github.com/dfinke/ImportExcel

Alexchandr 13-10-2016 15:17 2677740

Спасибо за ответ. Подскажите, а как установить Import-Excel?

Alexchandr 14-10-2016 16:51 2678091

При запуске кода возникает ошибка:
Get-Date : Не удается привязать параметр "Date" к целевому объекту. Исключение при задании "Date" : "Ссылка на объект н
е указывает на экземпляр объекта."
строка:2 знак:58
+ $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.M ...
+ ~~~~~~~
+ CategoryInfo : WriteError: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.GetDateCommand


Подскажите, как это можно исправить?

Iska 14-10-2016 18:33 2678117

Alexchandr, самым правильным будет, если Вы выложите образец Вашего:
Цитата:

Цитата Alexchandr
заданный файл Excel, содержащий имена и даты. »

упаковав его в архив.

Alexchandr 18-10-2016 09:46 2679294

Вложений: 1
Вот сам файл.

Iska 18-10-2016 10:07 2679301

Цитата:

Цитата Alexchandr
Вот сам файл. »

У Вас оба столбца называются «Имя», в примере же второй столбец имеет название «Дата» (в этом ли дело — не проверялось, попробуйте сами).

Alexchandr 18-10-2016 10:22 2679306

Исправил второй столбец на "Дата".
Ошибка осталась.

PS C:\Users\Alex> $body = Import-Excel "D:\us\user.xlsx" | Where {
>> $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.MM")
>> $t.Days -gt 0 -and $t.Days -le 20
>> } | Out-String
>>
Get-Date : Не удается привязать параметр "Date" к целевому объекту. Исключение при задании "Date" : "Ссылка на объект н
е указывает на экземпляр объекта."
строка:2 знак:58
+ $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.M ...
+ ~~~~~~~
+ CategoryInfo : WriteError: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.GetDateCommand

Get-Date : Не удается привязать параметр "Date" к целевому объекту. Исключение при задании "Date" : "Ссылка на объект н
е указывает на экземпляр объекта."
строка:2 знак:58
+ $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.M ...
+ ~~~~~~~
+ CategoryInfo : WriteError: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.GetDateCommand

Get-Date : Не удается привязать параметр "Date" к целевому объекту. Исключение при задании "Date" : "Ссылка на объект н
е указывает на экземпляр объекта."
строка:2 знак:58
+ $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.M ...
+ ~~~~~~~
+ CategoryInfo : WriteError: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.GetDateCommand

Get-Date : Не удается привязать параметр "Date" к целевому объекту. Исключение при задании "Date" : "Ссылка на объект н
е указывает на экземпляр объекта."
строка:2 знак:58
+ $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.M ...
+ ~~~~~~~
+ CategoryInfo : WriteError: (:) [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.GetDateCommand

Get-Date : Не удается привязать параметр "Date" к целевому объекту. Исключение при задании "Date" : "Ссылка на объект н

Kazun 18-10-2016 11:32 2679329

Код:

PS > Import-Excel C:\user.xlsx

Имя  Дата
---  ----
Маша 01.10.1986 0:00:00
Паша 02.10.1985 0:00:00
Галя 20.06.1999 0:00:00
Валя 05.11.1965 0:00:00
Поля 01.11.2000 0:00:00

Код:

$body = Import-Excel "C:\Users.xlsx" | Where {$_.Дата} | Where {
        $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.MM")
        $t.Days -gt 0 -and $t.Days -le 20
} | Out-String

Выводит:
Код:

PS > Import-Excel C:\user.xlsx | Where {$_.Дата} | Where {
>> $t = New-TimeSpan (Get-Date).ToString("dd.MM") (Get-Date $_.Дата).ToString("dd.MM")
>> $t.Days -gt 0 -and $t.Days -le 20
>> } | Out-String

Имя  Дата
---  ----
Валя 05.11.1965 0:00:00
Поля 01.11.2000 0:00:00

Если локализациия русская и формат ячеек Дата:
Код:

$t = New-TimeSpan (Get-Date).ToString("dd.MM") ($_.Дата.ToString("dd.MM"))
Если локализациия английская и формат ячеек Дата:
Код:

$t = New-TimeSpan (Get-Date).ToString("MM.dd") ($_.Дата.ToString("MM.dd"))

Alexchandr 18-10-2016 13:22 2679368

Спасибо большое! Заработало!
Единственное, MS Outlook2010 почему то не отображает русские шрифты.


??? ????
--- ----
???? 05.11.1965 0:00:00
???? 01.11.2000 0:00:00

Еще раз спасибо.

Kazun 18-10-2016 13:29 2679371

Попробовать указать параметр -Encoding:
Код:

send-mailmessage -encoding [System.Text.Encoding]::UTF8

Alexchandr 18-10-2016 14:57 2679403

Выдает ошибку:

>> send-mailmessage -encoding [System.Text.Encoding]::UTF8 -from "user01@example.com" -to "user01@example.com" -subject "Date" -body $body -smtpServer smtp.fabrikam.com
>> }
>>
Send-MailMessage : Не удается привязать параметр "Encoding". Не удается преобразовать значение "[System.Text.Encoding]:
:UTF8" типа "System.String" в тип "System.Text.Encoding".
строка:3 знак:28
+ send-mailmessage -encoding [System.Text.Encoding]::UTF8 -from "user01@e ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Send-MailMessage], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SendMailMessage

Alexchandr 18-10-2016 16:18 2679437

С -encoding разобрался.
Но столкнулся с новой проблемой: если имя в таблице длинное, то оно обрезается в почтовом сообщении.


№ Наименование инструкции Дата пересмотра
- ----------------------- ---------------
5 По эксплуатации ПО «Журнал учета пер... 01.11.2016 0:00:00
6 По эксплуатации программного комплек... 02.11.2016 0:00:00

Kazun 18-10-2016 17:02 2679459

Код:

Out-String -Width 250

Alexchandr 24-10-2016 16:07 2681253

Спасибо за помощь.
Подскажите, как нибудь можно форматировать ширину столбца, интервал между столбцами в почтовом сообщении?
Хотелось бы увеличить интервал между первым и вторым столбцом, а между вторым и третьим уменьшить.
Входящее сообщение имеет вид (если результат сохранить на сайте, то интервал между 2 и 3 столбцом автоматически сжимается) :


Код:

№    Дата пересмотра                                                                    Наименование инструкции                                                         
                                                                              ---- ---------------                                                                    ---------------------------------                                               
                                                                                  1 28.10.2016 0:00:00                                                                                    По эксплуатации программы «Автоматизированное рабочее место начальника смены ст...
                                                                                  2 29.10.2016 0:00:00                                                                                    По эксплуатации программного комплекса «АСУРЭО» начальником смены станции.       
                                                                                  3 30.10.2016 0:00:00                                                                                    По эксплуатации программного комплекса «MODES Terminal» начальником смены станции.
                                                                                  4 31.10.2016 0:00:00                                                                                    по эксплуатации автоматизированной системы оперативного мониторинга топливообес...
                                                                                  5 01.11.2016 0:00:00                                                                                    По эксплуатации ПО «Журнал учета переводов присоединений на обходные выключател...



Время: 08:15.

Время: 08:15.
© OSzone.net 2001-