2012-06-23 (土)
*cmd.exeの使い方
Windows使ってるエンジニアの多くの人がcygwin入れたりVM起動したりしてるみたいですが,cygwinもVMもWindowsじゃないと思うし,それなら最初からWindows消してLinuxとかで良いと思ってしまいます.
というわけで,Windowsユーザを名乗るなら,ちゃんとcmd.exe上で作業するべきです.
ckw.exe
まず,素のコマンドプロンプトは使い物にならないので,ckwを拾ってきてインストール.コンソールが変わっただけでシェルはcmd.exeです.
一時期,色々な人がパッチを当ててたバージョンを作ってて,どのパッチに何が入ってるのか確認するのが面倒だったのですが,今は大丈夫っぽい.
https://github.com/deflis/ckw-mod/wiki/
cd.bat
ホームディレクトリに戻ろうとしてpwdな動作して悲しくなるcdコマンドはバッチファイルを書きましょう.cdはcmd.exeの組み込みなので,バッチファイル作っただけでは起動できませんが,DOSKEY使えば組み込みコマンドも置き換えられる.
@echo off if %1. == . cd /d %HOMEDRIVE%%HOMEPATH% && goto end cd /d %1 :end title %CD% exit /B
date.bat
日付知りたいだけなのに,時計変更しようとするdateコマンドとかも,DOSKEYの力を借りてバッチファイルに置き換えます.
@echo off @setlocal if %1. == . ( for /F "usebackq" %%s in (`date /T`) DO SET DATE=%%s for /F "usebackq" %%s in (`date /T`) DO SET TIME=%%s echo %DATE% %TIME% ) else ( date %* ) exit /B
ls.bat
dirコマンドの引数もいつまでたっても覚えられないので,ls.batを作る.
@echo off setlocal set prm=_ if /i "%1"=="-l" shift /1 && set prm=/Q if /i "%1"=="-a" shift /1 && set prm=/W /A if /i "%1"=="-la" shift /1 && set prm=/Q /A if "%prm%"=="_" ( for /F "usebackq" %%t IN (`dir /B %*`) do ( set /P X="%%t " <NUL ) echo. ) else ( dir /ON %prm% %1 %2 %3 )
cmdrc.bat
あとはckwを起動するときに,以下のようなcmdrc.batを実行するようにしておけば大丈夫.
rm,mv,cp,pwdなどは,DOSKEYでエイリアスを作りましょう.
@echo off DOSKEY cd=C:\bin\cd.bat $* DOSKEY settime=time $* DOSKEY time=C:\bin\time $* DOSKEY date=C:\bin\date $* DOSKEY pwd=cd DOSKEY mv=ren $* DOSKEY rm=del $* DOSKEY cp=copy $* DOSKEY env=set DOSKEY ll=ls -l prompt %USERDOMAIN%%% set PATH=C:\bin;%PATH% cd.bat .
sudo,su
最近のWindowsだと,たまに管理者権限が欲しくなるので,suやsudoが欲しくなります.バッチファイルでは手が出ないのでここはWSHで.
sudo_.js
function sudo(cmd, args) { var shell = WScript.CreateObject("Shell.Application") shell.ShellExecute(cmd, args, "", "runas") } if (WScript.Arguments.Count() > 0) { var args = ""; for (var i = 1; i < WScript.Arguments.Count(); i++) { args += "\"" + WScript.Arguments(i) + "\" "; } sudo(WScript.Arguments(0), args ); } else { WScript.Echo("usage: sudo COMMAND [PARAMS]"); }
sudo.bat
@echo off cscript //nologo "%~dpn0_.js" %*
残念ながら同じコンソールでは実行できず,別ウインドウが開きます.suはsudoを使ってckwを新たに起動しとく.
他
kill,ps,sleep,time,uptimeなどはそれっぽいプログラム書いてC:\binとかに置く.他にも,catとか #.exeとか [.exeとかも作ると良いです.
バッチファイルだと,別のバッチファイルから呼び出すときに少し不便なので,余裕があれば同名の.exeとかも作ったり.perlとかrubyでも良いですが.
sshとscpはPuTTYに入っているやつをリネームして使ってます.
grep,diff,find,patchあたりは,たぶんWindows用のものがダウンロードできるのでそれを入れておきましょう.
vistaやwin7からは,mklinkが使えるので,lnコマンドもバッチファイルだけで実現可能でうれしい.
そのうちgithubとかに大量のバッチファイル類を上げておこう.
ただ,10年以上使っているうちに,かなり変なバッチファイルが増えてカオスになってるし,時期によってバッチファイル以外にも,C++,perl,ruby,hspだったりで書かれてて,メンテナンス性がとても悪いのが難点……
6/24 追記:http://itsme.home.xs4all.nl/projects/misc/patching-cmdexe.html以前はcmd.exeとかcommand.comとか書き換えて自分好みにしていたけど,最近は素のまま使ってます.