@ECHO OFF
REM ############################################################################
REM # Get administrative privileges. #
REM ############################################################################
CACLS "%SYSTEMROOT%\System32\config\SYSTEM" >NUL 2>&1
IF "%ERRORLEVEL%" NEQ "0" (GOTO Elevate) ELSE (GOTO Run)
:Elevate
SET UAC_SCRIPT="%TEMP%\%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%.VBS"
ECHO Set UAC = CreateObject("Shell.Application") > %UAC_SCRIPT%
ECHO UAC.ShellExecute "%~dpnx0", "%*", "%~dp0", "runas", 1 >> %UAC_SCRIPT%
CSCRIPT %UAC_SCRIPT%
DEL /F /Q %UAC_SCRIPT%
EXIT /B
:Run
REM ############################################################################
REM # Reset all filesystem timestamps to 01/01/1980 00:00. #
REM ############################################################################
SET RTS_SCRIPT="%TEMP%\%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%.PS1"
ECHO ################################################################################ >> %RTS_SCRIPT%
ECHO # Resets all the timestamps in a file or folder. # >> %RTS_SCRIPT%
ECHO ################################################################################ >> %RTS_SCRIPT%
ECHO # >> %RTS_SCRIPT%
ECHO # Get all files/folders recursively. >> %RTS_SCRIPT%
ECHO function GetFiles($path = "."){ >> %RTS_SCRIPT%
ECHO foreach($node in Get-ChildItem $path -force){ >> %RTS_SCRIPT%
ECHO ResetTimestamps $node.FullName >> %RTS_SCRIPT%
ECHO if(Test-Path $node.FullName -PathType Container){ >> %RTS_SCRIPT%
ECHO GetFiles $node.FullName >> %RTS_SCRIPT%
ECHO } >> %RTS_SCRIPT%
ECHO } >> %RTS_SCRIPT%
ECHO } >> %RTS_SCRIPT%
ECHO # >> %RTS_SCRIPT%
ECHO # Reset the timestamp of a file/folder. Windows epoch is January 1st, 1980 00:00 >> %RTS_SCRIPT%
ECHO function ResetTimestamps($node){ >> %RTS_SCRIPT%
ECHO if(-Not ($node)){ $node = $pwd } >> %RTS_SCRIPT%
ECHO $epoch = $(Get-Date "01/01/1980 00:00:00").ToUniversalTime() >> %RTS_SCRIPT%
ECHO try{ >> %RTS_SCRIPT%
ECHO $file = $(Get-Item $node -force) >> %RTS_SCRIPT%
ECHO if($file.isReadOnly){ >> %RTS_SCRIPT%
ECHO Set-ItemProperty $node -name IsReadOnly -value $false >> %RTS_SCRIPT%
ECHO $file.creationtime = $epoch >> %RTS_SCRIPT%
ECHO $file.lastaccesstime = $epoch >> %RTS_SCRIPT%
ECHO $file.lastwritetime = $epoch >> %RTS_SCRIPT%
ECHO Set-ItemProperty $node -name IsReadOnly -value $true >> %RTS_SCRIPT%
ECHO }else{ >> %RTS_SCRIPT%
ECHO $file.creationtime = $epoch >> %RTS_SCRIPT%
ECHO $file.lastaccesstime = $epoch >> %RTS_SCRIPT%
ECHO $file.lastwritetime = $epoch >> %RTS_SCRIPT%
ECHO } >> %RTS_SCRIPT%
ECHO Write-Output "Cleared timestamp of: $($node)" >> %RTS_SCRIPT%
ECHO }catch{ >> %RTS_SCRIPT%
ECHO Write-Output "Unable to clear timestamp of: $($node)" >> %RTS_SCRIPT%
ECHO } >> %RTS_SCRIPT%
ECHO } >> %RTS_SCRIPT%
ECHO # >> %RTS_SCRIPT%
ECHO # Reset the timestamp of a file/folder and its children. >> %RTS_SCRIPT%
ECHO ResetTimestamps $args[0] >> %RTS_SCRIPT%
ECHO GetFiles $args[0] >> %RTS_SCRIPT%
ECHO Erasing timestamps...
:ArgumentLoop
POWERSHELL %RTS_SCRIPT% %1
SHIFT
IF NOT "%1" == "" GOTO ArgumentLoop
DEL /F /Q %RTS_SCRIPT%
ECHO Finished!