开发者

How can I use PowerShell's get-acl cmdlet when a filename contains brackets?

开发者 https://www.devze.com 2022-12-21 10:36 出处:网络
Suppose I have a file named \"test[1].txt\".Both of these commands produce no output: PS C:\\Temp> dir test[1].txt

Suppose I have a file named "test[1].txt". Both of these commands produce no output:

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

The good news is that the dir command has a -LiteralPath switch that tells it not to interpret any characters as wildcards:

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

The bad news is that get-acl has no such switch. This appears to be a known issue.

The only workaround I could come up with, following an observation in that report, is to use UNC paths in this somewhat awkward way:

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


    Directory: Microsoft.PowerShell.Core\FileSystem::\\mymachin开发者_如何学编程e\C$\temp


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

I'm using get-acl in a pipeline fed by dir -rec -name. Because I don't know where the wildcards will appear, I'll have to write code to escape them (and convert the paths to UNC format). It's a bit kludgy. Is there a simpler way? I'm using PowerShell v1.0, by the way.

Opinion: Perhaps this is an unavoidable consequence of trade-offs made in the design of PowerShell, but it's unfortunate that every command needs an option to ignore wildcards, rather than having that functionality in the shell itself so that all commands automatically benefit.


This issue has bit me from time to time and it sucks when you hit a cmdlet without -LiteralPath support. In this case, another work-around is to use the short name of the file. The PowerShell Community Extensions supports this with the Get-ShortPath cmdlet e.g.:

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...
0

精彩评论

暂无评论...
验证码 换一张
取 消