Test-Path / System.IO.Directory::Exists 未按预期工作
Posted
技术标签:
【中文标题】Test-Path / System.IO.Directory::Exists 未按预期工作【英文标题】:Test-Path / System.IO.Directory::Exists not working as expected 【发布时间】:2011-04-12 09:15:23 【问题描述】:我在使用 Powershell CmdLet 测试路径时遇到问题。
我在服务器上创建了一个共享 (\\Servername\MyShare$),它允许一组用户只创建一个文件并附加数据,而其他用户只能读取和删除这些文件。第一组不允许做任何其他事情,包括 Read-Permissions、Read-Attributes 等。
如果我作为“仅删除文件”组的成员对此文件夹执行测试路径,则返回 false。甚至 [System.IO.Directory]::Exists()
也返回 false。
我正在寻找一种无需读取权限或读取属性权限即可测试目录是否存在的方法。有什么想法吗?
这是这两种方法的正确行为吗?
问候, 团购
【问题讨论】:
查看您实际使用的 PowerShell 代码会有所帮助。 @beefarino 代码非常简单:Test-Path "\\server\Share$"
我什至尝试过,结果相同:[System.IO.Directory]::Exists("\\server\Share$")
都返回 false,而 Share 确实存在,但我不允许访问它,这不是(在我看来)使用两种方法都返回 False 的原因。
【参考方案1】:
好吧,如果没有人愿意冒险......
这是一个解决方案:
我不允许访问目录.\f1\f2
并且.\f1\f3
不存在。
PS C:\Silogix> Get-ChildItem .\f1\f2 -ErrorAction silentlycontinue
PS C:\Silogix> $Error[0].exception
L'accès au chemin d'accès 'C:\Silogix\f1\f2' est refusé.
PS C:\Temp\Temp> $Error[0].exception.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True UnauthorizedAccessException System.SystemException
PS C:\Silogix> Get-ChildItem .\f1\f3 -ErrorAction silentlycontinue
PS C:\Silogix> $Error[0].exception.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ItemNotFoundException
因此,如果您在Get-Item
之后测试$Error[0].exception.gettype()
,您就可以理解为什么它无法访问,以及它是否存在。您可以将其称为“拼凑”,但这也是一种解决方案。对不起,示例中的法语。
【讨论】:
感谢您的代码。我想出了一个类似的解决方案:try gc "\\server\Share$" -erroraction Stop catch [System.SystemException] if ($_.Exception.gettype() -eq [System.UnauthorizedAccessException]) #access is denied
有人会认为这种行为(回答目录不存在,尽管它确实存在)是一个错误吗?
不是一个错误,Test-Path
的 语义 并不是记录在案的那个。其实Test-Path
的意思是这个项目是否存在并且可以读取。以上是关于Test-Path / System.IO.Directory::Exists 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章