通过WSL修改Windows只读文件的访问时间

时间:2018-12-30 17:55:05

标签: windows powershell windows-subsystem-for-linux

我有一个只读文件,例如samp.txt,并且在PowerShell上运行以下命令:

> $file = Get-Item .\samp.txt
> $file.LastAccessTime = (get-date)

我们得到:"Access to the path 'G:\Study_Material\Coding\samp.txt' is denied."

现在,在继续之前,请查看访问时间: > $file.LastAccessTime

Sunday, December 30, 2018 11:02:49 PM

现在,我们打开WSL并执行:$ touch samp.txt

返回PowerShell,我们进行以下操作:

> $file = Get-Item .\samp.txt
> $file.LastAccessTime

我们得到:

Sunday, December 30, 2018 11:19:16 PM

因此,它已被修改,没有提升的特权。

现在我的问题是:如何通过修改ReadOnly而不在$file.Attributes标记的情况下单独在PowerShell中模拟此操作。

1 个答案:

答案 0 :(得分:1)

处理ReadOnly文件时,不能简单地更改LastAccessTime。
(请参阅eryksun 的评论)。

为了使其能够在PowerShell中工作,您需要首先从文件属性中删除ReadOnly标志,进行更改并重置ReadOnly标志,如下所示:

$file = Get-Item .\samp.txt -Force

# test if the ReadOnly flag on the file is set
if ($file.Attributes -band 1) {
    # remove the ReadOnly flag from the file. (FILE_ATTRIBUTE_READONLY = 1)
    $file.Attributes = $file.Attributes -bxor 1
    # or use: $file | Set-ItemProperty -Name IsReadOnly -Value $false

    $file.LastAccessTime = (Get-Date)

    # reset the ReadOnly flag
    $file.Attributes = $file.Attributes -bxor 1
    # or use: $file | Set-ItemProperty -Name IsReadOnly -Value $true
}
else {
    # the file is not ReadOnly, so just do the 'touch' on the LastAccessTime
    $file.LastAccessTime = (Get-Date)
}

您可以阅读有关文件属性及其数值here

的所有信息