#contents *TIPS [#x63b921a] **Windowsでシンボリックリンク [#r61957d6] [[Link Shell Extension:http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html]]を用いる. 対応する環境のファイルをダウンロード,インストール後右クリックメニュー,右ドラッグメニューから作成できる. *コマンドプロンプト [#c39564aa] ***コマンドプロンプトでpatch [#uf71261d] -GNU patchを使用する場合 ++GNU patchを[[プログラミング・ツール(移植ソフト):http://cetus.sakura.ne.jp/softlab/toolbox1/index.html]]からダウンロード. ++解凍して"patch.exe"をパスの通ったフォルダにコピー. ++コマンドプロンプトから patch -v と打って,バージョン情報が出ればOK. ---パッチをあてる patch < test.patch ---パッチを外す patch -R < test.patch -TortoiseSVNを用いる場合 patch,diffファイルを右クリック, TortoiseSVN -> パッチを適用 ***コマンドプロンプトでls [#v711a392] [[Windows Service For UNIX:http://www.microsoft.com/japan/windows/sfu/]]や[[Gow:https://github.com/bmatzelle/gow/wiki/]]を導入する. ***Windowsで使えるコマンド [#scfce4f9] -[[Windowsコマンド集:http://itpro.nikkeibp.co.jp/free/NT/WinKeyWord/20040805/1/]] ***pushd,popd [#m0a7dbd7] コマンドプロンプトでフォルダを移動するときは, cd d:\temp のように通常 cd コマンドを使うが,cdの代わりにpushdを用いると popdコマンドで以前のフォルダに戻ることができる. 例えば,現在"C:\Windows\System32"にいて,"d:\temp"に移動してまた戻るという作業は以下のようになる. C:\Windows\System32>pushd D:\Temp D:\Temp>popd C:\Windows\System32> ディレクトリパスの情報はスタックにためられるので,何回か移動した後でも順番にたどって戻れる. D:\Temp\dir0>pushd ..\dir1 D:\Temp\dir1>pushd ..\dir2 D:\Temp\dir2>popd D:\Temp\dir1>popd D:\Temp\dir0> また,pushdの特別な機能として,ネットワーク上のパス(UNCパス,例えば"\\pc1\dir")にpushすると, 自動的にそのパスをネットワークドライブとして割り当てるという機能がある. 例えば, D:\Temp>pushd \\enterprise\data Z:\>net use 新しい接続は記憶されます。 ステータス ローカル名 リモート名 ネットワーク名 ------------------------------------------------------------------------------- OK Z: \\enterprise\data Microsoft Windows Network コマンドは正常に終了しました。 Z:\>popd D:\Temp>net use 新しい接続は記憶されます。 一覧にエントリが存在しません。 popdすると割り当てられたドライブは解放される. ***ネットワークドライブの割り当て [#l59d3504] net useを用いる.割り当てるときは net use x: \\pcname\dir "x:"を"*"にすれば,空いているドライブ名に割り当てられる(最後から). 接続にユーザ名とパスワードが必要な場合は以下. net use x: \\pcnam\dir password /user:username 次回起動時に自動的に接続する場合は以下. net use x: \\pcnam\dir /persistent:yes 切断する場合は以下. net use x: /delete *バッチファイル(*.bat) [#n3169db1] ***環境変数 [#g1c34d71] -%0 : バッチファイル名 -%1〜%9 : それぞれ1番目から9番目の引数,ファイルをD&Dした場合ファイル名が順番に入る.全ての引数は%*で参照可. -%[変数名]% : 実際には環境変数として登録されるが,文字列や数値を格納するための変数としても利用できる.格納にはsetを用い,参照時は%で囲む. set X=1 set CH=Hello World echo %X% echo %CH% 環境変数の変更をバッチファイルのある範囲内でのみにローカライズするには,setlocalとendlocalで囲う. -ファイル名の分解 "D:\Temp\bat\test 1.txt"が引数で渡されたとき, |変数|echo表示|説明|h |%1|"D:\Temp\bat\test 1.txt"|引数| |%~1|D:\Temp\bat\test 1.txt|""の削除| |%~f1|D:\Temp\bat\test 1.txt|完全修飾パス| |%~d1|D:|ドライブ名| |%~p1|\Temp\bat\|フォルダ名| |%~n1|test 1|ファイル名(拡張子なし| |%~x1|.txt|拡張子| |%~s1|D:\Temp\bat\TEST1~1.TXT|MS-DOSファイル名(8.3)| |%~a1|--a------|ファイル属性| |%~t1|2010/02/10 17:29|ファイル更新日時| |%~z1|290|ファイルサイズ| ***システム環境変数 [#n7dd24d6] OS側で最初から定義されている環境変数.以下はWindows 7での代表的なもの. -%CD% : 現在のディレクトリ -%DATE% : 日付 -%TIME% : 時間 -%RANDOM% : 乱数[0,32767] -%PATH% : パスディレクトリ -%PATHEXT% : 実行可能ファイル拡張子 -%COMPUTERNAME% : コンピュータ名 -%OS% : OS名 -%USERNAME% : ログオンユーザ名 -%USERPROFILE% : ログオンユーザのホームディレクトリ(Windows 7だとC:\Users\ユーザ名) -%HOMEDRIVE% : ログオンユーザのホームドライブ -%HOMEPATH% : ログオンユーザのホームディレクトリ(ドライブ名はのぞく) -%APPDATA% : アプリケーションの設定などが格納されるディレクトリ(Windows 7だとC:\Users\ユーザ名\AppData\Roaming) -%SYSTEMDRIVE% : OSがインストールされたドライブ -%SYSTEMROOT%,%WINDIR% : OSがインストールされているディレクトリ(ドライブも含むフルパス).%WINDIR%はWindows 9x/Meの名残. -%PROGRAMDATA% : アプリケーションデータ格納ディレクトリ(C:\ProgramDataなど) -%PROGRAMFILES% : アプリケーションインストールディレクトリ(C:\Program Files (x86)など) -%TEMP%,%TMP$ : 一時作業ディレクトリ -%TEMP%,%TMP% : 一時作業ディレクトリ ***コマンド [#rb392c7f] -rem : コメント rem コメント -echo : メッセージ表示 echo メッセージ echo offとするとその行以下のコマンドが表示されなくなるので, 基本的にはバッチファイルの行頭で @echo off と書く.@はその行のコマンドを表示しないようにするためのもの. -pause : その位置でストップして「続行するには何かキーを押してください...」というメッセージを出す. -call : 他のバッチファイルを呼び出す call test2.bat ***ユーザ入力 [#t5992123] -ユーザ入力 : ユーザからのキー入力は, set /p X="入力してください : " echo %X% ***条件分岐 [#o1d5cd89] if 条件式 実行1 else 実行2 複数行にわたる場合は, if "%X%" == "fujis" ( echo OK ) else ( echo NG ) -ファイル,フォルダの存在確認 if existファイル名 実行1 else 実行2 if not existファイル名 実行1 else 実行2 使用例, if exist C:\test.txt ( echo OK ) else ( echo NG ) ***Forループ [#b424c226] for %%変数名 in (集合) do 実行 [実行パラメータ] コマンドラインで直接入力する場合は単純に%変数名でよいが,バッチファイルの場合は%%変数名としなければならない. -渡された引数全てを処理 for %%F in (%*) do ( echo %%F ) -Cのfor文のように変数をカウントアップ for /l %%X in (1,2,5) do ( echo %%X ) この例では%%Xが1から5まで増分2でカウントアップされる. ***四則演算 [#c6c3966f] "set /a"を使うと四則演算ができる. set /a X=20 set /a Y=X+1 set /a Z=X%%7 上から代入,加算,剰余を計算している. バッチファイルでは%は特別な意味があるので,剰余には%%が使われる. ***環境変数の遅延展開 [#u53092dd] for文やif文で以下のように括弧を使って処理を行うと,括弧を抜けるまでは処理内容が変数に反映されない. @echo off setlocal set X=0 for /l %%I in (1,1,5) do ( echo %X% set /a X=X+2 ) endlocal 実行結果は 0 0 0 0 0 これを解決するには, -サブルーチンで括弧を使わないようにする : 括弧を使う代わりにサブルーチンをfor文から呼び出すことで遅延を回避する.上記の例をサブルーチンを使って書き換えると以下のようになる. @echo off setlocal set X=0 for /l %%I in (1,1,5) do call :proc goto :end :proc echo %X% set /a X=X+2 goto :eof :end endlocal 実行結果は以下 0 2 4 6 8 -環境変数の遅延展開を使う : setlocal enabledelayedexpansion と記述し,変数を使用するときに%の代わりに!を使うと処理内容が反映される. @echo off setlocal enabledelayedexpansion set X=0 for /l %%I in (1,1,5) do ( echo !X! set /a X=X+2 ) endlocal 実行結果は以下 0 2 4 6 8 遅延展開をenableにした状態でファイル名に"!"が含まれるものを扱うとその部分が遅延展開されてしまうので注意. 解決策としては, setlocal disabledelayedexpansion を使って,必要なところだけ有効にする. ***バッチファイルの例:ファイルコピー [#j6fa5e28] 適当なテキストファイルを作成して,拡張子をbatにして,以下の内容を記述する. @echo off setlocal set DEST=D:\ echo copy files to %DEST% for %%F in (%*) do ( copy "%%F" "%DEST%" /V /Y ) endlocal pause batファイルに任意のファイル(複数でも可)をドラッグアンドドロップすると, DESTに設定されたパスにコピーする(上書きコピー). ***バッチファイルの例:ファイルをN個おきにコピー [#x9edb6ac] @echo off setlocal enabledelayedexpansion set DEST=E:\result\ set N=3 set IDX=0 set IDX3=0 echo copy files to %DEST% for %%F in (%*) do ( set /a IDX3=IDX%%N if !IDX3! == 0 ( echo %%F copy "%%F" "%DEST%" /V /Y ) set /a IDX=IDX+1 ) endlocal pause 上記の遅延展開を使っている. この例ではD%Dしたファイル群を3個おきにDESTにコピーする.