PowerShell选择怪异

时间:2011-09-22 13:09:09

标签: powershell powershell-v2.0

我这里有两个选择语句。来自第一个(消息,用户名,时间生成)的“标题”用于第二个(用户名,时间生成)。

请查看echo语句,以查看表\ outputs是否合并为一个。

任何人都可以解释原因吗?

这需要在ps1脚本中运行才能看到奇怪之处:<​​/ p>

$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 个答案:

答案 0 :(得分:2)

看起来像格式化问题,以下似乎按预期工作:

$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中进行了大修,请参阅here

答案 1 :(得分:1)

这是PowerShell控制台输出的功能。输出第一组对象时,可以设置所有后续对象的格式。以下所有内容将在同一个表中呈现为连续的对象流并发布相同的属性。

如果你在一次运行中发出$ a而在完全不同的运行中发出$ b,你会发现你确实有两组不同的对象。你刚刚看到一个控制台格式问题。