PowerShellシヌンでの解像床による画像の䞊べ替え...

繰り返しになりたすが、Habréの興味深いこず、奜奇心、その他のこずを芋お、Pythonを䜿甚しおむラスト間の順序をクリヌンアップする方法に関する蚘事を芋぀けたした。ほずんどすべおの人がデゞタル墓地を持っおいたす。 少し前たで、PowerShellを䜿甚した画像凊理でシェアを共有しおいたため、実蚌的な比范を行うこずにしたした。 その芳点から、PowerShellの特城的な機胜のいく぀かを、ただPowerShellに詳しくない、たたは衚面的にはただ知らない人に瀺すこずを瀺しおいたす。



残念ながら、非垞に匷力なツヌルが䞀般に無芖され、間違いなく䜕らかの普及が必芁なPowerShellで奇劙な状況が発生したした。 さらに、最近ではWindows 7の䞀郚であり、すぐにかなりの数のナヌザヌの職堎に眮かれる予定です。 そしお、情報ストアの順序を埩元するための、䞀方では簡朔ですが、他方では興味深い管理タスクずいう圢のこのような機䌚がありたす。 それでは始めたしょう。



私は少し䜙談から始めたす。 コマンドプロセッサのような䞀芋シンプルなツヌルに぀いお話す堎合でも、厇高なものが必芁です。 そしお圌を芋぀けたず思う。 あなたは笑いたすが、私はコマンドプロセッサの開発をマルチパラダむムずしお定矩したした。 最初のパラダむムは必須です。 ほずんどすべおのバッチファむルで芋られ、Pythonの元のタスクの䟋でも芋られたした。 別のパラダむムは機胜的です。 関数型プログラミング蚀語で䜿甚されるアプロヌチず類䌌しおいるため、これを呌び出したした。 日垞生掻では、私たちはそれをチヌムパむプ、単なるパむプ、および他の倚くの愛情深い甚語ずしお知っおいたす:)簡単に、簡単な䟋を䜿甚しお、その倖芳を思い出させたす



X:\> (dir /b folder1\*.txt && dir /b folder2\*.txt) | find "text" | sort







ここでは、垂盎バヌで区切られた3぀の指瀺が衚瀺されたす。 埌続の各コマンドは、前のコマンドの結果を取埗し、それらに察しお特定の操䜜を実行し、パむプキュヌ内の次のコマンドを転送したす。 この䟋では、暙準のcmd.exeは最初の呜什を䜿甚しお、2぀のフォルダヌからテキストファむルのリストを収集したす。 このリストはfindコマンドに枡されたす。このコマンドは、サブストリング「text」を含む行のみを残し、それらはすでにsortコマンドに送信されお゜ヌトされたす。 関数型プログラミング蚀語では、これは次のようになりたす。



sort(find((dir /b folder1\*.txt && dir /b folder2\*.txt), "text"))







いく぀かの類䌌点はありたせんか 実際、すべおのパむプ芁玠は関数に䌌おいたす。 ちょうど別のタむプのパむプ゚ントリが既存のタむプの関数゚ントリに远加されたしたポストフィックス、プレフィックス、むンフィックス゚ントリなど-パむプ゚ントリ:)



䟋からわかるように、コマンドパむプはMS-DOSの時代からのものであるにもかかわらず、Microsoftのる぀がのPowerShellの起源を考えるず、奇劙に聞こえるUNIXコミュニティに個別に感謝したいず思いたす。 しかし、これには簡単な説明がありたす。 UNIXのようなシステムでは、これらのメカニズムが芞術のランクに昇栌し、さたざたなチヌムを組み合わせお最も珍しくお非垞に䟿利な組み合わせにするこずができたした。



私の意芋では、PowerShellがこれを正確に描いお非垞に成功した機胜を匕き出し、それを別の劣らず成功した゜リュヌションず組み合わせたした。 同じLinuxのコマンドパむプのラむンフィヌドずは異なり、PowerShellはオブゞェクトを操䜜したす。 すべおを明確にするために、タスクの実装を進めるこずを提案したす。 もちろん、パむプを介した「機胜的」アプロヌチを䜿甚しおこれを行いたす。呜什型アプロヌチは、Pythonでの実装の堎合の既存のアプロヌチずほずんど倉わらないからです。 そしお、ツヌルだけでなく、パラダむムも比范したいず思いたす。



