0

我想知道是否有更好的方法来编写这个脚本来收集图像尺寸和文件路径。该脚本适用于中小型目录,但我不肯定 100,000 多个文件/文件夹是可能的。

Measure-Command {

[Void][System.Reflection.Assembly]::LoadFile( "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll")

$path = "\\servername.corp.company.com\top_directory"

$data = Get-ChildItem -Recurse $path | % {
 $imageFile = [System.Drawing.Image]::FromFile($_.FullName) ;
 New-Object PSObject -Property @{
 name = $_.Name
 fullname = $_.Fullname
 width = $imageFile.Width
 height = $imageFile.Height
 length = $_.Length
 }
 }
 $data | Where-Object {$_.width -eq 500 -or $_.width -eq 250 -or $_.width -eq 1250  } |

Export-Csv \\servername.corp.company.com\top_directory\some_directory\log_file.csv -NoTypeInformation } 

我现在实际上并没有使用 Where-Object 过滤器。

使用 appx 在远程目录上运行上述脚本时。该脚本需要 20,000 个文件 + 文件夹 appx。26 分钟,在创建 .csv 之前。

我在 Windows 7 上从 Powershell V2 ISE 运行脚本,我相信远程服务器在 Windows Server 2003 上。

直接从远程服务器运行脚本会更快吗?

由于所有数据在写入 csv 之前都收集在“缓存”中,因此导出 csv 的过程是否缓慢?

如果我只需要处理 20,000 个文件,我会等待 26 分钟,但 500,000 个文件和文件夹是一个漫长的等待。

我正在测试下面的方法,因为我认为我真正的问题不是速度,而是在内存中存储了太多数据。感谢 George Howarth 的帖子,以及顶级脚本的 PoSherLife -http://powershellcommunity.org/tabid/54/aft/4844/Default.aspx

Measure-Command {
[System.Reflection.Assembly]::LoadFile( "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll") 

"Name|SizeInBytes|Width|Height|FullName" >> C:\Users\fcool\Documents\JPGInfo.txt  

$path = "C:\Users\fcool\Documents" 
$images = Get-ChildItem -Recurse $path -Include *.jpg 

foreach ($image in $images) 
{ 
$name = $image.Name 
$length = $image.Length 
$imageFile = [System.Drawing.Image]::FromFile($image.FullName) 
$width = $imageFile.Width 
$height = $imageFile.Height
$FullName = $image.Fullname 

"$name|$length|$width|$height|$FullName" >> C:\Users\fcool\Documents\JPGInfo.txt  

$imageFile.Dispose() 
}
}

在非图像文件类型上运行这些脚本时是否存在任何风险/性能损失?

当我不排除非图像时,我收到此错误:

Exception calling "FromFile" with "1" argument(s): "Out of memory." 
At C:\scripts\directory_contents_IMAGE_DIMS_ALT_method.ps1:13 char:46 
+ $imageFile = [System.Drawing.Image]::FromFile <<<< ($image.FullName) 
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : DotNetMethodException 

感谢您的任何建议!再次感谢 George Howarth 和 PoSherLife 的剧本!

4

1 回答 1

1

使用-FilterwithGet-ChildItem-Include您只能应用一个过滤器字符串快得多。所以如果你只想匹配 *.jpg 你可以使用过滤器。在我使用过滤器的测试中,它比包含快了近 5 倍。

Get-ChildItem -Recurse \\server\Photos -Filter *.jpg | % {
    $image = [System.Drawing.Image]::FromFile($_.FullName)
    if ($image.width -eq 500 -or $image.width -eq 250 -or $image.width -eq 1250) {
        New-Object PSObject -Property @{
            name = $_.Name
            fullname = $_.Fullname
            width = $image.Width
            height = $image.Height
            length = $_.Length
        }
    }
} | Export-Csv 'C:\log.csv' -NoTypeInformation
于 2012-03-13T06:04:36.317 回答