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 個のファイル + フォルダーがスクリプトに必要です。.csv を作成する前に 26 分。

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 

アドバイスをありがとう!ジョージ・ハワースと PoSherLife の脚本に改めて感謝します!

4

1 に答える 1

1

-Filterwithを使用すると、 1 つのフィルター文字列しか適用できない場合Get-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 に答える