【发布时间】:2013-08-11 12:34:21
【问题描述】:
我编写了一个 Powershell v3 脚本来列出我们文件服务器上用户拥有的所有文件。在我停止之前它运行了 3 个小时。它必须经过 619,238 个文件和 57,452 个文件夹 (517 GB)。这应该采取什么数量级?有没有办法提高速度?
我尝试使用管道来执行此操作,但没有得到任何工作。
它在运行 Windows 2009 R2 SP1 且内存为 4GB 的 Vmware 虚拟机上运行。当我运行它时,它使用了大约 60% 的 CPU。
这里是我写的代码。我对 Powershell 很陌生,但我对 Perl 有很多经验。我的同事说要写一个bat文件。
<#
.SYNOPSIS
C:\ams\psscripts\list-files.ps1
.DESCRIPTION
List all the files that a given user owns
.PARAMETER none
username: user
logfile: path to log file. This is optional. If omitted the the log file is created "u:\scratch\<$username>-files.txt
.EXAMPLE
C:\ams\psscripts\list-files.ps1 plo
Example: C:\ams\psscripts\list-files.ps1 plo u:\scratch\log.txt
#>
param (
[string]$username,
[string]$logfile
)
# Load modules
Set-ExecutionPolicy Unrestricted
Import-Module ActiveDirectory
Add-PSSnapin Quest.ActiveRoles.ADManagement
function printHelp {
Write-Host "This script will find all the files owned by a user. It scans \\dfs\groups"
Write-Host "C:\ams\psscripts\list-files.ps1 user logfile (optional)"
Write-Host "Example: C:\ams\psscripts\list-files.ps1 plo"
Write-Host "Example: C:\ams\psscripts\list-files.ps1 plo u:\scratch\log.txt"
}
if ($logfile -eq "") {
$logfile = "u:\scratch\" + $username + "-files.txt"
Write-Host "Setting log file to $logfile"
}
# you must use a UNC path
[String]$path = "\\dfs\u$\groups"
[String]$AD_username = "AMS\" + $username
# check that we have a valid AD user
if (!(Get-QADUser $AD_username)){
Write-Host "ERROR: Not a valid AD User: $AD_username"
Exit 0
}
Write-Output "Listing all files owned by $username from $path" | Out-File -FilePath $logfile
Write-Host "Listing all files owned by $username from $path"
$d = Get-Date
Write-Output $d | Out-File -FilePath $logfile -Append
$files = Get-ChildItem $path -Recurse
Foreach ($file in $files)
{
$f = Get-Acl $file.FullName
$d = [string]::Compare($file.FullName, $username, $True)
if (($f.Owner -eq $username) -or ($f.Owner -eq $AD_username))
{
Write-Host "$file.FullName"
Write-Output $file.FullName | Out-File -FilePath $logfile -Append
}
}
Write-Host "Completed"
exit 0
我要做的下一步是修改上面的脚本以查找给定用户拥有的文件并将它们更改为他们的经理。
这是我找到的更改所有者的脚本。它将处于遍历文件系统的循环中。这是一个好方法吗?
$username=”dnp”
$domain=”ams”
$ID = new-object System.Security.Principal.NTAccount($domain, $username)
# file to change owner. must be UNC path
$path = "\\dfs\c$\ams\psscripts\test.txt"
write-host $path
$acl = get-acl $path
$acl.SetOwner($ID)
set-acl -path $path -aclObject $acl
谢谢, 丹
【问题讨论】:
标签: file loops powershell ownership