У меня есть несколько старых скриптов .ps1, созданных несколько лет назад, и они просто стоят в очереди, похоже, они не выполнялись в последнее время.
Есть ли способ узнать, когда их в последний раз казнили?
Спасибо!
🤔 А знаете ли вы, что...
С PowerShell можно создавать расписания задач и автоматически выполнять скрипты в определенное время.
Вы могли бы попробовать, если бы в командной строке cmd была такая информация:
dir /TA "path\to\your\script.ps1"
Предполагая, что у вас включено ведение журнала PowerShell ScriptBlock, вы можете проверить выполнение данного сценария, включив путь в свой фильтр при использовании Get-WinEvent -FilterXPath
:
Get-ChildItem -Path path\to\old\files -Filter *.ps1 |ForEach-Object {
$file = $_
$xPathFilter = '*[EventData[Data[@Name = "Path"] = "{0}"]]' -f $file.FullName
$lastExecutionEvent = Get-WinEvent -FilterXPath $xPathFilter -LogName Microsoft-Windows-PowerShell/Operational -MaxEvents 1 -ErrorAction SilentlyContinue
if ($lastExecutionEvent) {
Write-Host "$($file.Name) was last executed at $($lastExecutionEvent.TimeCreated)"
}
else {
Write-Warning "Unable to locate execution of $($file.Name) in event logs"
}
}
Теперь «не появляться в журналах» — это не то же самое, что «никогда не происходило», это просто означает — чтобы проверить самое старое событие в журнале (таким образом устанавливая временное окно, для которого у вас есть журналы), вызовите следующую команду и обратите внимание значение TimeCreated
:
Get-WinEvent -LogName Microsoft-Windows-PowerShell/Operational -MaxEvents 1 -Oldest
Полезный ответ Матиаса, вероятно, является наиболее надежным решением при следующих ограничениях:
Для этого необходимо, чтобы ведение журнала блоков сценариев было включено до последнего вызова сценария.
Оно ограничено датой последней очистки соответствующего журнала событий.
Как упоминает yacc в комментарии, простым, но ненадежным альтернативным решением является проверка временной метки последнего доступа к файлу сценария.[1]
(Get-Item C:\path\to\your\script.ps1).LastAccessTime
Предостережение заключается в том, что в этой временной метке записывается любой доступ к содержимому целевого .ps1
файла, а не только выполнение файла.
То есть такие действия, как открытие файла в редакторе или перечисление его содержимого с помощью Get-Content
, также обновляют метку времени, что приводит к ложным срабатываниям.
[1] Note that not all file-systems record last-accessed timestamps, and on Windows / NTFS file-systems, where such timestamps are maintained, they may not be up to date - see this SU answer.