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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Вопрос по времени (http://forum.oszone.net/showthread.php?t=307615)

AstalaWinda 06-11-2015 15:10 2572184

Вопрос по времени
 
Я чего-то не понял. Почему вот это работает (не выходит ничего):
Код:

ls|where lastwritetime -gt 01.01.2016
а вот это нет (выходит все):
Код:

ls|where {$_.lastwritetime -gt 01.01.2016}

Foreigner 06-11-2015 15:40 2572192

AstalaWinda, На календаре пока еще 2015... Машина времени в действии. Плюс ко всему в первом примере синтаксис, который не будет работать в версиях ниже 4.0:
Код:

gci | where { $_.lastwritetime -gt [datetime]::parseexact('01.01.2016',"dd.MM.yyyy",$null) }
gci | where { $_.lastwritetime -gt (get-date '01.01.2016') }


Kazun 06-11-2015 15:43 2572194

PSv2 :
Код:

PS > ls|where lastwritetime -gt 01.01.2016
where : Cannot bind parameter 'FilterScript'. Cannot convert the "lastwritetime" value of type "System.String" to type
"System.Management.Automation.ScriptBlock".
At line:1 char:9
+ ls|where <<<<  lastwritetime -gt 01.01.2016
    + CategoryInfo          : InvalidArgument: (:) [Where-Object], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.WhereObjectCommand

PS > ls|where {$_.lastwritetime -gt 01.01.2016}
.2016 : Unexpected token '.2016' in expression or statement.
    + CategoryInfo          : ParserError: (.2016:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

PS > 01.01.2016
.2016 : Unexpected token '.2016' in expression or statement.
    + CategoryInfo          : ParserError: (.2016:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

PSv3+:

ls|where lastwritetime -gt 01.01.2016 парсится как:

BIND arg [lastwritetime] to param [Property] SUCCESSFUL
BIND arg [True] to parameter [GT]
BIND arg [01.01.2016] to param [Value] SUCCESSFUL
Parse result: 01.01.2016 0:00:00

Значение 01.01.2016 преобразуется в тип [datetime], т.е. в тип объекта, который находится Property.

Код:

PS > [datetime]"01.01.2016"

1 января 2016 г. 0:00:00

Теперь, что получается если ввести:

Код:

PS > 01.01.2016
PS >
PS > 01.01.2016 -eq $null
True

Поэтому код отрабатывает без проблем, т.к. gt всегда больше $null. Добавим к типу double,чтобы при вызове свойства 2016 выводил сообщение:

Код:

PS C> Update-TypeData -TypeName system.double -MemberName 2016 -MemberType scriptproperty -Value {"CHECK IT"}
PS > 01.01.2016
CHECK IT

Установим StrictMode:

Код:

PS > Set-StrictMode -Version Latest
PS > 01.01.2016
Не удается найти свойство "2016" для этого объекта. Убедитесь, что оно существует.

PS > ls|where {$_.lastwritetime -gt 01.01.2016}
Не удается найти свойство "2016" для этого объекта. Убедитесь, что оно существует.
строка:1 знак:11
+ ls|where {$_.lastwritetime -gt 01.01.2016}
+          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict


AstalaWinda 06-11-2015 16:12 2572206

Цитата:

Цитата Kazun
Поэтому код отрабатывает без проблем »

Ошибаетесь. Если заменить, например, 2016 на 2015, то можно получить кое-какой список файлов, и они все будут удовлетворять условию. Если это важно, то у меня вин 8,1 апдейт 1.
Foreigner,
правильно ли я понял, что чтобы пшел всегда нормально воспринимал тип дата-время, нужно выбрать один из вариантов?
Код:

get-date 10.02.2014
[datetime]"01.01.2015"


Foreigner 06-11-2015 16:24 2572211

AstalaWinda, Или
Код:

get-date '10.02.2014'
или
Код:

[datetime]::parseexact('10.02.2014','dd.MM.yyyy',$null)
или
Код:

[datetime] '02/10/2014'


Время: 01:39.

Время: 01:39.
© OSzone.net 2001-