これは、コマンドプロンプト(cmd.exe) Advent Calendar 2015 - Qiita の23日目の記事です。※Windows 10 Home 64bit 搭載のcmd.exeにて検証を行っています。
さて、うちのメインマシンはLinuxでもMac OS XでもなくWindowsなんですが、数ヶ月に1回くらいのペースで再インストールしたくなるので、それに合わせて環境構築用のBATファイルを常用しています。
構成
ざっくり、以下のような構成です。
セットアップ
ファイルサーバ上で実行し、諸々をインストールする
同期
フォルダごと端末へコピーし、その上でジャンクションを張ったりする
profile
Roaming
usr
Git-repos
work
セットアップ
Installer
これは、chocolateyのためのパッケージ一覧と、インストーラのexe、そしてそれらを動かすプロビジョニング用BATで構成されています。
#pckage.config (chocolateyのためのパッケージ一覧)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
& lt ; ? xml version = "1.0" encoding = "utf-8" ? >
& lt ; packages >
& lt ; package id = "lhaplus" / >
& lt ; package id = "git" / >
& lt ; package id = "google-chrome-x64 " / >
& lt ; package id = "firefox" / >
& lt ; package id = "flashplayerplugin" / >
& lt ; package id = "skype" / >
& lt ; package id = "line" / >
& lt ; package id = "mpc-hc" / >
& lt ; package id = "evernote" / >
& lt ; package id = "atom" / >
& lt ; package id = "imagemagick" / >
& lt ; package id = "paint.net" / >
& lt ; package id = "inkscape" / >
& lt ; package id = "gimp" / >
& lt ; package id = "audacity" / >
& lt ; / packages >
###SETUP_by_ROOT.bat (プロビジョニング用BAT)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@ echo off
pushd " %~dp0 "
SET PATH = %PATH% ;%ALLUSERSPROFILE% \chocolatey\bin
echo .
echo --- Chocolateyによるインストール ---
@ where choco
if errorlevel 1 powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))"
cinst -y "#packages.config"
echo .
echo --- 自動・手動インストール ---
for %% i in (
"teraterm-4.86.exe /SILENT /LOADINF=teraterm.inf"
SourceTreeSetup_1.6.14.exe
TeamFileSet64-2.1.143.2013.exe
GoogleJapaneseInputSetup.exe
wlsetup-web.exe
msys2-i686-20150916.exe
LplsShlx64-v1.0.1.0\install.cmd
) do (
echo " %% ~i"
start /w " %% ~i" %% ~i
)
pause
管理者でBATファイルを殴ると、Chocolateyによるインストールが実施され、その後同じフォルダ内にある指定されたインストーラが順番に起動します。インストーラはちょいちょい手作業が必要です。手動の作業が混ざっていて悲しいですね。
Software-ZIP
これは、インストールしなくても使用できるソフトウェアのZIPファイルと、それらを解凍するプロビジョニング用BATで構成されています。
####SETUP_by_USER.bat (プロビジョニング用BAT)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@ echo off
pushd " %~dp0 "
set DESTDIR = C:\Software
set LOGFILE = %DESTDIR% \log.txt
SET PATH = %PATH% ;%ALLUSERSPROFILE% \chocolatey\tools
REM make directory
if not exist %DESTDIR% mkdir %DESTDIR%
for /f "usebackq tokens=*" %% i in ( `dir /b *.zip` ) do (
if not exist " %DESTDIR% \ %% ~ni" (
echo 7za x " %% ~i" -o" %DESTDIR% \"
7za x " %% ~i" -o" %DESTDIR% \" >> " %LOGFILE% "
echo .
)
)
pause
一般ユーザでBATファイルを殴ると、C:\Software にディレクトリを作成し、同じフォルダ内にある全てのZIPファイルをそこに解凍してくれます。こっちは全自動です。
同期
profile
ここには %USERPROFILE% 以下のフォルダが格納されており、プロビジョニング用BATでジャンクションを作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@ echo off
set ROOT = %~dp0 .
set BKUPDIR = ●init.%DATE:/=%
cd /d %USERPROFILE%
if not exist %BKUPDIR% mkdir %BKUPDIR%
@ echo on
@ for /f "usebackq tokens=*" %% a in ( `dir /b /ad %ROOT% ` ) do (
move %% a %BKUPDIR% \
mklink /j %% a %ROOT% \%% a
)
pause
Roaming
ここには %USERPROFILE%\AppData\Roaming 以下のフォルダが格納されており、プロビジョニング用BATでジャンクションを作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@ echo off
set ROOT = %~dp0 .
set BKUPDIR = ●init.%DATE:/=%
cd /d %USERPROFILE% \AppData\Roaming
if not exist %BKUPDIR% mkdir %BKUPDIR%
@ echo on
@ for /f "usebackq tokens=*" %% a in ( `dir /b /ad %ROOT% ` ) do (
if exist " %% ~a" move " %% ~a" %BKUPDIR% \
mklink /j " %% ~a" " %ROOT% \ %% a"
)
pause
usr
プロビジョニング用BATで、C:\usr からこのBATのあるフォルダへのジャンクションを作成します。
※ついでに環境変数の設定も行います
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@ echo off
set SRC = %~dp0
set DEST = C:\usr
if exist %DEST% (
echo %DEST% はすでに存在します
pause
exit
)
@ echo on
mklink /j %DEST% %SRC%
setx ROOT C:\usr
setx HOME %ROOT% \home
setx PATH " %PATH% ; %ROOT% \lnk; %ROOT% \bin"
pause
work
プロビジョニング用BATで、C:\work からこのBATのあるフォルダへのジャンクションを作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@ echo off
set ROOT = %~dp0
cd /d C:\
if exist work (
echo C:\work はすでに存在します
pause
exit
)
@ echo on
mklink /j work %ROOT%
pause
Git-repos
ここには C:\Git-repos (Gitリポジトリ置き場) 以下にgit cloneしたいリポジトリのリストが置かれており、プロビジョニング用BATでgit cloneします。
1
2
3
4
5
6
7
8
git@github.com:kunst1080/AnubisGG.git kunst1080/AnubisGG
git@github.com:kunst1080/BatLibrary.git kunst1080/BatLibrary
git@bitbucket.org:kunst1080/musics.git kunst1080/musics
git@github.com:kunst1080/vm-install-freebsd.git kunst1080/vm-install-freebsd
git@bitbucket.org:tsukiusagi_pj/lych.git tsukiusagi_pj/lych
https://github.com/playframework/playframework.git playframework/playframework
https://github.com/hakobera/nvmw.git hakobera/nvmw
https://github.com/usp-engineers-community/Open-usp-Tukubai.git usp-engineers-community/Open-usp-Tukubai
※git cloneするURLと、出力先(相対パス)をスペースで区切ったリストです
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@ echo off
set LIST = %~dp0 list.txt
set DESTDIR = C:\Git-repos
set GIT = "C:\Program Files (x86)\Git\bin\git.exe"
REM make directory
if not exist %DESTDIR% mkdir %DESTDIR%
REM Git clone
cd /d %DESTDIR%
for /f "usebackq tokens=1,2" %% a in ( `type " %LIST% "` ) do (
echo git clone %% a %% b
%GIT% clone %% a %% b
echo .
)
pause
※スクショのある場所とない場所がありますが、お察しください。