2012-02-23 48 views
1

我有一個目錄,其名稱中包含方括號,使得在Powershell中處理它有點問題。我見過有關獲取目錄ACL的建議,應該使用GetAccessControl()方法DirectoryInfo而不是使用cmdlet Get-Acl使用Powershell的目錄上的GetAccessControl()返回沒有數據

不幸的是,使用GetAccessControl()不會返回任何目錄的任何結果。看到我的腳本下面。

$filename = "C:\somefolder" 
$di = get-item $filename 
$di | get-acl # this returns the correct ACL data as expected 
$di.GetAccessControl() # this shows an empty ACL (see below output) 

我的意思空的ACL是這樣的:

Path  Owner  Access 
----  -----  ------ 

我發現得到$迪的一個實例,用含有方括號的目錄名的唯一方法是逃避支架採用雙背蜱

$filename = "C:\some``[folder``]withsquarebrackets" 

如果我這樣做,然後執行$di = get-item $filename$di表明,它含有對指定文件夾的詳細信息。

$di | get-acl  # does nothing, doesn't even show an empty ACL 
$di.GetAccessControl() # shows an empty ACL as seen above 

任何人都可以解釋我是如何能夠可靠地獲得ACL對文件夾的枚舉,其中一些包含他們的名字方括號:但在這種情況下,不同的結果由剩餘的兩行返回?

更新2012-02-23 16:31Z 後安迪·阿里斯門迪報告說,它爲他工作,我建立了GetAccessControl()似乎對PowerShell的2.做工精細感染的機器上運行PowerShell的1.任何想法如何使用Powershell 1解決這個問題?

回答

0

雖然Path屬性爲空,但它似乎對我有用。

$f = Get-Item 'C:\some `[folder`]' 
$f.GetAccessControl() 
$f.GetAccessControl().Access 
+0

有趣。我在另一臺機器上嘗試過它,它工作。原始機器運行Powershell v1,並且運行Powershell v2。在兩臺機器上,如果文件名包含方括號,則將$ f傳送給Get-Acl cmdlet不會返回結果。 – 2012-02-23 16:25:09

+0

雖然...在文件名中的單個back-tick會產生相同的結果,但我明顯錯誤地指出了雙重返回。 – 2012-02-23 16:43:01

+0

@RichardFawcett查看這個[bug](https://connect.microsoft.com/PowerShell/feedback/details/544237/filename-bracket-problem)報告。有人發佈了一個解決方法,我將它添加到我的答案中,試試看。 – 2012-02-26 09:22:57

1

方括號問題是因爲方括號是「通配符」通配符。你能避免所有的轉義使用-LiteralPath參數:

$di = get-item -literalpath C:\some[folder]withsquarebrackets 
$di.getaccesscontrol() 

遺憾的是他們並沒有包括GET-ACL中的-literpath參數,所以你堅持做一開始的項目,然後用getaccesscontrol ()方法來獲取訪問列表。 Get-Acl在V3中有一個-literalpath參數。

+0

+1這確實有幫助。在我的情況下,無效路徑是由'FileSystemObject.GetFolder.SubFolders'返回的。所以我的劇本運行了幾分鐘,然後突然無故休息。另一個MS警告將它踢在後面。儘管通配符總是有很好的理由,但這條路由Windows已經返回,該腳本之前並不知道它。 – 2013-04-18 08:37:05

相關問題