現在業務で使用しているサーバはwindows server 2008 R2 64bitである。
そのサーバでwebアプリをビルドして社内に公開しているのだが、どうしても納得がいかないことがある。
公開のおおまかな流れは以下のとおり。
- ビルド先にあるファイル、フォルダの削除
- ビルド(%windir%/Microsoft.NET/Framework/aspnet_compiler.exe使用)
- 公開用フォルダのファイル、フォルダの削除
- ビルドしたファイルを公開用フォルダにコピー
各処理をそれぞれbatに記述して、改修後に公開しているのだが。
実はこの各bat、1つ1つマウスで実行している。
おそらく多くの方が、「別のbatで1から順にCALLで呼べばよい」と思うだろう。
私もそう思う。だが、どういうわけか、その方法を取ると2のビルド結果がマウスでの実行結果と異なるのだ。具体的に言うと、ビルドで出来上がるファイルが1つ1つ実行した場合より少ない。
まず私は、2のbatに記述したコマンドが間違っているのではないかと思った。そこでbatに記述したコマンドをコマンドラインに打ち込み実行してみた。その結果は・・・・・・期待通りの動作だった。コマンドは正しいようだ。
次に疑ったのが、各batの実行順序だ。現在、CALLでbatを呼んでいる。Google先生によれば、CALLで呼んだ処理が終わるまで、次の処理には入らない、らしい(前処理を待つ必要がなければSTARTを使えばいいらしい)。
そこで、下記のように各batを呼ぶ前にpauseを挟んだ。上から下に処理が走っていれば、3回のキープレスで処理は終わる。
CALL 1.bat
pause
CALL 2.bat
pause
CALL 3.bat
pause
CALL 4.bat
数回実行してみたところ、どうもこの疑問が正解だったようだ。というのも、1つ目のbat終了後、最初のpauseに入る前に2.batが実行される。
しかしbat実行の順番、あるいは結果が終わる順番のせいだというなら、それを制御するためにCALLを使っているのに制御できていないということになる。あるいはaspnet_compilerだからなのか。今回の現象とは異なるところでbug報告も上がっているようだった。
正直これ以上私には分かりそうにない。もしこの現象についてご存知のかたがいらっしゃればぜひ教えていただきたい。
【2015/02/04 追記】
わかったのでご報告。
原因はマカフィーのオンアクセススキャン。
どうも、このオンアクセススキャンが有効になっていると、aspnet_compiler(というよりかはプリコンパイルだろうか)がNullReferenceExceptionを吐く場合があるらしい。海外サイトにそういった投稿がいくつかあった。
試しに無効にして上記batを走らせると、何度やっても実行結果が変わらない。そしてその結果は期待通り。つまりこいつのせいだった。(数カ月前の私の憶測ははずれもいいところだった。)