PowerShell:检查当前用户是否有权在PowerShell中覆盖文件的最佳方法是什么?

Sk8*_*ter 11 powershell file-io powershell-4.0

TL; DR

在我的脚本开头,我想检查一个文件(作为参数给出)是否可以覆盖,如果当前用户没有这样做的权限则退出.
(例如,如果用户或他/她所属的组被拒绝访问文件.)

原因是:在脚本中,我正在处理一些数据(这需要时间),最后,我将结果写入文件,但是整个脚本正确运行会有点令人沮丧,但最后,事实证明该文件是不可写的(我可以在开始时检查).


我尝试了什么

这是测试文件是否存在的正确方法:

$Outfile = "w:\Temp\non-writable-file.txt"                # (normally I get this as a parameter)
$OutFileExists = Test-Path -Path $Outfile -PathType Leaf
Run Code Online (Sandbox Code Playgroud)

当然,如果文件存在则$OutfileExists等于True.

但我想检查这个文件是否可写 - 现在不是(我自己更改了安全设置以便能够测试它):

每个人 - 都被拒绝写作

所以,如果我试试这个:

(Get-Acl $Outfile).Access
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

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 : DOESNTMATTER\Pete
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None
Run Code Online (Sandbox Code Playgroud)

(我也可以过滤掉这个结果.)
好的,现在我知道Everyone组没有写访问权限.
但我仍然不知道如何优雅地检查这个文件的可覆盖性.

mjo*_*nor 19

我用过这个:

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

它将尝试打开文件进行写访问,然后立即将其关闭(不实际向文件写入任何内容).如果因任何原因无法打开文件,它将运行Catch块,您可以在那里进行错误处理.

  • 很好的答案。对于那些想知道的人来说,除了不向文件写入任何内容之外,这也不会删除文件,也不会修改其“LastWriteTime”。 (3认同)