PowerShellでバイナリデータ列のパイプ

PowerShellLink でパイプを使ってコマンドを記述しても、そこを流れるのがテキスト/バイナリデータではなくオブジェクト。なのに、.NET Frameworkに対応していない従来のコマンドも普通にコマンド打つだけで実行できてしまう。

はて、従来のテキストベースのコマンドをPowerShell上でパイプで記述するとどうなるのだろ? ためしにnetpbmを使って以下のコマンドを打つと、ppmtojpegでエラー。
PS C:¥> bmptopnm bitmap | ppmtojpeg > bitmap.jpeg
C:¥Program Files¥GnuWin32¥bin¥bmptopnm.exe: Windows BMP, 1024x768x32
C:¥Program Files¥GnuWin32¥bin¥bmptopnm.exe: WRITING PPM IMAGE
C:¥Program Files¥GnuWin32¥bin¥ppmtojpeg.exe: EOF / read error reading a one-byte sample
で、
PS C:¥> $a = bmptoppm bitmap.bmp
C:¥Program Files¥GnuWin32¥bin¥bmptoppm.exe: Windows BMP, 1024x768x32
C:¥Program Files¥GnuWin32¥bin¥bmptoppm.exe: WRITING PPM IMAGE
PS C:¥> $a.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


PS C:¥> $a[0].gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
bmptopnmの出力はSystem.Stringクラスオブジェクトの配列に変換され、でまたテキストに戻されppmtojpegに渡されるということになっているようです。

で、どうもこのStringオブジェクトに変換する際にデータはUnicode化され、バイナリデータであるbmptopnmの出力は書き換わっているっぽい。

pnmtopnmを使ってテキストフォーマットにすれば問題なく扱えるのでしょうが、Unicode化されるのでだめLink
bmptopnm|pnmtopnm -plain
としてもpnmtopnmに渡される時点でデータは壊れてるし。

PowerShellは好きなんですが、こういう用途には使うなということですね。

[参考]

[2008/3/10] 追記Link

— posted by mu at 06:14 pm   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0101 sec.
prev
2008.3
next
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31