PowerShell:ファイルをシャッフルする

こんにちは、%habrauser%!

最近、彼らは私に一見シンプルな作業を投げかけました。投票システムには約1000枚の写真を混ぜる必要があります。

これを手動で行うことは、ありがたい仕事です。 素敵な小さなスクリプトが必要です。

PowerShellは理想的なオプションであることが判明しました。Pythonのようなものはインストールしたくありませんでしたが、私の人生で.batファイルと友達になったことはありません。



始めましょう。

写真の名前は重要であり、私はそれらを保持したかったです。 ファイルプロパティでそれらを削除することにしました(WinXpの場合は「概要」、Win7の場合は「詳細」)。 さらに、投票はsharepointに書き込まれ、ファイルプロパティから「名前」を選択できます。 それは非常に便利であることが判明しました。

ファイルプロパティを編集するには、 OLEファイルプロパティリーダー2.1コンポーネントを使用しました(vb7サンプルフォルダーに.netのライブラリラッパーがあります)。この利点は既にマシンにインストールされています。 このコンポーネントは、オフィス文書だけでなく、写真も対象としています。



実際のスクリプト:

[System.Reflection.Assembly]::LoadFrom('c:\DsoFile\Source\Vb7Demo\bin\Interop.DSOFile.dll') function SetSummary-Name([string] $folder, [string]$pattern = '*.*') { $files = [System.IO.Directory]::GetFiles($folder, $pattern) foreach ($f in $files) { $oled = New-Object -TypeName DSOFile.OleDocumentPropertiesClass $oled.Open($f, $false, [DSOFile.dsoFileOpenOptions]::dsoOptionDefault) $sp = $oled.SummaryProperties $sp.Title = $f.Substring($f.lastindexof('\') + 1, $f.lastindexof('.') - $f.lastindexof('\') - 1) $oled.close($true) } } SetSummary-Name -folder 'c:\photo'
      
      







次に、ミキシングに進みます。

数値の名前を生成することは可能でしたが、突然、複雑なデザインの自転車を発明したいと思いました。



 #        function RandomName([string]$path) { $length = 20 #    $sb = New-Object -TypeName System.Text.StringBuilder for($i=0; $i -lt $length; $i++) { #   ,  ... [char]$ch = [Convert]::ToChar([Convert]::ToInt32([Math]::Floor(26 * $rand.NextDouble() + 65))) $tmp = $sb.Append($ch) # Append    ,    $tmp } $name = $path.Substring($path.lastindexof('\') + 1, $path.lastindexof('.') - $path.lastindexof('\') - 1) $sb = $sb.ToString().ToLower() return $path.Replace($name, $sb) } function MixFiles([string]$From, [string]$pattern = '*.*') { $files = [System.IO.Directory]::GetFiles($from, $pattern) foreach($f in $files) { $path = RandomName -path $f #    , while([System.IO.File]::Exists($path)) { #  ,    $path $path = RandomName -path $f } #        Write-Host ($f + ' -> ' + $path) [System.IO.File]::Move($f, $path) } } $rand = New-Object -TypeName Random MixFiles -from 'c:\test\' -pattern '*.jpg'
      
      







ご清聴ありがとうございました。誰かに役立つことを願っています。



All Articles