これは、コマンドプロンプト(cmd.exe) Advent Calendar 2015 - Qiitaの23日目の記事です。※Windows 10 Home 64bit 搭載のcmd.exeにて検証を行っています。
さて、うちのメインマシンはLinuxでもMac OS XでもなくWindowsなんですが、数ヶ月に1回くらいのペースで再インストールしたくなるので、それに合わせて環境構築用のBATファイルを常用しています。

構成

ざっくり、以下のような構成です。


セットアップ

ファイルサーバ上で実行し、諸々をインストールする

  • Installer
  • Software-ZIP
同期

フォルダごと端末へコピーし、その上でジャンクションを張ったりする

  • 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
<?xml version="1.0" encoding="utf-8"?>
<packages>
	<package id="lhaplus" />
	<package id="git" />

	<package id="google-chrome-x64 " />
	<package id="firefox" />
	<package id="flashplayerplugin" />
	<package id="skype" />
	<package id="line" />
	<package id="mpc-hc" />
	<package id="evernote" />

	<package id="atom" />
	<package id="imagemagick" />
	<package id="paint.net" />
	<package id="inkscape" />
	<package id="gimp" />
	<package id="audacity" />
</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でジャンクションを作成します。


  • #SETUP_by_USER.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でジャンクションを作成します。


  • #SETUP_by_USER.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のあるフォルダへのジャンクションを作成します。
※ついでに環境変数の設定も行います

  • #SETUP_by_USER.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のあるフォルダへのジャンクションを作成します。

  • #SETUP_by_USER.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します。


  • list.txt
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と、出力先(相対パス)をスペースで区切ったリストです

  • #SETUP_by_USER.bat
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@echo off

set LIST=%~dp0list.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

※スクショのある場所とない場所がありますが、お察しください。