2016-11-09 2 views
1

У меня есть хэш-таблицу в Powershell, который выглядит так ($hash_dates.GetEnumerator() | sort -Property name):Цитирование через даты в хеш-таблице?

11/1/2016 12:00:00 AM   5 
11/2/2016 12:00:00 AM   3 
11/4/2016 12:00:00 AM   2 

Ключ имеет тип DateTime.

Я запускаю цикл for, чтобы поймать все даты (только даты, время не имеет значения, таким образом, вся полночь) и вытащите каждое значение в хеш-таблице на основе даты. Код:

$startdate = (get-date).AddDays(-30) 
$today = get-date -format G 
for($i = $startdate; $i -lt $today; $i=$i.AddDays(1)) 
{ 
    $z = $i -split " " 
    $z = [datetime]$z[0] 
    $z = Get-Date $z -format G 
    "Comparing $z to: " 
    $hash_dates.Keys | ? { $hash_dates[$_] -eq $z } 
} 

Я использовал -format G и split для обеспечения матчей формата. Но цикл никогда не находит никаких результатов (даже если он проходит через 11/1/2016 и т. Д.). Я что-то упускаю?

+2

'$ today' является строкой. '$ i -lt $ today' не имеет смысла –

+0

@ MathiasR.Jessen Хмм. Но цикл работает отлично. Он начинается с сегодняшнего дня - 30 и продолжается до сегодняшнего дня, и выводит 'Сравнение на:' каждый проход. Он просто не находит хеш-ключи. – Zeno

+0

@Zeno: Единственная причина, по которой '$ i -lt $ today' работает так, как предполагается, заключается в том, что _string_' $ today' повторно преобразуется в '[datetime]' _ для сравнения_, потому что _LHS_ имеет тип '[datetime]' , но нет веской причины представлять '$ today' в качестве строки для начала. – mklement0

ответ

3

Поскольку ваши Hashtable ключи [datetime] объектов, нет нет необходимости использовать Дата строки и обработка строк на все:

$today = (Get-Date).Date # Note the .Date part, which omits the time portion 
$startdate = $today.AddDays(-30) 

# Note the change from -lt to -le to include today 
for($i = $startdate; $i -le $today; $i = $i.AddDays(1)) 
{ 
    # Note that `echo` is an alias for `Write-Output`, which is the default, 
    # so no need for an explicit output command. 
    "Looking for $i..." 
    # Simply try to access the hashtable with $i as the key, which 
    # either outputs nothing ($null), or outputs the value for that key. 
    $hash_dates.$i 
} 

Re выходной echo/Write-Output/по умолчанию: обратите внимание, что ваши сообщения о статусе станут из ваших данных (output), что может быть нежелательным.
Вместо этого используйте вместо этого Write-Information.


Вот упрощено решение, который демонстрирует выразительность PowerShell:

$today = (get-date).Date 

# Construct an array with all dates of interest. 
$dates = -30..0 | % { $today.AddDays($_) } # % is a built-in alias for ForEach-Object 

# Pass the entire array as the hashtable "subscript", which returns 
# the values for all matching keys while ignoring keys that don't exist. 
$hash_dates[$dates] 
0

Это то, что вы хотите?

$startdate = (get-date).AddDays(-30) 
$today = get-date -format G 
for($i = $startdate; $i -lt $today; $i=$i.AddDays(1)) 
{ 
    $z = $i -split " " 
    $z = [datetime]$z[0] 
    Echo "Comparing $z to: " 
    $z = Get-Date $z 
    $hash_dates.$z 

} 
+0

При доступе к хэш-таблице по ключу ('$ hash_dates. $ Z'), чтобы получить значение, это шаг в правильном направлении, ваш ответ не учитывает все ненужные и хрупкие преобразования даты и строки и разбор , – mklement0

Смежные вопросы