ラベル Ruby の投稿を表示しています。 すべての投稿を表示
ラベル Ruby の投稿を表示しています。 すべての投稿を表示

2023年9月6日水曜日

Ruby で Windows のコマンドラインツールを作ってみた

 Windows で、あるディレクトリの下にあるディレクトリを圧縮してそのディレクトリに置き、圧縮したディレクトリを削除するという作業を大量に行っていた。

 大量に行うのが面倒くさいのでバッチファイルを作ろうと思ったが、今更 Windows のバッチファイルも無かろう。得意な言語は C/C++ なのだがコンパイル環境を構築するのが面倒くさい。次に得意なのは PHP だが、あまり好きな言語ではないし新たに環境構築が必要。その次に慣れた言語は python だが、それでは面白くない。ということで、数ヶ月前に転職目指して環境を入れて勉強した Ruby にした。

 プログラム自体はごく単純なものなのだが、いろいろハマった。

 最初、Windows System 内のファイル圧縮を使う方法が分からないので普段使っている Lhaz を使って圧縮することにした。幸い、コマンドラインから使えたので system() から呼び出したのだが、まず、'\' のエスケープシーケンスの入れ方で悩む。まぁ、ここは何をつかってもいつも悩むのだが。

 ここをクリアして動くようになってから試していると、アーカイブファイルのファイル名がすこしおかしい。圧縮するディレクトリ名をアーカイブのファイル名にしたのだが "xxx.Vol.09" のような名前にすると、最後の "." 以降の数字がファイル名に反映されない。GUI からだと問題はない。Lhaz のバグだと思うのだが、使う側からは対応しようが無い。

 あきらめて別なツールを使おうと探していたら、Windows System の圧縮機能の使い方が分かった。power shell から Compress-Archive を呼び出すということがわかった。power shell から Ruby を起動して system() をつかったら、power shell のコマンドを呼び出せるのかと思ったらそうはいかず、sysytem("powershell <power shell cmd>")で呼び出す形式だった。

 これで動くと思ったら、sysytem("powershell <power shell cmd>")の<power shell cmd>の中の '"'(ダブルクォーテーション)が消える。具体的には、ディレクトリ名に空白が入っているので、フルパス全体を '"' で囲んだのに、エラーメッセージを見ると '"' が消えていて、ディレクトリ名の空白がパラメータの区切りとみなされエラーとなっていた。system("")で Lhaz を呼び出した時は '"' は消えなかったのだが...。この問題は '"' を "'"(シングルクオーテーションに変えることで解決。

 まぁ、ファイル名を扱ったり、OS のコマンドを呼び出すプログラムは一筋縄では動きませんわ。

2023年6月12日月曜日

私家版 Ruby クイックリファレンス(随時更新)

 思うところあって Ruby を勉強しているのだが、引っかかりそうなところのメモ。検索でき無さそうなのを多めに。

pxxは、はじめてのRubyで説明されているページ

!

 配列に対するメソッドの後ろについていた場合、配列の内容を変更する。
無い場合は、新しいオブジェクトを返す
破壊的メソッド

語の先頭 = 文字列のパーセント記法(p62)
文字列の直後 = 
%w[ x y z ] = 配列の定義 -> [ "x", "y", "z" ]

&:...

ブロック内でブロック変数の代わりとなり、メソッド...を呼び出す

#{foo}

 シングルクォート、ダブルクオートの中で、foo を文字列に展開する
式展開 

..

範囲オブジェクト(両切り)
 

...

範囲オブジェクト(片切、大きい方は含まれない) 

:str

シンボル

str:

シンボルを使ってハッシュ定義するときに有効

<<

配列への要素の追加(push)と同等

?

メソッド名の最後 = 真偽値を返すメソッド。メソッドの戻り値が true or false。述語メソッド、あるいは述語とも呼ぶ(p34)
文字の直前 = 文字リテラル、1文字だけを含む文字列を生成する(p65)
 

{......}

ブロックの指定。do ...... end と同等

{  "key"=>"data", ... }

ハッシュの定義

|foo|

foo をブロック変数として渡す

 

nil と false 以外は true 

0 も true !!!