PowerShell Выбрать странность - PullRequest
       6

PowerShell Выбрать странность

5 голосов
/ 22 сентября 2011

У меня есть два утверждения здесь. «Заголовки» из первого (сообщение, имя пользователя, сгенерированное по времени) используются для второго (имя пользователя, сгенерированное по времени).

Пожалуйста, посмотрите на оператор echo, чтобы увидеть, что таблицы \ выходы объединяются в одну.

Кто-нибудь может объяснить, почему?

Это нужно запустить в скрипте ps1, чтобы увидеть странность:

$before = get-date
$after = (get-date).AddDays(-1)

$a = Get-EventLog System -Before $before -After $after | ? {$_.Message -like "*start*"}

$a | select message, username,timegenerated

echo "----going through security----" 

$b = Get-Eventlog security -Before $before -After $after |?{$_.category -match "Logon/Logoff" } 

$b | select username,timegenerated

Вывод такой:

Message                                                UserName                                               TimeGenerated
-------                                                --------                                               -------------
The Engine service was successfully sent a star...     NT AUTHORITY\SYSTEM                                    22/09/2011 09:32:09
The Engine service was successfully sent a star...     NT AUTHORITY\SYSTEM                                    21/09/2011 16:03:57
The Licensing Service service was successfu...         DOMAIN\username                                        21/09/2011 15:58:12
----going through security----
                                                       DOMAIN\9876ABC$                                        22/09/2011 14:05:41
                                                       DOMAIN\9876ABC$                                        22/09/2011 14:04:58
                                                       DOMAIN\9876ABC$                                        22/09/2011 14:03:40
                                                       DOMAIN\9876ABC$                                        22/09/2011 14:02:57
                                                       NT AUTHORITY\LOCAL SERVICE                             22/09/2011 14:01:59

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Выглядит как проблема с форматированием, хотя, похоже, работает следующее:

$before = get-date
$after = (get-date).AddDays(-1)

$a = Get-EventLog System -Before $before -After $after | ? {$_.Message -like "*start*"}

$a | select message, username,timegenerated | format-table -force

echo "----going through security----" 

$b = Get-Eventlog security -Before $before -After $after |?{$_.category -match "Logon/Logoff" } 

$b | select username,timegenerated | format-table -force

Кроме того, это определенно похоже на ошибку, связанную с выводом нескольких пользовательских psobject-ов (созданных выше в результате выполнениявыбирает).

Следующий код явно создает отдельный объект PSObject для каждого результата запроса и возвращает те же результаты, что и ваш код (т. Е. Только один набор заголовков):

$before = get-date
$after = (get-date).AddDays(-1)

$a = Get-EventLog System -Before $before -After $after | ? {$_.Message -like "*start*"}
$a = $a | `
    % {New-Object PSObject -Property `
        @{Message = $_.message; Username = $_.username; Timegenerated = $_.timegenerated}
    }
$a

echo "----going through security----" 

$b = Get-Eventlog security -Before $before -After $after |?{$_.category -match "Logon/Logoff" } 
$b = $b | `
    % {New-Object PSObject -Property `
        @{Username = $_.username; Timegenerated = $_.timegenerated}
    }
$b

Запустите это в PS_ISE и выполните:

$a | gm
$b | gm

Вы можете видеть, что это отдельные объекты с разными свойствами.Все становится еще страннее, если вы не используете одинаковые имена ключей между объектами;посмотрите на возвращенные результаты, если мы изменим:

$b = $b | `
    % {New-Object PSObject -Property `
        @{Username = $_.username; Timegenerated = $_.timegenerated}
    }

на:

$b = $b | `
    % {New-Object PSObject -Property `
        @{UsernameB = $_.username; TimegeneratedB = $_.timegenerated}
    }

Для тех, у кого нет желания запускать это, возвращается пробел, где должен быть набор результатов безопасности.При запуске Get-Member снова отображаются два пользовательских объекта, каждый со своими собственными свойствами.

Вероятно, стоит зарегистрировать это в Microsoft Connect, хотя похоже, что PSCustomObjects может получить капитальный ремонт в v3, см. здесь .

1 голос
/ 24 сентября 2011

Это функция вывода консоли PowerShell. Когда вы выводите первый набор объектов, вы устанавливаете формат для всех последующих объектов. Все последующее будет представлено как непрерывный поток объектов в одной и той же таблице и публикует те же свойства.

Если вы выпустите $ a за один прогон и $ b за совершенно другой прогон, вы увидите, что у вас действительно есть два разных набора объектов. Вы просто видите проблему форматирования консоли здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...