このスクリプトを記述して画像のサイズとファイルパスを収集するためのより良い方法があるかどうか疑問に思います。スクリプトは小規模から中規模のディレクトリでうまく機能しますが、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 の脚本に改めて感謝します!