Powershell – время последнего выполнения скрипта

У меня есть несколько старых скриптов .ps1, созданных несколько лет назад, и они просто стоят в очереди, похоже, они не выполнялись в последнее время.

Есть ли способ узнать, когда их в последний раз казнили?

Спасибо!

🤔 А знаете ли вы, что...
С PowerShell можно создавать расписания задач и автоматически выполнять скрипты в определенное время.


1
62
3

Ответы:

Вы могли бы попробовать, если бы в командной строке 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.