Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
Dimasik1989
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 181
#1

Работа с датами - PowerShell

29.05.2017, 15:17. Просмотров 1088. Ответов 11
Метки нет (Все метки)

Есть скрипт который возвращает дату последнего обновления, например это 11 мая 2017. Задача следующая:
1) Получаем текущую тату
2) Отнимаем от текущей дату последнего обновления
3) Получаем число (именно число - разницу между этими датами)
4) Если больше 14 дней то должно выводится значение 1
5) Если меньше либо равно 14, то должно выводиться значение 0

Буду очень признателен, поскольку только начинаю осваивать PS
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2017, 15:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с датами (PowerShell):

Арифметические действия с датами
1) Необходимо найти самый новый файл по названию 2) Затем определить его дату...

Заархивировать файлы в соответствии с датами их создания
Всем доброго времени суток. Помогите, пожалуйста со следующим скрпитом: Есть...

Работа с датами
делаю следующее var Y,M,D:word; begin decodedate(Date,Y,M,D); //разбиваю...

Работа с датами
Здравствуйте форумчане! Как выводить последний добавленный год из таблицы? ...

Работа в 1С с датами
Ребят,мне необходимо сформировать список задолжников в 1С предприятии,для этого...

Работа с датами
Добрый день! В своей процедуре пытаюсь получить от сегодняшней даты: ...

11
v_svitere
332 / 269 / 94
Регистрация: 03.06.2009
Сообщений: 800
Записей в блоге: 4
29.05.2017, 15:32 #2
Dimasik1989, примерно так
PowerShell
1
2
3
4
$currentDate=get-date
$lastDate=[datetime]::Parse("01.01.01")
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}
0
Dimasik1989
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 181
29.05.2017, 16:36  [ТС] #3
Я вставил свой скрипт с выводом последней даты обновления и немножко подредактировал в одной из строк, но выходит ошибка.

PowerShell
1
2
3
4
5
6
$updates= Get-HotFix -computername . | where {$_.InstalledOn} | where {$_.Description -notlike "Update"}
$updates | sort InstalledOn -desc | select InstalledOn -First 1
$currentDate = get-date
$lastDate = $updates
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}
Добавлено через 20 минут
Вот ещё чутка подредактировал но всё равно не то, на выходе выдаёт результат 1 и дату последнего обновления
PowerShell
1
2
3
4
5
6
$updates= Get-HotFix -computername . | where {$_.InstalledOn} | where {$_.Description -notlike "Update"}
$updates | sort InstalledOn -desc | select InstalledOn -First 1
$a=$update
$a =[datetime]::Parse("01.01.01")
if(($currentDate-$a).days -le 14){Write-Host 0}else
{Write-Host 1}
0
v_svitere
332 / 269 / 94
Регистрация: 03.06.2009
Сообщений: 800
Записей в блоге: 4
29.05.2017, 16:45 #4
Dimasik1989,
Что-то у вас как-то сложно...
PowerShell
1
2
$dateHOT=Get-HotFix|?{$_.Description -NotMatch "Update"}|%{$_.properties.Item("InstalledOn").value}|sort -des|select -First 1
$lastdate=[datetime]$dateHOT
0
Dimasik1989
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 181
29.05.2017, 16:56  [ТС] #5
v_svitere, с этими строками всё нормально:
PowerShell
1
2
$updates= Get-HotFix -computername . | where {$_.InstalledOn} | where {$_.Description -notlike "Update"}
$updates | sort InstalledOn -desc | select InstalledOn -First 1
На выходе получается дата 11.05.2017

Затем от текущей даты нужно отнять результат выполнения этой части скрипта (т.е. сегодняшняя дата минус 11.05.2017)
с условием которое Вы написали:

PowerShell
1
2
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}
И в результате должно получиться только значение 1

