Расширяемая система типов (MD5)

Так вот… О добавлении своего свойства к объектам…

К примеру мы хотим чтобы у файлов было свойство MD5, в котором бы отображался соответствующий хеш.
PowerShell способен оборачивать обычные объекты в свою обёртку, наследуя при этом оригинальный объект, и добавляя к нему свои модификации. Эти модификации настраиваются с помощью xml файлов (правда с расширением .ps1xml). Примеры этих файлов можно посмотреть в папке установки PoSH. Эти файлы он подгружает автоматически при запуске. Но можно создать и свои ps1xml и дополнить ими систему типов в любой момент.
Например с помощью этого ps1xml'а к файлам добавляется свойство md5.
Внутри находится несложная xml структура, описывающая к каким типам объектов добавляется свойство, его имя, и процедура вычисления свойства (обычный скрипт PoSH).
Для того чтобы добавить это описание следует выполнить следующую команду:

PS D:\PowerShell> Update-TypeData TypeDataMD5Prop.Ps1Xml

Или лучше даже записать её в профиль, чтобы описание свойства подгружалось автоматически при старте PoSH.
После подгрузки ко всем объектам типа System.IO.FileInfo добавляется наше свойство. Посмотреть его можно так:

PS D:\PowerShell> dir | Get-Member md5 | Format-List


TypeName   : System.IO.FileInfo
Name       : MD5
MemberType : ScriptProperty
Definition : System.Object MD5 {get=
	if($this.length -le 1Mb)
	{
	    $hasher = new-object System.Security.Cryptography.MD5CryptoServiceProvider
	    $stream = $this.OpenRead()
	    [string]::join(" ",$($hasher.ComputeHash($stream)|%{"{0:X2}" -f $_}))
	    $stream.Close()
	    trap {if($stream -ne $null){$stream.close()}; break}
	}
	else
	{
	    "-"
	};
}

В поле Definition хорошо виден вычисляющий поле скрипт. Так как этот алгоритм вычисления md5 подгружает весь файл в память, на больших файлах могут возникнуть проблемы. Поэтому я сделал проверку на размер файла, и md5 вычисляется только для файлов размером менее 1мб.

А используется например так:

PS D:\PowerShell> dir | Format-Table name, md5

Name           md5
----           ---
foo
1.txt          81 05 1B CC 2C F1 BE DF 37 82 24 B0 A9 3E 28 77
2.txt          81 05 1B CC 2C F1 BE DF 37 82 24 B0 A9 3E 28 77
3.txt          81 05 1B CC 2C F1 BE DF 37 82 24 B0 A9 3E 28 77
4.txt          81 05 1B CC 2C F1 BE DF 37 82 24 B0 A9 3E 28 77
foo.txt        78 15 69 6E CB F1 C9 6E 68 94 B7 79 45 6D 33 0E
Get-WhoAmI.ps1 EF 02 51 93 8C 45 42 DC AD FA 57 74 DB 59 FA 4E
Опубликовано в PowerShell, Scripting. 1 Comment »

Один ответ to “Расширяемая система типов (MD5)”

  1. Get-MD5 (из строки) « PowerShell и другие скрипты Says:

    […] вот здесь я описывал как можно “прикрепить” динамическое […]


Обсуждение закрыто.

%d такие блоггеры, как: