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 } } } } } |