MocaScriptがなくなったので、Windows PowerShell を使う

MocaScriptは終わりました


MocaScriptという便利なコマンドラインツールがありました。有料エディタのマクロなんですが、単体で無料で使えました。

いいところは、JavaScriptと互換性あるので覚えやすいこと、その上で便利な機能が追加されていること、実行環境がexeファイル1個という手軽さ、などがありました。

そのexeをパスの通ったところに置けばいいし、無理そうならスクリプトと同じフォルダに置けばいいので、本当に楽でした。

やることといえばテキストの加工で、ファイルを読み込む、置換・変換する、出力する、くらいのことが多かったけれど、元がJavaScript互換なのでもっと複雑なこともできました。

しかしエディタの終了とともに、MocaScriptも終わりました。すでにDLしたものは使えるのですが、終わったと考えていいでしょう。

代わりになるもの


似たようなもので大御所といえば sed があります。テキストの変換・置換を一括で行うものですが、昔からあるものなので正規表現の書き方が今風とすこし違ったり、そもそももう利用者が少なかったりします。また変換・置換以上の複雑な編集をするのがちょっと難しいです。

かといって PerlやPHP は大げさすぎな気もします。いちおうどちらもポータブル版があるのですが、Perlはおぼえる気になりませんし、PHPはポータブル版だとマルチバイト文字列の利用に難があったり、欠点もあります。

Windows標準の機能で


じゃあもともとOSに入ってる、Windows PowerShellを覚えてみるのはどうだろうか、というのがこの記事の趣旨です。すでにVistaより古いPCを触ることはなくなったので、環境に困ることはありません。

本来PowerSellは複雑で難しいものなのですが、テキストの置換・変換と加工くらいなら(正規表現を覚えていたら)できるだろうと思ったのです。

とりあえずやってみる


PowerShellでできることは広範なので、説明書を見るだけで頭が痛くなりそうです。でもやりたいことは少しなので、それっぽいところを見てみます。

まずテキストを読み込んで表示するだけ。スタートメニューからPowershellを起動してコマンドを打ちます。

Get-Content c:\scripts\test.txt

やってみるとちゃんと表示されました。「get-con」くらいまで入れてTABキーを押すと補完されるようです。読んだテキストに何かしたいときは「|」でパイプします。cmd.exeを使ってた人にはおなじみですけど、そうでない人はぴんとこないかもしれません。

Get-Content .\test.txt | Out-File test2.txt

これはテキストを読んで、保存するだけです。この間で置換すればいいんでしょうか。

Get-Content .\test.txt | Sort-Object | Out-File .\test2.txt

読んだテキストをソートして保存してみました。初めてなので回りくどい気もしますが、こういうものなんでしょうかね。

Get-Content ファイル名 | foreach { $_ -replace "置換前文字列", "置換後文字列" }

これが文字列置換らしいです。

Get-Content .\test.txt | foreach { $_ -replace "あ", "おおおお" }

すでに理解を超えそうですが、たぶん入力した文字列は「$_」という変数に入るんでしょう。foreachは全行に対してということで、他の言語をやっていたら、なんとなくわかるという程度です。初心者だったら難しいですね。

foreachのブロックがないと、最初の行だけ使われると思ったら、エラーになるようです・・・。

この文をtest3.ps1というファイルに保存して実行してみました。実行はファイル名を書くだけでいいそうです。

するとエラー。前途多難です。

スクリプトの実行がシステムで無効になっているため、ファイル C:\Users\kimura_takuya\Desktop\test3.ps1 を読み込めません。詳細について
は、「get-help about_signing」と入力してヘルプを参照してください。

管理者権限で権限を設定する必要があるらしく、そのとおりにしました。

というかPowerShellって管理者権限がないとスクリプト使えないのね・・・。

「Set-ExecutionPolicy RemoteSigned 」で設定して、*.ps1の実行できました。

$string = Get-Content .\test.txt
$string -replace "(o|。)", "----" | Out-File test2.txt

こういう書き方でも期待通りに行けました。とりあえずファイルに対して複数回の置換はできるようになりました。なんか書き方がむずがゆいです…。

続く!

0 件のコメント :