これは、コマンドプロンプト(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のためのパッケージ一覧)
``` <?xml version="1.0" encoding="utf-8"?> <packages> <package id="lhaplus" /> <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" />

</packages>

  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
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
<ul>
<li>###SETUP_by_ROOT.bat (プロビジョニング用BAT)</li>
</ul>```dosbatch
@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(&#39;https://chocolatey.org/install.ps1&#39;))"
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によるインストールが実施され、その後同じフォルダ内にある指定されたインストーラが順番に起動します。インストーラはちょいちょい手作業が必要です。手動の作業が混ざっていて悲しいですね。<br/>
<br/>


</div>
<div class="section">
    #### Software-ZIP
    これは、インストールしなくても使用できるソフトウェアのZIPファイルと、それらを解凍するプロビジョニング用BATで構成されています。<br/>
<br/> <ul> <li>####SETUP_by_USER.bat (プロビジョニング用BAT)</li> </ul>```dosbatch @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ファイルをそこに解凍してくれます。こっちは全自動です。<br/> <br/> </div> </div> <div class="section"> ### 同期 <div class="section"> #### profile ここには %USERPROFILE% 以下のフォルダが格納されており、プロビジョニング用BATでジャンクションを作成します。<br/>
<br/> <ul> <li>#SETUP_by_USER.bat</li> </ul>```dosbatch @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
```dosbatch @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

 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
</div>
<div class="section">
    #### usr
    プロビジョニング用BATで、C:\usr からこのBATのあるフォルダへのジャンクションを作成します。<br/>
※ついでに環境変数の設定も行います

<ul>
<li>#SETUP_by_USER.bat</li>
</ul>
```dosbatch @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
```dosbatch @echo off

set ROOT=%~dp0

cd /d C:\

if exist work ( echo C:\work はすでに存在します pause exit ) @echo on mklink /j work %ROOT% pause

 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
</div>
<div class="section">
    #### Git-repos
    ここには C:\Git-repos (Gitリポジトリ置き場) 以下にgit cloneしたいリポジトリのリストが置かれており、プロビジョニング用BATでgit cloneします。<br/>
<br/> <ul> <li>list.txt</li> </ul>``` 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と、出力先(相対パス)をスペースで区切ったリストです <ul> <li>#SETUP_by_USER.bat</li> </ul>```dosbatch @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 ```※スクショのある場所とない場所がありますが、お察しください。 </div> </div>