scripts/Set-FileTime.ps1

function Set-FileTime {

    [CmdletBinding(
        SupportsShouldProcess,
        ConfirmImpact = ([System.Management.Automation.ConfirmImpact]::Medium))]

    [OutputType([System.IO.FileSystemInfo])]

    param(
        [Parameter(Mandatory, Position = 0, ValueFromPipelineByPropertyName)]
        [Alias('PSPath')]
        [Alias('FullName')]
        [string[]] $Path,

        [datetime] $CreationTime,

        [datetime] $LastWriteTime,

        [datetime] $LastAccessTime,

        [switch] $AsUtc,

        [switch] $PassThru,

        [switch] $Force)

    begin {
        if (!$CreationTime -and !$LastWriteTime -and !$LastAccessTime) {
            throw "You must specify at least one of parameters CreationTime, LastWriteTime or LastAccessTime."
        }

        function TrySetFileTimes {

            param(
                [Parameter(Mandatory)]
                [System.IO.FileSystemInfo] $Item,

                [switch] $AsUtc,

                [Parameter(Mandatory)]
                [scriptblock] $Script)

            $item.Refresh()

            if ($AsUtc) {
                $originalCreationTime = $item.CreationTimeUtc
                $originalLastWriteTime = $item.LastWriteTimeUtc
                $originalLastAccessTime = $item.LastAccessTimeUtc
            }
            else {
                $originalCreationTime = $item.CreationTime
                $originalLastWriteTime = $item.LastWriteTime
                $originalLastAccessTime = $item.LastAccessTime
            }

            try {
                & $script
            }
            catch {
                if ($AsUtc) {
                    $item.CreationTimeUtc = $originalCreationTime
                    $item.LastWriteTimeUtc = $originalLastWriteTime
                    $item.LastAccessTimeUtc = $originalLastAccessTime
                }
                else {
                    $item.CreationTime = $originalCreationTime
                    $item.LastWriteTime = $originalLastWriteTime
                    $item.LastAccessTime = $originalLastAccessTime
                }

                throw
            }
            finally {
                $item.Refresh()
            }
        }
    }

    process {
        foreach ($pathItem in @($Path)) {

            if (!$Force) {
                if (!$PSCmdlet.ShouldProcess($pathItem, "Change file time")) {
                    continue
                }
            }

            $provider = $null
            $resolvedPath = $PSCmdlet.GetResolvedProviderPathFromPSPath($pathItem, [ref] $provider)

            $items = Get-Item -LiteralPath $resolvedPath

            foreach ($item in @($items)) {

                TrySetFileTimes -Item $item -AsUtc:$AsUtc -Script {

                    if ($CreationTime) {
                        if ($IsWindows) {
                            if ($AsUtc) {
                                $item.CreationTimeUtc = $CreationTime
                            }
                            else {
                                $item.CreationTime = $CreationTime
                            }
                        }
                        else {
                            Write-Warning "CreationTime(Utc) is ignored on non-Windows operating systems."
                        }
                    }

                    if ($LastWriteTime) {
                        if ($AsUtc) {
                            $item.LastWriteTimeUtc = $LastWriteTime
                        }
                        else {
                            $item.LastWriteTime = $LastWriteTime
                        }
                    }

                    if ($LastAccessTime) {
                        if ($AsUtc) {
                            $item.LastAccessTimeUtc = $LastAccessTime
                        }
                        else {
                            $item.LastAccessTime = $LastAccessTime
                        }
                    }
                }

                if ($PassThru) {
                    Write-Output -InputObject $item -NoEnumerate
                }
            }
        }
    }
}