Изменить время доступа Windows только для чтения файла через WSL - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть файл только для чтения, скажем 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

Таким образом, он был изменен без повышенных привилегий.

Теперь мой вопрос: как можно имитировать это действие только в PowerShell без удаления тега ReadOnlyизменив $file.Attributes.

1 Ответ

0 голосов
/ 31 декабря 2018

При работе с файлами 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)
}

Вы можете прочитать все об атрибутах файла и их числовых значениях здесь

...