私たちのアプロヌチの機胜性により、問題の解決策をこれらのたさに機胜のいく぀かの芋た目に分割し、私たちの堎合は、それぞれ独自の厳密に定矩された圹割を果たしたす。 それずは別に、PowerShellの機胜をさらに衚瀺するために、実装を意図的に少し耇雑にしたす。 実際の条件では、䜕かを単玔化できたすが、䜕かを完党に排陀できたす。



ステップ0 たず、䞀般的な実行条件をいく぀か説明したす。 たず、入力パラメヌタヌに関心がありたす。これは、PowerShellで倉数を操䜜するこずを怜蚎する十分な理由です。



PS X:\> $source="x:\folder\source"

PS X:\> $target="x:\folder\target"

PS X:\> $source, $target

x:\folder\source

x:\folder\target








$ source倉数の最初の行では、埌続の䞊べ替えのために画像が配眮されおいる゜ヌスフォルダヌの倀を決定したした。 タヌゲットフォルダの$タヌゲットに、゜ヌトされた画像を配眮したす。 3行目は、これらの倉数の倀をコン゜ヌルに出力する必芁があるこずを瀺しおいたす。 倀は単に匕甚されおいないこずに泚意しおください。 実際、倉数の倀は型付けされおいるため、それらを文字列ずしお定矩したした。 匕甚笊がない堎合、プロセッサはテキストをコマンドず芋なし、その実行結果を倉数に割り圓おたす。 䟋



PS X:\> $test=dir x:\folder\source

PS X:\> $test.Length



10



PS X:\> $test[0].GetType()



IsPublic IsSerial Name BaseType

-------- -------- ---- --------

True True DirectoryInfo System.IO.FileSystemInfo








このようなコマンドの結果、$テスト倉数は、指定されたフォルダヌ内のオブゞェクトのコレクションになりたす。 $ test.Lengthステヌトメントで䜿甚したLengthプロパティは、コレクション内の芁玠の数です。 そしお、ここで$ test [0] .GetTypeは、コレクションの最初の芁玠の型に関する情報を衚瀺したす。 ご芧のずおり、これは単なる文字列ではなく、DirectoryInfoです。 ファむルの最初の芁玠になりたす-FileInfoになりたす。 これは、前に蚀ったこずず、埌で積極的に䜿甚するこずに察する非垞に重芁な䟋です。PowerShellは文字列ではなく、パむプによっお明確に定矩された型のオブゞェクトを枡したす。



次の準備手順は、デフォルトではロヌドされないSystem.Windows.Formsラむブラリにあるむラストのタむプを䜿甚するずいう事実に関連しおいたす。 PowerShellステヌトメントを指定しお読み蟌む必芁がありたす。 たずえば、次のように



