从共享信息中获取信息以在新域中创建文件夹
Get Information from Shares with Information to create the folders in a new Domain
所以我正在帮助将数据迁移到购买第一个数据的另一家公司,为此我必须在 .csv 文件中导出文件夹名、用户名和权限。
我有一个工作的 Skript,但它似乎花费了很长时间。它与一些没有太多文件夹的共享一起工作,但现在我已经 运行 进入脚本 运行 宁多个小时(100.000+ 文件夹)。
从较小的股份我知道它给了我正确的信息,但它需要很长时间才能获得剩余的股份数量。
$FolderPath = dir -Directory -LiteralPath "\?\UNC\Server\Share" -Recurse -Force
$Report = @()
Foreach ($Folder in $FolderPath) {
$Acl = Get-Acl -Path $Folder.FullName
foreach ($Access in $acl.Access){
$Properties = [ordered]@{
'FolderName'=$Folder.FullName
'AD Group or User'=$Access.IdentityReference
'Permissions'=$Access.FileSystemRights
'Inherited'=$Access.IsInherited
}
$Report += New-Object -TypeName PSObject -Property $Properties
}
}
$Report | Export-Csv -path "C:\Filepath\export.csv" -Delimiter ";" -Encoding UTF8
我是不是错过了一件简单的事情,为什么它花了这么长时间,还是我完全搞砸了?
我就是没找到。
非常感谢任何帮助
提前致谢
迈克尔
如评论所述,通过使用 +=
添加新项目来构建 $Report
数组是一种非常耗时和内存的方式。
让 PowerShell 像下面这样进行收集要快得多。
此外,Get-ChildItem(别名 dir
)可能会很慢,尤其是在处理许多子文件夹时,因此使用 RoboCopy 可能是一个更快的替代方法。
# get the list of directory full path names
# Get-ChildItem can be slow, so maybe try Robocopy as alternative
# $Folders = (Get-ChildItem -Directory -LiteralPath "\?\UNC\Server\Share" -Recurse -Force).FullName
$Folders = (robocopy "\Server\Share" NULL /L /E /NP /NFL /XJ /NC /NJH /NJS /R:0 /W:0) -replace '^\s*\d*\s*'
$Report = foreach ($Folder in $Folders) {
$Acl = Get-Acl -Path $Folder
foreach ($Access in $Acl.Access){
[PsCustomObject]@{
'FolderName' = $Folder
'AD Group or User' = $Access.IdentityReference
'Permissions' = $Access.FileSystemRights.ToString()
'Inherited' = $Access.IsInherited
}
}
}
$Report | Export-Csv -Path "C:\Filepath\export.csv" -Delimiter ";" -Encoding UTF8
所以我正在帮助将数据迁移到购买第一个数据的另一家公司,为此我必须在 .csv 文件中导出文件夹名、用户名和权限。 我有一个工作的 Skript,但它似乎花费了很长时间。它与一些没有太多文件夹的共享一起工作,但现在我已经 运行 进入脚本 运行 宁多个小时(100.000+ 文件夹)。 从较小的股份我知道它给了我正确的信息,但它需要很长时间才能获得剩余的股份数量。
$FolderPath = dir -Directory -LiteralPath "\?\UNC\Server\Share" -Recurse -Force
$Report = @()
Foreach ($Folder in $FolderPath) {
$Acl = Get-Acl -Path $Folder.FullName
foreach ($Access in $acl.Access){
$Properties = [ordered]@{
'FolderName'=$Folder.FullName
'AD Group or User'=$Access.IdentityReference
'Permissions'=$Access.FileSystemRights
'Inherited'=$Access.IsInherited
}
$Report += New-Object -TypeName PSObject -Property $Properties
}
}
$Report | Export-Csv -path "C:\Filepath\export.csv" -Delimiter ";" -Encoding UTF8
我是不是错过了一件简单的事情,为什么它花了这么长时间,还是我完全搞砸了? 我就是没找到。
非常感谢任何帮助 提前致谢
迈克尔
如评论所述,通过使用 +=
添加新项目来构建 $Report
数组是一种非常耗时和内存的方式。
让 PowerShell 像下面这样进行收集要快得多。
此外,Get-ChildItem(别名 dir
)可能会很慢,尤其是在处理许多子文件夹时,因此使用 RoboCopy 可能是一个更快的替代方法。
# get the list of directory full path names
# Get-ChildItem can be slow, so maybe try Robocopy as alternative
# $Folders = (Get-ChildItem -Directory -LiteralPath "\?\UNC\Server\Share" -Recurse -Force).FullName
$Folders = (robocopy "\Server\Share" NULL /L /E /NP /NFL /XJ /NC /NJH /NJS /R:0 /W:0) -replace '^\s*\d*\s*'
$Report = foreach ($Folder in $Folders) {
$Acl = Get-Acl -Path $Folder
foreach ($Access in $Acl.Access){
[PsCustomObject]@{
'FolderName' = $Folder
'AD Group or User' = $Access.IdentityReference
'Permissions' = $Access.FileSystemRights.ToString()
'Inherited' = $Access.IsInherited
}
}
}
$Report | Export-Csv -Path "C:\Filepath\export.csv" -Delimiter ";" -Encoding UTF8