[INDEX] [TOP]

バッチファイルで私設CDコマンド

ここでは、Windows2000/XP のコマンドプロンプトで使用できる標準コマンド CD とちょっと毛色の違うディレクトリ移動のコマンド ncd.bat を紹介します。

ncdってご存じですか
ncd.bat を作ってみた
改善できるか?(ToDo)

ncdってご存じですか

その昔、まだDOS/VでDOS 5 が全盛の頃の話。そのころマックからノートン先生が Norton Utility というソフトをひっさげて Norton Utility for DOS としてやってきました。そのユーティリティソフトには有名どころの unerase というのがあってうっかり del しちゃったファイルを復活してくれるのでよく使われてました。そのユーティリティ群の中にあったコマンド Notron Change Directory (ncd.exe)というのがこれまた便利でして、記憶では(あくまで記憶では)

ncd dirname
で dirnameに一致するディレクトリに移動。複数存在する場合はリストを出して、キー入力で移動。また単に ncd だけを打つと、エクスプローラバーのフォルダ表示のようにツリー表示されてカーソルで移動できたように思います(ここらへん FD とか FILMTN とごっちゃになっているかもしれない)。
 難点としては、高速でディレクトリを移動できるようにルートディレクトリにインデックスファイルを作成してしまいます。(これは確か FILMTN もおなじだったはず)

先日会社の PC の BIN フォルダ(これは昔 Dynabook J-3100SS のころからのバッチやsedなんかが入っているフォルダ。XP マシンになってからは開店休業状態)を見てみると、ncd.bat と ncd.awk ってのを発見。「そうそう、ncd.exe をまねてそれなりにつくったっけ。」と思い、awk のソースを眺めてみたが、もう自分で書いたソースなのに動きが読み取れん状態。たぶんディレクトリの一致に正規表現を使えるから awk を使ったのかと思い出す程度。
「いまなら、findstr 使ったらできるかなぁ。」と思い立ち作ったのが私設CDである二代目 ncd.bat です。

ncd.bat を作ってみた。

若干修正して何とか形になったのが以下のリストです。最初に ncd.bat をパスの通ったディレクトリにコピーしてください。システムフォルダでもどこでもかまいません。

つぎに、ncd とタイプします。まずはインデックスファイルを作成します。ソースではCドライブを対象としています(ここらへん改善の余地有りですね)。これは単純にディレクトリのリストを作成するので1分から数分かかる場合もあります。

インデックスファイルができたら使ってみましょう。

C:¥Documents and Settings¥jak-san¥My Documents>ncd win

C:¥WINDOWS>

という風に使います。findstr で検索しているので正規表現を使うこともできます。(ただし、大文字/小文字は同一視しています) たとえば ncd driv.*etc で C:¥WINDOWS¥system32¥drivers¥etc に移動したりします。

-w オプションで強制的にインデックスの作成、-l オプションをつけてディレクトリ名(の一部)を指定すると、一致するパスの一覧を表示します。-l だけで何も指定しないとインデックスファイルの表示となります。

当初バージョンでは一時ファイルであるリストファイルを作らなかったのですが、ディレクトリ名に2バイト文字(漢字など)を指定してかつ Windows 2000 の場合旨く動かない(otnさんのブログ for文のバグ です)ため一時ファイルとしました。エレガントではありませんが、私は一時ファイルを苦にしないほうなのでヨシとします。

@echo off
set index="%temp%¥NCD.DIR"
set listf="%temp%¥NCD.LST"
set flag=0
set pwd=

if /%1==/-w goto write
if not exist %index% goto write
if /%1==/¥ pushd ¥
if /%1==/¥ goto exit
if /%1==/ goto noarg
if /%1==/-l shift

:start
findstr /I  "¥¥%1[^¥¥]*$" %index%>%listf%
if /%0==/-l (
   more %listf%
   goto exit
)
for /F "usebackq delims=" %%p in ( %listf% ) do call :sub "%%p"
if defined pwd pushd %pwd%
goto exit

:sub

if not defined pwd (
  set pwd=%1
)
if %flag% EQU 1 (
   set pwd=%1
   set flag=exit
)
if /I "%cd%"==%1 set flag=1

goto :EOF

:write
echo:
echo インデックスを作成します。しばらくお待ち下さい。-- %index%
dir C:¥ /A:D /S /B >%index%
:ソートする場合
:dir C:¥ /A:D /S /B | sort >%index%
:Dドライブも検索する場合
:dir D:¥ /A:D /S /B >>%index%
echo インデックスを作成しました。-- %index%
echo:

:noarg
echo:
echo    ncd Ver0.93 (c) jak-san , 2000-2008
echo:
echo    ncd [-w] [-l] pathname 
echo:
echo    pathname は目的ディレクトリ名(先頭一部分でも可能)
echo    -w       はインデックスを作成します。
echo    -l       は pathname に一致するディレクトリのリストを表示
echo:
echo:

rem    0.90 awk      Ver. (win95/98/Me)
rem    0.91 findstr  Ver. (2000/XP)
rem    0.92 listfile Ver. (2000 for文バグ対応)
rem    0.93 環境変数temp,indexを使うように変更(Vista)

:exit

改善できるか?(ToDo)

とりあえず作ったのですが、結構この状態で満足しており以下のような改良も作るかどうかわかりません。気に入った方はいろいろとカスタマイズして使いやすくなったら逆にソース見せてください。


Copyright (c) 2006-2008 じゃく
last update:2008-11-17