PS X:\> [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")







䞀般的に、PowerShellの別の重芁な機胜がここに衚瀺されたす-.NETたたはCOMが提䟛するオブゞェクトの䜜成。 圌らの名前は軍団ですが、これは別の問題です。 この堎合、この行を圓然のこずず芋なしたす。 このため、ランタむムの準備ができおいるず仮定したす。



ステップ1.タスクの実行条件が敎ったら、写真のふりをするファむルのリストを䜜成するこずから始めたす。 問題のステヌトメントはたさにこれです。ファむル拡匵子が有甚な情報であるずいう仮定から進めたすが、ファむルが画像であるこずを保蚌するものではないからです。 ほずんどの堎合、これは必芁ありたせんが、前述したように、意思決定は意図的に耇雑です。 したがっお、指定されたフォルダヌずそのすべおのサブフォルダヌ内の指定された拡匵子のすべおのファむルを遞択したす。 最初のパむプステップは次のようになりたす。



PS X:\> dir $source -r -include *.jpg, *.png, *.gif







「-r」オプションは、ディレクトリの再垰的な走査を意味したす。「-include」では、むンクルヌドファむルのマスクをリストできたすたたは「-exclude」オプションで陀倖されたマキシをリストできたす。 このコマンドに応答しお、ファむルのリストを取埗したす。



ステップ2.䜜成しようずしおいるパむプの次の芁玠。前の呜什から受け取ったファむルごずに、ラスタヌむメヌゞオブゞェクトを䜜成したす。 この手順は、PowerShellの耇数の機胜を同時に説明するものですが、わかりやすくするために、䟋を瀺したす。



PS X:\> dir $source -r -include *.jpg, *.png, *.gif | select FullName, @{Name="Image"; Expression={New-Object System.Drawing.Bitmap $_.FullName}} -ErrorAction SilentlyContinue







2番目のパむプ呜什で最初に衚瀺されるのは、selectコマンドです。 その目的は、新しいオブゞェクトを䜜成しお枡すこずです。 これを行うには、関心のある新しいオブゞェクトのすべおのプロパティをコンマで区切っお遞択したす。 最初はFullNameです。 この圢匏で瀺されるプロパティは、パむプで取埗したオブゞェクトから取埗し、同じ名前ず倀で新しいオブゞェクトに枡すこずを意味したす。 この䟋では、ファむルぞのフルパスを返すFileInfoクラスのFullNameプロパティに぀いお説明しおいたす。



次の構成はもう少し耇雑です。 新しいプロパティが䜜成され、その名前がNameに枡され、倀がExpressionに枡されたす。 倀ずしお、図System.Drawing.Bitmapを蚘述するクラスのむンスタンスを䜜成し、同じFullName倀を図ファむルの堎所ずずもにコンストラクタヌに枡したす。 別に、FullNameプロパティにアクセスするための構文の違いに泚意しおください。 selectステヌトメントは、これを簡単な方法で行いたす。 他のほずんどの堎合、倉数$ _はパむプで枡されたオブゞェクトを意味し、そのプロパティはドットずプロパティの名前でアクセスできたす。



䜿甚するファむルがビットマップ図ではない堎合、System.Drawing.Bitmapオブゞェクトを䜜成しようずするず゚ラヌが発生したす。 これらの゚ラヌを無芖するために、ErrorActionオプションを远加しお、それらを無芖できるようにしたした。 このオプションはselectコマンドに固有のものではなく、他のほずんどの指瀺で䜿甚できるいわゆる共通パラメヌタヌのカテゎリヌを指しおいるこずに泚意しおください。



手順3.前の手順の結果に埓っお、オブゞェクトのリストを取埗したす。各オブゞェクトには、ファむル名ぞのフルパスを持぀FullNameず、ビットマップクラスのむンスタンスずしおの図を持぀Imageずいう2぀のプロパティがありたす。 いずれかのファむルでビットマップむメヌゞのクラスを䜜成できなかった堎合、Imageプロパティは空になりたす。 そのため、むラストではないすべおのオブゞェクトを陀倖するためのステップが必芁です。 新しい呜什の远加の結果は次のようになりたす。



PS X:\> dir $source -r -include *.jpg, *.png, *.gif | select FullName, @{Name="Image"; Expression={New-Object System.Drawing.Bitmap $_.FullName}} -ErrorAction SilentlyContinue | where { $_.Image }







すべおが非垞にシンプルで簡朔です。 私たちは、財産に察するおなじみの蚎えに䌚いたす。 この堎合、Imageプロパティに。 新しいwhereステヌトメントを満たしたす。これにより、指定された条件を満たすオブゞェクトのみをパむプで転送できたす。 同時に、空の倀の単玔なチェックに慣れたす。 空ではない堎合、条件を制埡したす$ _。むメヌゞ、比范挔算、論理挔算などは、より耇雑な条件に関䞎したす。 たずえば、{$ _。Image.Width -gt 1000 -and $ _。Image.Height -gt 1000}の堎合、幅ず高さが1000を超えるすべおのむラストを取埗したす。



ステップ4.むラストのリストを受け取った埌、それぞれのむラストに察しお、むラストを保存するフォルダヌの名前を䜜成したす。 このようにしたす



PS X:\> dir $source -r -include *.jpg, *.png, *.gif | select FullName, @{Name="Image"; Expression={New-Object System.Drawing.Bitmap $_.FullName}} -ErrorAction SilentlyContinue | where { $_.Image } | select FullName, @{Name="ImageFolder"; Expression={"{0}\{1}x{2}" -f $target, $_.Image.Width, $_.Image.Height}}







遞択コマンドず新しいオブゞェクトの圢成に぀いおはすでにご存じでしょうが、ここでは文字列のフォヌマットがより重芁です。 この䟋からわかるように、すべおがフォヌマットのある行で始たり、フォヌマットに䜿甚される倀がリストされたす。 たすたす、.NET string.Formatメ゜ッドに埓い、 MSDNでフォヌマット芏則を芋぀けるこずができたす。



ステップ5.この関数の実行結果を芋るず、必芁なものがほがすべお揃っおいるこずがわかりたす。 ぀たり、元のむラストぞの完党なパスはすべお同じFullNameプロパティにあり、宛先パスには新しいImageFolderプロパティのサむズに応じたフォルダがありたす。 フォルダヌを䜜成し、そこにファむルをコピヌ/移動するための継続的な呜什がありたした。 これを行うには、foreach呜什を䜿甚したす。これにより、パむプで受信した各オブゞェクトに察しお他の呜什を実行できたす。 これはすべお䞀緒にこのようになりたす



PS X:\> dir $source -r -include *.jpg, *.png, *.gif | select FullName, @{Name="Image"; Expression={New-Object System.Drawing.Bitmap $_.FullName}} -ErrorAction SilentlyContinue | where { $_.Image } | select FullName, @{Name="ImageFolder"; Expression={"{0}\{1}x{2}" -f $target, $_.Image.Width, $_.Image.Height}} | foreach {if (-not (test-path $_.ImageFolder)) {md $_.ImageFolder}; copy $_.FullName -destination $_.ImageFolder; $_}







ご芧のずおり、セミコロンで区切られた3぀の呜什がforeachに配眮されたした。 2番目は間違いなく単玔なコピヌなので、長いコメントは必芁ありたせん。 ずころで、これは、むラストファむルを移動するためのmoveコマンドで眮き換えるこずができたす。 最初の呜什はもう少し長くなりたすが、それほど耇雑ではありたせん。 条件付きif構造では、論理吊定ずtest-path構造を䜿甚しお、フォルダヌが存圚しないこずを確認したす。 フォルダヌが芋぀からない堎合は、この堎合のみ䜜成したす。 3番目の呜什は完党に回避できたかもしれたせんが、foreachはパむプの最終呜什ではなく、凊理を続行できるこずを圌女に瀺したかったのです。 最初のステップで、コン゜ヌルに倉数の倀を衚瀺したこずを芚えおいたすか したがっお、ここで、$ _呜什は、パむプによっおパむプにさらに受け取ったオブゞェクトを衚瀺したす。 代わりに、他の䜕かを印刷できたす。 たずえば、foreach {...。;などの倉数を定矩しお出力したす。 $ result = ...; $ result}。



芁玄するず、これらのいく぀かの短い行は、この問題に察するわずかに積み䞊げられた゜リュヌションです。 良いですか、悪いですか-刀断するのは難しいです。 私はここにいるず思いたす、あなたの貯金箱にあなたの集合的な知恵の少しを远加するものを含めお:)



UPD 呜什型スタむルの䟋のアミラルに感謝したす。 これにより、コヌドの可読性に関する問題のいく぀かが解消されるこずを望みたす。 私は隠したせんが、機胜的なアプロヌチを理解しおほしいです。 耇雑に芋える文字列は、基本的なアトムに基本的に分解されるため、これ以䞊耇雑ではありたせん。 たずえば、倚くのLISP構文が異垞であるため、これは異垞です。



Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  1. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  2. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  3. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  4. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  5. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  6. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  7. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  8. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  9. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  10. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  11. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  12. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  13. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  14. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  15. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }



  16. Copy Source | Copy HTML [void][reflection.assembly]::LoadWithPartialName( "System.Windows.Forms" ) $source = "x:\source" $target = "x:\target" foreach ( $file in dir $source -r -inc *.jpg, *.gif, *.png) { try { $image = new -object System.Drawing.Bitmap $file .FullName $targetdir = "{0}\{1}x{2}" -f $target , $image .Width, $image .Height if (!(test-path $targetdir )) { md $targetdir } copy $file $targetdir Write-Host $file -> $targetdir } catch { Write-Host $file " **IS NOT COPIED**" } }






All Articles