Bat(*.bat)で色々やる時のメモ

More than 3 years have passed since last update.


概要

bat作成時の個人用メモ


テンプレ

※テンプレ利用時の注意点

JenkinsのWindowsバッチコマンドの実行でこのbatファイルを利用すると

マルチバイト文字が入っている為エラーが発生します。

日本語部分を消してもらえれば使えます。


template.bat

@echo off

rem ------------------------------------
rem infomation
rem batの説明を記載

rem ------------------------------------
rem setting
rem 各種設定
set CurDir=%~dp0

call :CLEAR_SCREEN

rem ------------------------------------
rem 実装部
:EXEC

rem ------------------------------------
rem 終了処理
:END

:: pauseはデバッグ終了時に外す
pause

:: /B 呼び出し元へ戻る
exit /B

rem ------------------------------------
rem ログ消去
:CLEAR_SCREEN

cls
exit /B

rem ------------------------------------
rem EOF



引数表示

:: 引数1をそのまま表示

echo %1
:: フルパスにして表示
echo %~f1
:: 引数1をドライブ文字とパス
echo %~dp1
:: 引数2をファイル名のみにして表示
echo %~n2
:: 引数2をファイル名+拡張子のみにして表示
echo %~nx2

rem D:\tmpで引数1にhoge 引数2にfoo/poi.txtを入れて実行した結果
hoge
D:\tmp\hoge
D:\tmp
poi
poi.txt


ドロップされたファイルを操作

:: 1ファイルのみドロップされた場合 %1にパスが入っています。

echo %1

:: 複数ファイルドロップされた場合
for %%f in (%*) do (
echo %%f
)


コマンド結果を変数に入れる

:: コマンド結果を%%iに入れて 表示

for /f "usebackq" %%i in (`コマンド`) do (
echo %%i
)

:: 指定ディレクトリ以下の特定ファイル見つけてきて表示
for /f "usebackq" %%i in (`dir /b /s RomDir\*.zip`) do (
echo %%i
)

:: 直下のディレクトリを見つけてきて表示
for /f "usebackq" %%i in (`dir /b /ad`) do (
echo %%i
)

:: lsの結果を表示
for /f "usebackq" %%i in (`ls`) do (
echo %%i
)


アプリの起動/再起動

何かを起動時にデバッグツールを起動したい時に使用


startAppIfNeeded.bat

rem アプリが起動済みなら起動しない。起動してないなら起動する。

set AppFile=poi.exe
set AppPath=%CurDir%tool\%AppFile%
for /f %%i in ('tasklist /fi "imagename eq %AppFile%" 2^>^&1') do (
if /i %%i==%AppFile% (
goto END
)
)
start %AppPath%
:END
exit /B

下位互換性の無いデバッグツールを使う場合

すでに起動しているなら殺してから

使用可能なバージョンのデバッグツールを立ち上げる為に使用


restartApp.bat

rem アプリが起動済みなら再起動する。

set AppFile=poi.exe
set AppPath=%CurDir%tool\%AppFile%
for /f %%i in ('tasklist /fi "imagename eq %AppFile%" 2^>^&1') do (
if /i %%i==%AppFile% (
taskkill /im %AppFile% /f
)
)
start %AppPath%
:END
exit /B


フォルダ作成

:: フォルダがあったら消してから作成

if exist %TargetDir% (
rd /s /q %TargetDir%
)
mkdir %TargetDir%

```bat
:: フォルダが無ければ作成
if not exist %TargetDir% (
mkdir %TargetDir%
)


テキストファイルを1行ずつ読み込む

for /f "delims=" %%c in (poi.txt) do (

echo %%c
)


テキストファイルの読み込みを利用してVisualStudioプロジェクトをビルドする

slnファイルと同じディレクトリに配置して使用します。

別途記載したビルド対象ファイルを元にビルドを行います。


build.bat

@echo off

set ProjectRoot=%~dp0

rem ------------------------------
rem 設定
::1つ上のフォルダ名を取得してソリューション名として利用
for %%I in (.) do set SlnFileName=%%~nI%%~xI
::msbuild.exeへのパスを確保
set MicrosoftBinRoot="C:/Program Files (x86)/MSBuild/12.0/Bin/"
set MsBuildPath=%MicrosoftBinRoot%msbuild.exe

rem ------------------------------
rem 実装部

for /f "delims=" %%c in (configuration.txt) do (
for /f "delims=" %%p in (platform.txt) do (
%MsBuildPath% %SlnFileName%.sln /t:rebuild /p:PlatformToolset=v120 /p:Configuration=%%c /p:Platform=%%p
)
)

rem EOF



configuration.txt

Debug

Develop
Release


platform.txt

Win32

X64