Powershell get eventlog每次运行都返回不同的结果

Powershell get eventlog每次运行都返回不同的结果,powershell,Powershell,我有一个在远程服务器上运行目录同步工具(用于azure AD)的功能。 问题始于cmdlet,该cmdlet假定返回同步开始的时间 它首先在远程服务器上运行Start-adsyncsyncycle-PolicyType Delta(使用Invoke命令)。然后运行此代码以获取最新事件(使用特定参数): $Event=Get EventLog-LogName Application-ComputerName$ComputerName-newst 1000 | Where Object{$$\源-e

我有一个在远程服务器上运行目录同步工具(用于azure AD)的功能。 问题始于cmdlet,该cmdlet假定返回同步开始的时间

它首先在远程服务器上运行
Start-adsyncsyncycle-PolicyType Delta
(使用
Invoke命令
)。然后运行此代码以获取最新事件(使用特定参数):

$Event=Get EventLog-LogName Application-ComputerName$ComputerName-newst 1000 | Where Object{$$\源-eq“目录同步”-和$\消息-match“Scheduler::StartSyncCycle:Started sync cycle.”}|排序对象时间|选择对象-First 1

问题从下面的
if
语句开始

如果($Event){Write Output”在“$Event.TimeGenerated}开始同步周期,否则{Write Output”sync未开始}

如果的结果是“在开始同步循环时”(在“at”之后有一个空格),则表示它无法获取
$Event.TimeGenerated
。执行
Write Host$Event
时,它会显示
System.Diagnostics.EventLogEntry
,奇怪的是,在其他时间,
if
语句的结果会显示正确的信息,如“在2021年2月17日星期三3:27:16 PM开始同步周期”

有人能帮我弄清楚吗?是什么导致它在每次运行时显示不同的结果? 或者更好的是,它有时返回的
System.Diagnostics.EventLogEntry
对象是什么

我有一种感觉我错过了一些愚蠢的事情(


提前感谢。

我看到了几个错误。核心错误在这里:

Sort-Object Time | Select-Object -First 1
首先,虽然
Get EvenLog
的输出显示一个名为
Time
的列,但实际上没有名为
Time
的属性。您可以通过
Get EvenLog-LogName Application-latest 1 | Format List-property*
看到这一点。您可能需要两个属性:
TimeGenerated
timewrited
.off,我不确定哪个
时间
代表什么,因为我看到的每个事件都有相同的值

其次,对日期时间进行排序的默认顺序是升序。这意味着此代码将获取最新1000个事件中最早的事件。这不是您描述的代码所做的。您应该使用
-Descending
开关来获取最新的日志记录

接下来,您应该在使用
-source
参数调用
Get EventLog
时指定源,因为您知道确切的源。这将通过让命令为您执行过滤来提高性能

最后,此处的模式匹配包含特殊的正则表达式字符:

$_.Message -match "Scheduler::StartSyncCycle : Started sync cycle."
如果这是要匹配的文本字符串,则应改为匹配:

$_.Message -match "Scheduler::StartSyncCycle : Started sync cycle\."
因此,我将这样编写您的代码:

$Event = Get-EventLog -LogName Application -ComputerName $ComputerName -Source "Directory Synchronization" -Newest 1000 |
  Where-Object Message -match "Scheduler::StartSyncCycle : Started sync cycle\." |
  Sort-Object -Property TimeGenerated -Descending |
  Select-Object -First 1
if ($null -ne $Event) {
    "Started sync at $($Event.TimeGenerated)"
}
else {
    "Sync did not start."
}
我不太确定
Write Output
语句有什么问题,因为我无法在此处重新创建它。但是,我会像这样尝试您的代码:

$Event = Get-EventLog -LogName Application -ComputerName $ComputerName -Source "Directory Synchronization" -Newest 1000 |
  Where-Object Message -match "Scheduler::StartSyncCycle : Started sync cycle\." |
  Sort-Object -Property TimeGenerated -Descending |
  Select-Object -First 1
if ($null -ne $Event) {
    "Started sync at $($Event.TimeGenerated)"
}
else {
    "Sync did not start."
}

我看到了几个错误。核心错误在这里:

Sort-Object Time | Select-Object -First 1
首先,虽然
Get EvenLog
的输出显示一个名为
Time
的列,但实际上没有名为
Time
的属性。您可以通过
Get EvenLog-LogName Application-latest 1 | Format List-property*
看到这一点。您可能需要两个属性:
TimeGenerated
timewrited
.off,我不确定哪个
时间
代表什么,因为我看到的每个事件都有相同的值

其次,对日期时间进行排序的默认顺序是升序。这意味着此代码将获取最新1000个事件中最早的事件。这不是您描述的代码所做的。您应该使用
-Descending
开关来获取最新的日志记录

接下来,您应该在使用
-source
参数调用
Get EventLog
时指定源,因为您知道确切的源。这将通过让命令为您执行过滤来提高性能

最后,此处的模式匹配包含特殊的正则表达式字符:

$_.Message -match "Scheduler::StartSyncCycle : Started sync cycle."
如果这是要匹配的文本字符串,则应改为匹配:

$_.Message -match "Scheduler::StartSyncCycle : Started sync cycle\."
因此,我将这样编写您的代码:

$Event = Get-EventLog -LogName Application -ComputerName $ComputerName -Source "Directory Synchronization" -Newest 1000 |
  Where-Object Message -match "Scheduler::StartSyncCycle : Started sync cycle\." |
  Sort-Object -Property TimeGenerated -Descending |
  Select-Object -First 1
if ($null -ne $Event) {
    "Started sync at $($Event.TimeGenerated)"
}
else {
    "Sync did not start."
}
我不太确定
Write Output
语句有什么问题,因为我无法在此处重新创建它。但是,我会像这样尝试您的代码:

$Event = Get-EventLog -LogName Application -ComputerName $ComputerName -Source "Directory Synchronization" -Newest 1000 |
  Where-Object Message -match "Scheduler::StartSyncCycle : Started sync cycle\." |
  Sort-Object -Property TimeGenerated -Descending |
  Select-Object -First 1
if ($null -ne $Event) {
    "Started sync at $($Event.TimeGenerated)"
}
else {
    "Sync did not start."
}

你不应该在
TimeGenerated
而不是
Time
上排序吗?是的,正如我在下面的评论中提到的那样,
排序确实不正确,因此被忽略了。但事实证明,它的默认排序方式是我需要的实际排序方式,cmdlet忽略
排序
实际上生成了正确的结果,这就是为什么我不认为它是一个问题。你不应该在
时间生成的
上排序而不是
时间
?是的,正如我在下面的评论中提到的,
排序确实不正确,因此被忽略。但结果表明,默认的排序方式是我需要的实际方式,对于cmdlet来说忽略
排序
实际上产生了正确的结果,这就是为什么我没有将其视为问题。感谢您的回复。我实际上发现了真正的问题,并打算将其作为答案发布,但我刚刚看到您用答案编辑了您的回复,所以我会将其提供给您。我还采纳了您关于其他错误的建议,并已修复它们(虽然它们是不影响最终结果的bug,所以修复它们并不能真正解决问题)。修复该问题的是
“在$($Event.TimeGenerated)开始同步”
,而不是原始的
“在$Event.TimeGenerated
。感谢您的回复。我实际上发现了真正的问题,并打算将其作为答案发布,但我刚刚看到您用答案编辑了您的回复,所以我会将其提供给您。我还采纳了您关于其他错误的建议