1

假设我有一个名为“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

我在由dir -rec -name. 因为我不知道通配符会出现在哪里,所以我必须编写代码来转义它们(并将路径转换为 ​​UNC 格式)。这有点笨拙。有没有更简单的方法?顺便说一句,我正在使用 PowerShell v1.0。

意见:也许这是在 PowerShell 设计中进行权衡的不可避免的结果,但不幸的是,每个命令都需要一个忽略通配符的选项,而不是在 shell 本身中具有该功能,以便所有命令自动受益。

4

1 回答 1

0

这个问题不时困扰着我,当您在没有 -LiteralPath 支持的情况下点击 cmdlet 时,它很糟糕。在这种情况下,另一种解决方法是使用文件的短名称。PowerShell 社区扩展通过Get-ShortPath cmdlet 支持这一点,例如:

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...
于 2010-02-25T21:18:21.610 回答