Test-Path/System.IO.Directory::Exists не работает должным образом

У меня возникли проблемы с использованием Powershell CmdLet Test-Path.

Я создал общий ресурс на сервере (\\Servername\MyShare$), который позволяет одной группе пользователей просто создавать файл и добавлять данные, в то время как другие пользователи могут просто читать и удалять эти файлы. Первой группе не разрешено делать что-либо еще, включая разрешения на чтение, атрибуты чтения и так далее.

Если я выполню Test-Path для этой папки как члена группы «только перетаскивать файлы», он вернет false. Даже [System.IO.Directory]::Exists() возвращает false.

Я ищу способ проверить, существует ли каталог без необходимости иметь права на чтение или чтение атрибутов. Любые идеи?

Это правильное поведение этих двух методов?

С уважением, teamoo


person teamoo    schedule 12.04.2011    source источник
comment
Было бы полезно увидеть код PowerShell, который вы на самом деле используете.   -  person beefarino    schedule 13.04.2011
comment
@beefarino Код действительно прост: Test-Path "\\server\Share$" Я даже попробовал это с тем же результатом: [System.IO.Directory]::Exists("\\server\Share$") оба возвращают false, в то время как Share действительно существует, но мне не разрешен доступ к нему, что не является причиной (на мой взгляд) вернуть False обоими методами.   -  person teamoo    schedule 14.04.2011


Ответы (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

Итак, если вы протестируете $Error[0].exception.gettype() после Get-Item, вы сможете понять, почему он недоступен, так что, существует ли он или нет. Вы можете назвать это «бриколажем», но это также и решение. Извините за французский в примере.

person JPBlanc    schedule 13.04.2011
comment
Спасибо за ваш код. Я придумал похожее решение: try {gc "\\server\Share$" -erroraction Stop} catch [System.SystemException] {if ($_.Exception.gettype() -eq [System.UnauthorizedAccessException]) {#access is denied}} Может ли кто-нибудь считать такое поведение (ответ, что каталог не существует, хотя он существует) ошибкой? - person teamoo; 14.04.2011
comment
Это не ошибка, просто семантика Test-Path не та, которая задокументирована. На самом деле Test-Path означает, что этот элемент существует и может быть прочитан. - person JPBlanc; 14.04.2011