つい最近、実際に遭遇した問題。
カレントディレクトリにはフォルダが一つだけある。このフォルダに移動するにはどうしたらいいか。ただし、フォルダ名はわからないものとする。
要するに、一つ下の階層に移動すればいいだけである。簡単そうに感じると思うが、これが意外とややこしいのだ。ヒントはこの記事のタイトル。
さっそく答え合わせをしていこう。
カレントディレクトリから一つ上の階層に移動するのなら簡単だった。cdコマンドには親ディレクトリを指す..という便利なオプションがあるからだ。
rem 親フォルダに移動 cd ..
一方、下の階層に移動するオプションはなく、ディレクトリ名を指定するしかない。もし最初の一文字だけでもわかっているならワイルドカードを使えるのだが、ワイルドカードだけでは機能しない。
rem これはNG cd ./*
でも大丈夫。ディレクトリが一つしかない場合は、名前を特定することが可能なのだ。次のコマンドは、カレントディレクトリにあるディレクトリ名を返す。複数のディレクトリがある場合は、1行に1つずつ表示される。
dir /a:d /b
となれば、こういうことをしたくなるだろう。
cd dir /a:d /b
しかし上のコマンドは期待通りに動作しない。ではこれならどうか。
set child=dir /a:d /b cd %child%
最初に触れた「コマンドの返値を変数に入れる」という処理である。これができれば楽なのだ。だが残念ながら期待通りには動作しない。
別にできないってわけじゃない。方法は、ある。興味のある方は調べてみるといい。forループで何かする方法がヒットするはずだ。
検索上位に来るくらいだから、たぶん正攻法なのだろう。それはいいが、コマンドプロンプトのforループってめちゃくちゃわかりにくい。今さら理解したところで次に使うときには忘れてるだろうし、あとからコードを読める自信もないからforループは知らなくていいや。
おっと、話を戻そう。
少し冗長にはなるが、もっと直感的にやる方法があるということを書きたかったのだ。
rem コマンドの返値をファイルに書き込む dir /a:d /b > temp.txt rem ファイルから読み込んだテキストデータを変数に入れる set /p child=<temp.txt rem 証拠隠滅 del temp.txt rem 目的のフォルダに移動 cd %child%
ディレクトリ名をファイルに書き出し、ファイルからディレクトリ名を読み込んで変数に入れるのだ。ファイルを削除すれば証拠は残らない。
この方法はこれまでも何度か使ってきたテクニックなのだが、それがいざ必要になったときいつも忘れて時間を溶かしてしまう。今回はブログの記事にしたから、ちょっとは記憶に残ってくれるといいのだが。
0 件のコメント:
コメントを投稿