web-dev-qa-db-ja.com

コマンドラインからVisualStudioのシンプルビルドスクリプトを作成するにはどうすればよいですか?

複数のディレクトリ(すべて拡張子.sln)に多数のVisual Studioプロジェクトソリューションがあり、バッチファイルにリストされているすべてのソリューションを自動的にビルドする簡単なバッチスクリプトを作成したいと思います。

Visual Studio Command Prompt(次のコマンドが実行された単なるコマンドラインインスタンス)を起動することで、手動でソリューションを構築できます。

"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86

その後、次のように呼び出してプロジェクトをビルドします。

devenv "path\to\solutionFile\projectSolution1.sln" /build Debug

これによりプロジェクトがビルドされ(プロジェクトにエラーがないと仮定)、ビルドするプロジェクトごとにすすぎ、繰り返します。

ただしbuild.batというバッチファイルに次のものがある場合:

"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86  
echo "Starting Build for all Projects with proposed changes" 
echo . 
devenv "path\to\solutionFile\projectSolution2.sln" /build Debug
devenv "another\path\to\solutionFile\projectSolution3.sln" /build Debug
devenv "yet\another\path\to\solutionFile\projectSolution4.sln" /build Debug
echo "All builds completed."
pause

バッチスクリプトは最初の行のみを実行しますexitを入力するまで待ってから他の行を実行します。バッチファイルとすべてのStackOverflowの質問に基づいてこれを理解したのは、cmdが実際にvcvarsall.batを実行する別のインスタンスを呼び出してビルド環境をセットアップすることです。

exitと入力すると、devenvが設定されたインスタンスが強制終了され、その後のコマンドはdevenvが認識されたコマンドではないため、実行できません(エクスポートされたパスは認識されないため)。もう存在します)

要するに、これを単一のバッチファイルでどのように達成できますか(残りのコマンドをdevenvが定義されたcmdインスタンスに渡す)?これはビルドを呼び出すための堅牢な方法ではないことを理解しています(そしてこれを行うツールはたくさんあります)が、これらのプロジェクトを個別に呼び出す手動作業を自動化する1つのバッチスクリプトが欲しいだけです。

6
matrixanomaly

Jimmyが指摘したように、解決策が見つかりました。CMD.exeへのショートカットであるため、環境変数%comspec%を削除する必要があります。

ただし、"%comspec" /kを削除するだけで、CMDインスタンスが開き、1秒後に終了します。以前、%comspec%と一緒に使用すると別のCMDインスタンスを作成するcall関数を試しました。

解決策は最初の行の前にcallを追加し、%comspecを削除します

これが、意図したとおりに機能するようになった最終的なバッチファイルです。

@echo OFF 
call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
echo "Starting Build for all Projects with proposed changes"
echo .  
devenv "path\to\solutionFile\projectSolution2.sln" /build Debug 
devenv "another\path\to\solutionFile\projectSolution3.sln" /build Debug 
devenv "yet\another\path\to\solutionFile\projectSolution4.sln" /build Debug 
echo . 
echo "All builds completed." 
pause

@echo OFFは、コマンド(その呼び出しコマンドなど)を端末にエコーアウトしないようにバッチスクリプトに指示することに注意してください(ただし、エラーと警告は引き続き表示されます)

12
matrixanomaly

これがすでにバッチスクリプトにある場合は、次の行を参照してください。

"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86  

おそらく"C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86である必要があります

どうして? %comspec%はcmd.exeへの環境変数のショートカットであるため、ご覧のとおり、/ kオプションを指定してcmdの新しいインスタンスを起動します(cmd /?を実行するとCarries out the command specified by string but remainsと表示されます) )。あなたはそれが残っていることを気にしません、あなたがすでにあなたのバッチファイルを実行しているときあなたは新しいcmd.exeさえ欲しくないです。

2
Jimmy