我在这个网站上找到了一个有用的powershell脚本,其中包含用于计算文件/文件夹大小的功能。
我使用它是因为大文件/文件夹的内存使用速度快且低。
问题是,当它遇到一个文件夹时,它无法访问我会收到控制台的输出,说访问被拒绝。
Exception calling "GetFiles" with "0" argument(s): "Access to the path 'c:usersadministratorAppDataLocalApplicati
n Data' is denied."
At line:4 char:37
+ foreach ($f in $dir.GetFiles <<<< ())
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
我知道,或者认为我需要使用 |Out-Null 来抑制错误,但仍然有脚本工作,但是尽管多次尝试,我还是无法弄清楚在哪里或如何执行此操作。
那么如果有人有任何想法,这里是脚本?
function Get-HugeDirStats ($directory) {
function go($dir, $stats)
{
foreach ($f in $dir.GetFiles())
{
$stats.Count++
$stats.Size += $f.Length
}
foreach ($d in $dir.GetDirectories())
{
go $d $stats
}
}
$statistics = New-Object PsObject -Property @{Count = 0; Size = [long]0 }
go (new-object IO.DirectoryInfo $directory) $statistics
$statistics
}
$stats = Get-HugeDirStats c:users
你从 DirectoryInfo 对象得到一个异常,所以你需要使用 try/catch:
function Get-HugeDirStats ($directory) {
function go($dir, $stats)
{
try {
foreach ($f in $dir.GetFiles())
{
$stats.Count++
$stats.Size += $f.Length
}
foreach ($d in $dir.GetDirectories())
{
go $d $stats
}
}
catch [Exception] {
# Do something here if you need to
}
}
$statistics = New-Object PsObject -Property @{Count = 0; Size = [long]0 }
go (new-object IO.DirectoryInfo $directory) $statistics
$statistics
}
如果从任何 powershell cmdlet 收到错误,可以使用 cmdlet 上的-ErrorAction SilentlyContinue
来防止打印到屏幕时出错。