Войти

Показать полную графическую версию : [решено] Вопрос по времени


AstalaWinda
06-11-2015, 15:10
Я чего-то не понял. Почему вот это работает (не выходит ничего):
ls|where lastwritetime -gt 01.01.2016
а вот это нет (выходит все):
ls|where {$_.lastwritetime -gt 01.01.2016}

Foreigner
06-11-2015, 15:40
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
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
Поэтому код отрабатывает без проблем »
Ошибаетесь. Если заменить, например, 2016 на 2015, то можно получить кое-какой список файлов, и они все будут удовлетворять условию. Если это важно, то у меня вин 8,1 апдейт 1.
Foreigner,
правильно ли я понял, что чтобы пшел всегда нормально воспринимал тип дата-время, нужно выбрать один из вариантов?

get-date 10.02.2014
[datetime]"01.01.2015"

Foreigner
06-11-2015, 16:24
AstalaWinda, Или

get-date '10.02.2014'

или

[datetime]::parseexact('10.02.2014','dd.MM.yyyy',$null)

или

[datetime] '02/10/2014'




© OSzone.net 2001-2012