PowerShell: каков наилучший способ проверить, имеет ли текущий пользователь разрешение на перезапись файла в PowerShell?

TL; DR

в начале моего скрипта Я хотел бы проверить, является ли файл (заданный в качестве параметра) перезаписываемым, и выйти, если у текущего пользователя нет разрешения на это.
(Например, если пользователю или группе, к которой он принадлежит, было отказано в доступе к файлу.)

причина: в скрипте я обрабатываю некоторые данные (что требует времени), и в конце, я записывать результаты в файл, но это будет немного расстраивает, что весь скрипт работает правильно, но в конце оказывается, что файл не доступен для записи (что я мог бы проверить в начале).


что я пробовал

это правильный способ проверить, является ли :

$Outfile = "w:Tempnon-writable-file.txt"                # (normally I get this as a parameter)
$OutFileExists = Test-Path -Path $Outfile -PathType Leaf

конечно, $OutfileExists будет равна True если файл существует.

но я хотел бы проверить, является ли этот файл для записи - теперь это не так (я изменил настройки безопасности, чтобы иметь возможность проверить его):

Everyone - denied from writing

Итак, если я попробую это:

(Get-Acl $Outfile).Access

Я получаю этот выход:

FileSystemRights  : Write
AccessControlType : Deny
IdentityReference : Everyone
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : Everyone
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : DOESNTMATTERPete
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

(Я также мог бы отфильтровать этот результат.)
Хорошо, теперь я знаю, что у группы Everyone нет доступа к записи.
Но я до сих пор не знаю, как элегантно проверить перезаписываемость этого файла.

2 ответов


я использовал этот:

Try { [io.file]::OpenWrite($outfile).close() }
 Catch { Write-Warning "Unable to write to output file $outputfile" }

он попытается открыть файл для доступа на запись, а затем немедленно закрыть его (фактически ничего не записывая в файл). Если он не может открыть файл по какой-либо причине, он запустит блок Catch, и вы можете выполнить обработку ошибок там.


вы можете попытаться быстро записать (добавить) в файл, например

"" | Out-File 'w:\Temp\non-writable-file.txt' -Append

там, где нет разрешений на запись, вы получите сообщение об ошибке:

Out-File: доступ к пути 'w:\Temp\non-writable-file - ... txt ' отказано.
...
+ CategoryInfo: OpenError: (:) [Out-File], UnauthorizedAccessException
+ FullyQualifiedErrorId: FileOpenFailure, Microsoft.В PowerShell.Команды.OutFileCommand

вы можете поймать и завершить эту ошибку, в случае, если существует разрешение на запись - вы только что добавили новую строку в файл.