2016-07-15 8 views
1

特定のディレクトリのファイルに対してクエリを実行するための日付変数があります。下の例のように、私は、何の問題各ファイルをGCIことができません:PowerShell v2.0 - DateTimeへの変換

File1.xml 14/07/2016 17:09 
File2.xml 15/07/2016 09:32 

だから私は、すべての特定の年齢の範囲の間でファイルと私の基準を探しています:

$Today4am = Get-Date -Hour 4 -Minute 0 -Second 0 
:より

古いです

しかし、その後より

$Yesterday4am = $Today4am.AddDays(-1) 

変数出力

$Today4am = 15 July 2016 04:00:00 
$Yesterday4am = 14 July 2016 04:00:00 

したがって、変数は日付をファイル自体とは異なる形式でパイプするため、比較を行うには両方の形式が同じであることを確認する必要があります。

$Filter = gci c:\temp\*.xml | 
Where {$_.LastWriteTime -gt $Yesterday4am -and {$_.LastWriteTime-lt $Today4am}} 

演算子「-gt」への不正な引数:ここでは元のスクリプトで14/07/2016 0 4時00分」に「14/07/2016午前17時09分52秒」を比較することができませんでした"エラー: "値" 14/07/2016 04:00 "を" System.DateTime "に変換できません。エラー: "文字列が有効なDateTimeとして認識されませんでした。

は、だから私は-format "DD/MM/YYYYのHH:MM" を追加する変数を変換しようを、これが正しい形式を出力します。しかし$ Yesterday4am = $ Today4am.AddDays変換(-1)-format "DD/MM/YYYYのHH:MM"はエラーを生成します。

Cannot convert value "15/07/2016 04:00" to type "System.DateTime". Error: "String was not recognized as a valid DateTime." 

は、どのように私は両方の日付形式が同意を得ることができますか?

| Where {$_.LastWriteTime -gt (Get-Date $Yesterday4am) -and {$_.LastWriteTime-lt $Today4am}} 
そして、あなたはあなたが Whereオペレータの外 Get-Date変換を行うことができ、パフォーマンスを心配している場合:

答えて

0

私は信じていますこれはちょうどあなたの比較の問題でした。下のスクリプトを実行すると、どちらも "DateTime"型であることがわかります。書式設定すると、簡単に比較できない文字列になります。以下のWhere-Objectコマンドを実行したときにエラーは発生しませんでした。注:私はPowerShellバージョン5を使用しています。

PS> Write-Host "PowerShell Version: $($PSVersionTable.PSVersion.ToString())" 
PowerShell Version: 5.0.10586.122 

PS> $Today4am = Get-Date -Hour 4 -Minute 0 -Second 0 

PS> Write-Host "`$Today4am is type `"$($Today4am.GetType().FullName)`"" 
$Today4am is type "System.DateTime" 

PS> $Yesterday4am = $Today4am.AddDays(-1) 

PS> Write-Host "`$Yesterday4am is type `"$($Yesterday4am.GetType().FullName)`"" 
$Yesterday4am is type "System.DateTime" 

PS> $Filter = Get-ChildItem c:\temp\* | Where-Object -FilterScript { ($_.LastWriteTime -gt $Yesterday4am) -and ($_.LastWriteTime-lt $Today4am) } 

PS> $Filter 

Directory: C:\temp 


Mode    LastWriteTime   Length Name                                             
----    -------------   ------ ----                                             
-a----  7/14/2016 1:13 PM    0 asdfasd 
+0

スーパー!ありがとうございました。だから-filterscriptは私のスクリプトの鍵です - それが何であるかはわかりませんが、それを探すでしょう – JDGEEK

+0

これは実際にWhere-Object(Where)のデフォルトパラメータですが、人々が知るように私が何を呼んでいるかを指定します。これはおそらく、{}式の大括弧の中に{}式を使用したためです。 –

1

DateTime$Yesterday4amを変換するために、もう一度Get-dateを使用してみてください

$Yesterday4am = Get-Date $Yesterday4am 
$Filter = gci c:\temp\*.xml ` 
    | Where {$_.LastWriteTime -gt $Yesterday4am -and {$_.LastWriteTime-lt $Today4am}} 
+0

これは、比較を行う必要があるすべてのアイテムに対してGet-Dateを呼び出します。おそらく少量のファイルでは大したことではありませんが、探しているXMLファイルがたくさんある場合は時間がかかります。 –

+0

ディレクトリに22,000、したがってフィルタリング! – JDGEEK