PowerShell选择怪异

Mat*_*att 5 powershell powershell-2.0

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

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

有谁能解释为什么?

这需要在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
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

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
Run Code Online (Sandbox Code Playgroud)

nim*_*zen 3

看起来像是格式问题,但以下内容似乎按预期工作:

$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
Run Code Online (Sandbox Code Playgroud)

此外,这看起来肯定像是与多个自定义 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
Run Code Online (Sandbox Code Playgroud)

在 PS_ISE 中运行并执行:

$a | gm
$b | gm
Run Code Online (Sandbox Code Playgroud)

您可以看到它们是具有不同属性的不同对象。如果您在对象之间不使用相同的键名称,事情会变得更加奇怪;如果我们改变的话,看看返回的结果:

$b = $b | `
    % {New-Object PSObject -Property `
        @{Username = $_.username; Timegenerated = $_.timegenerated}
    }
Run Code Online (Sandbox Code Playgroud)

到:

$b = $b | `
    % {New-Object PSObject -Property `
        @{UsernameB = $_.username; TimegeneratedB = $_.timegenerated}
    }
Run Code Online (Sandbox Code Playgroud)

对于那些不愿意运行此程序的人,它会在安全结果集应在的位置返回空格。再次运行 Get-Member 将显示两个自定义对象,每个对象都有自己的属性。

尽管看起来 PSCustomObjects可能会在 v3 中进行彻底修改,但可能值得使用 Microsoft Connect 记录这一点,请参阅此处