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