これは、コマンドプロンプト(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" /> <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)
```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('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)
```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ファイルをそこに解凍してくれます。こっちは全自動です。

### 同期
#### profile ここには %USERPROFILE% 以下のフォルダが格納されており、プロビジョニング用BATでジャンクションを作成します。

  • #SETUP_by_USER.bat
```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 ```
#### usr プロビジョニング用BATで、C:\usr からこのBATのあるフォルダへのジャンクションを作成します。
※ついでに環境変数の設定も行います
  • #SETUP_by_USER.bat
```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 ```
#### Git-repos ここには C:\Git-repos (Gitリポジトリ置き場) 以下にgit cloneしたいリポジトリのリストが置かれており、プロビジョニング用BATでgit cloneします。

  • list.txt
``` 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
```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 ```※スクショのある場所とない場所がありますが、お察しください。