2012-05 << 2012-06 >> 2012-07

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とか書き換えて自分好みにしていたけど,最近は素のまま使ってます.