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]

この記事に対する TrackBack URL:

設定によりTB元のページに、こちらの記事への言及(この記事へのリンク)がなければ、TB受付不可となりますのであらかじめご了承下さい。

コメントをどうぞ。 名前(ペンネーム)と画像認証のひらがな4文字は必須で、ウェブサイトURLはオプションです。

ウェブサイト (U):

タグは使えません。http://・・・ は自動的にリンク表示となります

:) :D 8-) ;-) :P :E :o :( (TT) ):T (--) (++!) ?;w) (-o-) (**!) ;v) f(--; :B l_P~ (QQ)

     

[X] [Top ↑]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0186 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