Как использовать командлет PowerShell get-acl, если имя файла содержит скобки? - PullRequest
1 голос
/ 25 февраля 2010

Предположим, у меня есть файл с именем "test [1] .txt". Обе эти команды не выводят:

PS C:\Temp> dir test[1].txt
PS C:\Temp> get-acl test[1].txt
PS C:\Temp>


Хорошая новость заключается в том, что команда dir имеет переключатель -LiteralPath, который говорит ей не интерпретировать символы как символы подстановки:

PS C:\Temp> dir -LiteralPath test[1].txt


    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Temp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2/25/2010   9:57 AM          5 test[1].txt


Плохая новость в том, что у get-acl нет такого переключателя. Похоже, это известная проблема .

Единственный обходной путь, который я мог бы найти после наблюдения в этом отчете, заключается в использовании путей UNC таким несколько неловким образом:

PS C:\Temp> get-acl \\mymachine\C$\temp\test[[]1[]].txt


    Directory: Microsoft.PowerShell.Core\FileSystem::\\mymachine\C$\temp


Path                                    Owner
----                                    -----
test[1].txt                             MYDOMAIN\myname

Я использую get-acl в конвейере, питаемом dir -rec -name. Поскольку я не знаю, где появятся символы подстановки, мне придется написать код, чтобы избежать их (и преобразовать пути в формат UNC). Это немного глупо. Есть ли более простой способ? Кстати, я использую PowerShell v1.0.

Мнение: Возможно, это неизбежное следствие компромиссов, допущенных при разработке PowerShell, но, к сожалению, каждой команде нужна опция игнорирования подстановочных знаков, а не наличие этой функциональности в самой оболочке, так что все команды автоматически получают выгоду .

1 Ответ

0 голосов
/ 26 февраля 2010

Эта проблема время от времени меня раздражала, и она отстой, когда вы нажимаете командлет без поддержки -LiteralPath.В этом случае другой обходной путь должен использовать короткое имя файла. Расширения сообщества PowerShell поддерживают это с помощью командлета Get-ShortPath, например:

PS> Get-ShortPath '.\foo`[bar`].txt' | Get-Acl -Path {$_}


    Directory: Microsoft.PowerShell.Core\FileSystem::C:\User
    s\Keith


Path                 Owner               Access
----                 -----               ------
FOO_BA~1.TXT         Keith-Laptop-PC\... NT AUTHORITY\SYS...
...