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
если файл существует.
но я хотел бы проверить, является ли этот файл для записи - теперь это не так (я изменил настройки безопасности, чтобы иметь возможность проверить его):
Итак, если я попробую это:
(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
вы можете поймать и завершить эту ошибку, в случае, если существует разрешение на запись - вы только что добавили новую строку в файл.