2008-12-26[n年前へ]
■任意ファイル(場所)からコマンドプロンプトを出してみよう
スクリプトを使ってデータ処理等をする場合、「任意のフォルダからコマンドプロンプトを開いて」処理作業をすることが多いものです。「任意のフォルダからコマンドプロンプトを開く」のはWindows レジストリにキーを一個追加すれば良いだけですから、この「任意のフォルダを起点としたコマンドプロンプト」を使っている人も少なからずいることでしょう。
ところで、そんな人たちの何割かは、「任意のフォルダを右クリックしてコマンドプロンプトを出すのではなく、任意のファイルを右クリックして、そのファイルがいるフォルダを起点としたコマンドプロンプトを出したい」と思うことがあるのではないでしょうか。フォルダウィンドーを開いて作業しているときに、そのフォルダでスクリプト処理などをしたくなってコマンドプロンプトを開きたくなっても、(左にツリービューが表示されたエクスプローラでないと)1階層だけ上に戻らないと、コマンドプロンプトを開くコンテキストメニューを表示させることができないからです。
そこで、任意のファイルを右クリックすることで、そのファイルがいるディレクトリを起点とするコマンドプロンプトを出すスクリプトを作ってみました。
作ったといっても、RubyやPerlといったスクリプト言語をインストールしている人であれば(Windowsデフォルトの機能だけでもできそうですが)、90秒もあればスクリプト書きも設定作業もすべて終わるほどの簡単なものです。どのようなものかというと、送る("SendTo")メニューに「コマンドプロンプトを立ち上げ、送りつけられたファイルがあるディレクトリに移動する」という処理をするスクリプト(バッチファイル)へのショートカットを入れておくわけです。
Ruby で書くなら
system 'cmd.exe /k "cd '+ARGV[0].sub(/\\[^\\]*?$/,'')+'"'という具合のスクリプトを書き、(たとえば)cmdfromanywhere.rbといった名前で保存した上で、
ruby cmdfromanywhere.rb %1という内容のバッチファイルを作り、そのバッチファイルへのショートカットを"送る"="SendTo"ディレクトリ(Windows Vistaの場合には、"送る"="SendTo"ディレクトリは " C:\Users\ユーザ名\AppData\Roaming\Microsoft\Windows\SendTo"になります。また、それ以外だと"C:\Documents and Settings\ユーザ名\SendTo"辺りです)に置いて、バッチファイルへのショートカットを”コマンドプロンプト”という名前にでもしておけば良いのです。
これで任意のファイルを右クリックし、コンテキストメニューから”コマンドプロンプト”に「送る」と、そのフォルダを起点としたコマンドプロンプトが立ち上がるようになります。
2008-12-29[n年前へ]
2009-06-04[n年前へ]
■Windows VISTAとXPの「バッチファイルの動き方」の違い
Windowsでファイルを加工するスクリプトを作り、処理するファイルをドラッグアンドドロップして使うことができるように、バッチファイル(*.bat)を書いた。つまり、たとえば、こんなようなバッチファイルを書いた。
perl hoge.pl %1ところが、こんなバッチファイルを使おうとすると、Windows VISTA では意図した通りに動くのに、Windows XPでは動かないのである。
その原因を追いかけてみると、バッチファイルを起動したときの挙動がWindowsのバージョンによって異なっていることが原因だった。あるいは、コマンドプロンプトのカレントディレクトリがどうなっているかを、私が意識していなかったことに原因があった。
どういうことかと言うと、Windows VISTA では、バッチファイルをダブルクリックした時には、そのバッチファイルがあるディレクトリを「カレントディレクトリ」として起動したコマンドプロンプト内でバッチファイルに書かれた内容が処理される。ところが、バッチファイルにファイルをドラッグアンドドロップすると、そのバッチファイルは「ドラッグアンドドロップしたファイルがあるディレクトリ」をカレントディレクトリとして、コマンドプロンプトが起動し処理が行われる、という挙動になる。
しかし、Windows XP では、『バッチファイルをダブルクリックすると、そのバッチファイルがあるディレクトリを「カレントディレクトリ」として起動したコマンドプロンプト内でバッチファイルに書かれた内容が処理される』というところまでは同じなのだが、バッチファイルにファイルをドラッグアンドドロップした場合には、そのバッチファイルは"C:\Documents and Settings\ユーザ名"をカレントディレクトリとして起動したコマンドプロンプト内で処理されるのである。そういう違いがVISTAとXPのバッチファイルの間にはあった。
先のバッチファイルの場合、バッチファイルから呼ばれるスクリプトが、「バッチファイルがあるディレクトリがカレントディレクトリである」ことを前提としていたので、Windows VISTA では動くのに、Windows XPでは動かない、ということが起きた。
いつものように、「思い込み」は危険だと思うと同時に、コマンドプロンプトやバッチファイルの沼も結構奥が深そうだ・・・と今さらながら感じたのである。このコマンドプロンプトやバッチファイルの「沼」に足を踏み入れてみるべきか、あるいは近寄らないようにするべきか・・・それが問題で思い悩んでいる。
2010-09-12[n年前へ]
■WindowsのコマンドプロンプトのCOPYコマンドの結合順序の謎
以前から、時折思い返す疑問が「Windowsのコマンドプロンプトから動かすCOPY copy a.txt+b.txt c.txt と入力すると、a.txtの後ろにb.txtを結合した結果をc.txtとして作成する、…はずだと思っています。バイナリファイルのオプション/Bを付けなければ、ファイル途中のEOFは削除され・末尾にEOFが一個付くように処理され、/Bを付けると、
copy /b a.txt+b.txt c.txtEOFの除去・付加処理がなされない、という具合に動くのだと、最初は思っていました。
しかし、COPYコマンドを使っていると、ファイルの結合順序が、指定した順番になっていないことも多いことに気が付きました。結合されたファイルは、何だか妙な具合にシャッフルされていることがあるのです。
最初は、何かの不具合で(テキスト)ファイルの途中にEOFが入り込んでいるせいかと考えました。そこで、/Bオプションを付けてみましたが、それでも、指定したはずの順番でファイルの内容が並んではくれないのです。
思うように動いてくれたとしたら、COPYコマンドはとても便利だと思うのですが、思うように動いてくれないとただの使えないコマンドになってしまいます。WindowsのコマンドプロンプトのCOPYコマンドの結合順序はどのように決まっているのでしょうか?思いのままに動かそうとしたならば、どのように使えば良いのでしょうか? その答えをご存知の方がいらっしゃいましたら、教えて頂ければ幸いです。