TIPS

Windowsでシンボリックリンク

Link Shell Extensionを用いる. 対応する環境のファイルをダウンロード,インストール後右クリックメニュー,右ドラッグメニューから作成できる.

コマンドプロンプト

コマンドプロンプトでpatch

  • GNU patchを使用する場合
    1. GNU patchをプログラミング・ツール(移植ソフト)からダウンロード.
    2. 解凍して"patch.exe"をパスの通ったフォルダにコピー.
    3. コマンドプロンプトから
      patch -v
      と打って,バージョン情報が出ればOK.
      • パッチをあてる
        patch < test.patch
      • パッチを外す
        patch -R < test.patch
  • TortoiseSVNを用いる場合 patch,diffファイルを右クリック,
    TortoiseSVN -> パッチを適用

コマンドプロンプトでls

Windows Service For UNIXGowを導入する.

Windowsで使えるコマンド

pushd,popd

コマンドプロンプトでフォルダを移動するときは,

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すると割り当てられたドライブは解放される.

ネットワークドライブの割り当て

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)

環境変数

  • %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表示説明
    %1"D:\Temp\bat\test 1.txt"引数
    %~1D:\Temp\bat\test 1.txt""の削除
    %~f1D:\Temp\bat\test 1.txt完全修飾パス
    %~d1D:ドライブ名
    %~p1\Temp\bat\フォルダ名
    %~n1test 1ファイル名(拡張子なし
    %~x1.txt拡張子
    %~s1D:\Temp\bat\TEST1~1.TXTMS-DOSファイル名(8.3)
    %~a1--a------ファイル属性
    %~t12010/02/10 17:29ファイル更新日時
    %~z1290ファイルサイズ

システム環境変数

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% : 一時作業ディレクトリ

コマンド

  • rem : コメント
    rem コメント
  • echo : メッセージ表示
    echo メッセージ
    echo offとするとその行以下のコマンドが表示されなくなるので, 基本的にはバッチファイルの行頭で
    @echo off
    と書く.@はその行のコマンドを表示しないようにするためのもの.
  • pause : その位置でストップして「続行するには何かキーを押してください...」というメッセージを出す.
  • call : 他のバッチファイルを呼び出す
    call test2.bat

ユーザ入力

  • ユーザ入力 : ユーザからのキー入力は,
    set /p X="入力してください : "
    echo %X%
    

条件分岐

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ループ

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でカウントアップされる.

四則演算

"set /a"を使うと四則演算ができる.

set /a X=20
set /a Y=X+1
set /a Z=X%%7

上から代入,加算,剰余を計算している. バッチファイルでは%は特別な意味があるので,剰余には%%が使われる.

環境変数の遅延展開

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
    を使って,必要なところだけ有効にする.

バッチファイルの例:ファイルコピー

適当なテキストファイルを作成して,拡張子を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個おきにコピー

@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にコピーする.


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-03-08 (金) 18:06:07