PowerShellとDOSプロンプト
「Irvine」にかませるURLリストを作ろうとRubyでスクリプトを作ってみたんですよ、Windows上で。
#「Irvine」もWindowsアプリですし。
URLリストって、結局テキストデータなので、生成した結果をリダイレクトでファイル化すればいいかと思って、ファイル化の機能はスクリプトには付けなかったんですね。で、やることも単純なので、PowerShellで実行しました。コンソール上でも期待通りの結果が得られたので、それをリダイレクトしてファイルを生成。で、それを「Irvine」に読み込ませようとしたら
エラー
何度やっても、「エラー」になり、できたファイルをテキストエディタで覗いてみた。コンソール上で見たものと同じ結果になっている。おかしなところは見当たらない。で、もう一度やってみる。やはり「エラー」になる。もう一度テキストエディタで開いてみた。と、ついでに文字コードを確認。そしたら、
UTF-16
で書き出されていた。ひとまず、その時はテキストエディタでShift-JISでURLリストのテキストファイルを保存し直し、Irvineに読み込ませた。
確か、Rubyは内部処理的にはUNICODEを使っていたはずなので、そのせいかと思い、スクリプト内で文字コードのエンコードを行なうように修正して、再度、PowerShellで実行しました。もちろん、結果はリダイレクトでファイル化です。で、できたファイルを、やはりテキストエディタで開いてみると
UTF-16
RubyのリファレンスでStringクラスのencodeメソッドのリファレンスを読み返したが、使い方は間違っていなかった。で、冷静になって考えた。「もしかして、PowerShellのコンソールって、UNICODEで処理してるんじゃないか」と。で、試しにDOSプロンプト(通称、DOS窓)でやってみたら、DOS窓ではShift-JISで書き出されてました。
PowerShellって、そのままUNICODEで文字列処理してるんですね。
#Windowsは内部処理的にはUNICODEで処理している
でも、さすがにUNICODE対応が当たり前の世代のシェルプログラムだからね、当然といえば当然ですね。
そういえば、「Windows 7」って、DOS窓あるんだっけ?確か、マイクロソフトがPowerShellを発表した時、「次期WindowsにはDOSプロンプトの代わりに搭載する」とかいってたような気がしましたが。
#ちなみに、PowerShellが登場したのは、Vistaの後。
#Windows Server 2008には標準で搭載されましたが。
そうすると、XP時代から人気のあるソフトに対してテキストデータを読み込ませるときは気を付けなければならないかもですね。まあ、PowerShellを使うユーザーがどれだけいるかってのもありますが。
GUIがメインのWindowsでCUIであるPowerShellを使う人はそうはいないかもしれませんが、これはこれで結構便利なんですよ。DOS窓よりも格段に性能も上がってますしね。定型処理や定型的なデータの作成をするにはかなり重宝しますよ。
#重たいアプリを動かす必要が無いですし。
| 固定リンク | 0
「パソコン・インターネット」カテゴリの記事
- LINE、「LINE Out」を5/31にサービス終了(2023.03.22)
- LINE BLOG、6月にサービス終了(2023.01.30)
- 動画配信サービス「GYAO!」、3月にサービス終了(2023.01.16)
- LINE LIVE、2023年3月でサービス終了(2023.01.14)
- コードエディタ「Atom」、最終版公開(2022.11.21)
コメント
S.K.さん、情報提供ありがとうございます。
デフォルト環境なので、
>foo.exe | sc URLlist.txt
>とすればShift-JISで書き込まれるはずです。
でShift-JISで書き出されました。
フィルタ系コマンド(レット)も用意されてるんですね。
#私もほぼ入れっぱなしで、そんなに
#使ってなかったので。
投稿: あ~かいば | 2010年2月 7日 (日) 22時37分
デフォルトの状態なら
foo.exe > URLlist.txt
の代わりに
foo.exe | sc URLlist.txt
とすればShift-JISで書き込まれるはずです。
PowerShellのリダイレクトの文字コードはUTF-16LEで固定なので、
他を使いたい場合はsc(Set-Content)の-Encodingオプションか[Text.Encoding]::GetEncoding()とか使って、って感じになります。。。
投稿: S.K. | 2010年2月 7日 (日) 22時03分