我的下面的脚本对大多数文件和文件夹都有效,但对带有"[""]"的文件和文件夹无效
#Set variables
$path = $args[0]
$filename = $args[1]
$date = Get-Date
#Place Headers on out-put file
$list = "Permissions for directories in: $Path"
$list | format-table | Out-File "C:\Powershell\Results\$filename"
$datelist = "Report Run Time: $date"
$datelist | format-table | Out-File -append "C:\Powershell\Results\$filename"
$spacelist = " "
$spacelist | format-table | Out-File -append "C:\Powershell\Results\$filename"
#Populate Folders Array
[Array] $folders = Get-ChildItem -path $path -force -recurse
#Process data in array
ForEach ($folder in [Array] $folders)
{
#Convert Powershell Provider Folder Path to standard folder path
$PSPath = (Convert-Path $folder.pspath)
$list = ("Path: $PSPath")
$list | format-table | Out-File -append "C:\Powershell\Results\$filename"
Get-Acl -path $PSPath | Format-List -property AccessToString | Out-File -append "C:\Powershell\Results\$filename"
"-----------------------" | Out-File -FilePath "C:\Powershell\Results\$filename" -Append
} #end ForEach
我不确定这是否能做到100%相同的事情,但我使用了下面的单行代码。
get-childitem "C:\windows\temp" -recurse | get-acl | Format-List | Out-File "c:\temp\output.txt"
问题在于 Convert-Path
cmdlet试图 "解释 "路径,包括方括号,因为它把方括号解释为通配符。相反,你想让它使用真实的路径。
修改这一行。
$PSPath = (Convert-Path $folder.pspath)
改成这样
$PSPath = (Convert-Path -LiteralPath $folder.pspath)
另外,把这行改成 Get-Acl -path
到 Get-Acl -LiteralPath
所以它看起来像这样。
Get-Acl -LiteralPath $PSPath | Format-List -property AccessToString | Out-File -append "C:\Powershell\Results\$filename"
如果你没有PowerShell 3.0版本(Get-Acl增加了对-LiteralPath的支持),你可以使用Get-Item作为一个变通方法。
$item = Get-Item -LiteralPath $PSPath
$item.GetAccessControl() | Format-List -property AccessToString | Out-File -append "C:\Powershell\Results\$filename"
更多信息请看这篇文章: LiteralPaths
get-acl
支持 literalpath
直到Powershell V3才被加入。
如果你还在使用早期的版本,并且由于某种原因不能升级到V3,那么可以选择@HAL9256的建议,用 convert-path
但对于 get-acl
部分,这应该可以代替。
((Get-Item -LiteralPath $PSPath).GetAccessControl()).AccessToString | Out-File -append "C:\Powershell\Results\$filename"