Powershell get eventlog每次运行都返回不同的结果
我有一个在远程服务器上运行目录同步工具(用于azure AD)的功能。 问题始于cmdlet,该cmdlet假定返回同步开始的时间 它首先在远程服务器上运行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
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
。感谢您的回复。我实际上发现了真正的问题,并打算将其作为答案发布,但我刚刚看到您用答案编辑了您的回复,所以我会将其提供给您。我还采纳了您关于其他错误的建议