Как то так. Не получается у меня грамотно логику описать((
0
v_svitere
332 / 269 / 94
Регистрация: 03.06.2009
Сообщений: 800
Записей в блоге: 4
29.05.2017, 17:06 #6
Dimasik1989,
v_svitere, с этими строками всё нормально:
Не уверен
Выполните
PowerShell
1
$updates.gettype()
Посмотрите какой тип у вас у переменной $update
Суть в том, чтобы переменные $CurrentDate и $LastDate были одного типа, а именно DATETIME.
Из переменных типа String, например "12.01.2017" можно получить тип DateTIme, при помощи статического метода [datetime]:arse
PowerShell
1
[datetime]::parse("12.01.2017")
Если переменная имеет значение типа "01/28/2016" еще проще
PowerShell
1
[datetime]"01/28/2016"
0
Dimasik1989
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 181
29.05.2017, 17:19  [ТС] #7
Никак не получается совладать:

PowerShell
1
2
3
4
5
6
$updates= Get-HotFix -computername . | where {$_.InstalledOn} | where {$_.Description -notlike "Update"}
$updates | sort InstalledOn -desc | select InstalledOn -First 1
$currentDate=get-date
$lastdate=[datetime]$updates
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}
У меня галиматья получается((((( Помогите пожалуйста написать правильный скрипт
0
v_svitere
332 / 269 / 94
Регистрация: 03.06.2009
Сообщений: 800
Записей в блоге: 4
29.05.2017, 17:40 #8
Лучший ответ Сообщение было отмечено Dimasik1989 как решение

Решение

Dimasik1989,

У меня галиматья получается((((( Помогите пожалуйста написать правильный скрипт
Вы бы хоть сначала текст ошибки приложили, вы думаете здесь все телепаты?
Во-вторых вы проверили тип переменной $updates?

Ну и в-третьих чем вас вышеприведенный код то не устраивает
PowerShell
1
2
3
4
5
$dateHOT=Get-HotFix|?{$_.Description -NotMatch "Update"}|%{$_.properties.Item("InstalledOn").value}|sort -des|select -First 1
$lastdate=[datetime]$dateHOT
$CurrentDate=get-date
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}
Добавлено через 13 минут
Вот так правильнее будет
PowerShell
1
2
3
4
5
6
7
$dateHOT=Get-HotFix|?{$_.Description -NotMatch "Update"}|%{$_.properties.Item("InstalledOn").value}
 
$dateHOT|%{[datetime[]]$dateArray+=[datetime]$_}
$lastDate=$dateArray|sort -des|select -first 1
$CurrentDate=get-date
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}
1
Dimasik1989
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 181
30.05.2017, 12:46  [ТС] #9
Спасибо большое а возможно, тоже самое с переменной $dateHOT? Не получается преобразовать значение переменной

PowerShell
1
2
3
4
5
6
$dateHOT= Get-HotFix -computername . | where {$_.InstalledOn} | where {$_.Description -notlike "Update"}
$dateHOT | sort InstalledOn -desc | select InstalledOn -First 1
$lastdate=[datetime]$dateHOT
$CurrentDate=get-date
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}
Ниже результат вывода с ошибкой:

Не удается преобразовать значение "System.Object[]" типа "System.Object[]" в тип "System.DateTime".
строка:3 знак:1
+ $lastdate=[datetime]$dateHOT
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: ( [], RuntimeException
+ FullyQualifiedErrorId : ConvertToFinalInvalidCastException
0
v_svitere
332 / 269 / 94
Регистрация: 03.06.2009
Сообщений: 800
Записей в блоге: 4
30.05.2017, 13:01 #10
Dimasik1989, Так конечно.
PowerShell
1
$dateHOT | sort InstalledOn -desc | select InstalledOn -First 1
Вот эта строка, только лишь выводит выборку в окно хоста.
И тем самым вот в этой строке:
PowerShell
1
$lastdate=[datetime]$dateHOT
Привести тип "Массив Объектов" к типу DateTime - невозможно.
PowerShell
1
2
3
4
5
6
$dateHOT= Get-HotFix -computername . | where {$_.InstalledOn} | where {$_.Description -notlike "Update"}
$onlyDate=$dateHOT | sort InstalledOn -desc | select InstalledOn -First 1
$lastdate=[datetime]$onlyDate
$CurrentDate=get-date
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}
Но это с учетом того, что результат выборки у Вас будет иметь тип string
0
Dimasik1989
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 181
30.05.2017, 13:57  [ТС] #11
И последний вопросик. Вот Ваш скрипт
$dateHOT=Get-HotFix|?{$_.Description -NotMatch "Update"}|%{$_.properties.Item("InstalledOn").value}

$dateHOT|%{[datetime[]]$dateArray+=[datetime]$_}
$lastDate=$dateArray|sort -des|select -first 1
$CurrentDate=get-date
if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
{Write-Host 1}

При выполнении ощибка:
Не удается найти перегрузку для "op_Subtraction" и количества аргументов: "2".
строка:5 знак:4
+ if(($currentDate-$lastDate).days -le 14){Write-Host 0}else
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ( [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest

Что нужно поправить, чтобы скрипт выполнился?
0
v_svitere
332 / 269 / 94
Регистрация: 03.06.2009
Сообщений: 800
Записей в блоге: 4
30.05.2017, 14:23 #12
Dimasik1989, Попробуйте отладить по шагам
На этапе изучения языка, этот момент очень важен.
Первая строка
PowerShell
1
$dateHOT=Get-HotFix|?{$_.Description -NotMatch "Update"}|%{$_.properties.Item("InstalledOn").value}
Выведет нам список дат.
PowerShell
1
2
3
4
PS C:\Users\lololo.OFFICE> $datehot
10/21/2013
10/21/2013
3/28/2016
Во второй строке^
PowerShell
1
$dateHOT|%{[datetime[]]$dateArray+=[datetime]$_}
Получим из строкового массива дат, массив дат, типа DATETIME
PowerShell
1
2
3
4
5
PS C:\Users\ololo.OFFICE> $dateArray
 
21 октября 2013 г. 0:00:00
21 октября 2013 г. 0:00:00
28 марта 2016 г. 0:00:00
В 3-ей строке
PowerShell
1
$lastDate=$dateArray|sort -des|select -first 1
Полученный массив типа DateTime, отсортируем и выберем первый элемент, заодно проверим тип.
PowerShell
1
2
3
4
5
6
7
8
9
10
PS C:\Users\ololo.OFFICE> $lastDate
 
28 марта 2016 г. 0:00:00
 
 
PS C:\Users\ololo.OFFICE> $LastDate.GetType()
 
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DateTime                                 System.ValueType
Таким образом мы получили, интересующую нас дату, в интересующем нас формате.
Ну а далее, совсем простые вещи.
Отняв от переменной $currentDate, переменную $lastDate мы получим объект типа TIMESPAN
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PS C:\Users\ololo.OFFICE> $CurrentDate-$lastDate
 
 
Days              : 428
Hours             : 14
Minutes           : 0
Seconds           : 23
Milliseconds      : 830
Ticks             : 370296238307672
TotalDays         : 428,583609152398
TotalHours        : 10286,0066196576
TotalMinutes      : 617160,397179453
TotalSeconds      : 37029623,8307672
TotalMilliseconds : 37029623830,7672
И обратившись к свойству days через точечную нотацию, получим значение, которое можно использовать в условии.

Проверяйте пошагово.
0
30.05.2017, 14:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2017, 14:23
Привет! Вот еще темы с решениями:

Работа с датами
Помогите немного с парочкой вопросов. 1. найдите сотрудников принятых после...

Работа с датами
Задание: "День учителя ежегодно отмечается в первое воскресенье октября....

Работа с датами
Ребята, добрый вечер!)) Помогите пожалуйста с таким вот заданием! Перечитала...

Работа с датами
Добрый день, господа! Задача вроде не сложная, но никак не могу составить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru