@ECHO OFF CLS SETLOCAL SETLOCAL ENABLEEXTENSIONS CALL :LABEL_TITLE_SAMPLE CALL :LABEL_BLANK_LINE_SAMPLE CALL :LABEL_SPECIAL_CHAR_SAMPLE CALL :LABEL_STDERR_SAMPLE CALL :LABEL_NULL_DEVICE_SAMPLE CALL :LABEL_ERRORLEVEL_SAMPLE CALL :LABEL_CMDEXTVERSION_SAMPLE CALL :LABEL_CONTINUOUS_COMMAND_SAMPLE CALL :LABEL_BAT_INFO_SAMPLE CALL :LABEL_CD_BAT_DIR_SAMPLE CALL :LABEL_PRINT_TIME_SAMPLE CALL :LABEL_GET_DATE_SAMPLE CALL :LABEL_WAIT_SAMPLE CALL :LABEL_YN_INPUT_SAMPLE CALL :LABEL_MAKE_FILE_LIST_SAMPLE CALL :LABEL_RECURSIVE_FILE_PROCESSING_SAMPLE CALL :LABEL_MAKE_CMD_HELP_SAMPLE ENDLOCAL GOTO :EOF :LABEL_TITLE_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■コマンド プロンプト ウィンドウのタイトルを変更する ECHO ---------------------------------------------------------------------- TITLE BAT Tips GOTO :EOF :LABEL_BLANK_LINE_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■空行を出力する ECHO ---------------------------------------------------------------------- ECHO 一般的な空行出力 ECHO. ECHO その他の空行出力 ECHO( ECHO+ ECHO. ECHO/ ECHO: ECHO[ ECHO\ ECHO] ECHO NT4環境ではエラーとなる出力 ECHO, ECHO; ECHO= ECHO エラーとなる出力 ECHO! ECHO" ECHO# ECHO$ ECHO% ECHO& ECHO' ECHO) ECHO* ECHO- ECHO? ECHO@ ECHO^ ECHO_ ECHO` ECHO{ ECHO} ECHO~ REM ECHO< REM ECHO> REM ECHO| GOTO :EOF :LABEL_SPECIAL_CHAR_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■特殊文字を出力する ECHO ---------------------------------------------------------------------- ECHO 特殊文字 ECHO ^& ECHO ^< ECHO ^> ECHO ^^ ECHO ^| ECHO %% ECHO. ECHO NT4 特殊文字(1文字出力不可) ECHO , ECHO ; ECHO = ECHO _, ECHO _; ECHO _= ECHO ,_ ECHO ;_ ECHO =_ ECHO. ECHO 通常出力可能文字 ECHO ! ECHO " ECHO # ECHO $ ECHO ' ECHO ( ECHO ) ECHO * ECHO + ECHO - ECHO . ECHO / ECHO : ECHO ? ECHO @ ECHO [ ECHO \ ECHO ] ECHO _ ECHO ` ECHO { ECHO } ECHO ~ GOTO :EOF :LABEL_STDERR_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■標準出力と標準エラー出力エラーを同一ファイルに出力する ECHO ---------------------------------------------------------------------- CD > $$Result.txt 2>&1 CD : >> $$Result.txt 2>&1 TYPE $$Result.txt DEL $$Result.txt GOTO :EOF :LABEL_NULL_DEVICE_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■コマンドの画面出力を抑制する ECHO ■任意のメッセージを表示してキー入力を待つ ECHO ---------------------------------------------------------------------- ECHO 処理が完了しました。 ECHO 処理結果を確認した後、何かキーを押してください . . . pause >NUL GOTO :EOF :LABEL_ERRORLEVEL_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■ERRORLEVELを0にする ECHO ■ERRORLEVELを0以外にする ECHO ---------------------------------------------------------------------- CD >NUL ECHO %ERRORLEVEL% CD : 2>NUL ECHO %ERRORLEVEL% CD >NUL ECHO %ERRORLEVEL% GOTO :EOF :LABEL_CMDEXTVERSION_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■使用出来るコマンド拡張機能のバージョンを取得する ECHO ---------------------------------------------------------------------- CALL :LABEL_CMDEXTVERSION ECHO コマンド拡張機能バージョン:%CMDEXTVERSION2% GOTO :EOF :LABEL_CMDEXTVERSION REM -------------------------------------------------- REM NT4.0 は、バージョン1 REM Win2000, XP, Vista, Win7 は、バージョン2 REM Winn2000以降は、%CMDEXTVERSION% が使用可能 REM -------------------------------------------------- SET CMDEXTVERSION2=0 VERIFY OTHER 2>NUL SETLOCAL ENABLEEXTENSIONS IF ERRORLEVEL 1 GOTO :LABEL_CMDEXTVERSION_EXIT ENDLOCAL IF CMDEXTVERSION 1 SET CMDEXTVERSION2=1 IF CMDEXTVERSION 2 SET CMDEXTVERSION2=%CMDEXTVERSION% :LABEL_CMDEXTVERSION_EXIT GOTO :EOF REM -------------------------------------------------- :LABEL_CONTINUOUS_COMMAND_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■1行に複数コマンド記載する ECHO ■処理が成功/失敗に応じて追加のコマンドを実行する ECHO ■環境変数の遅延評価 ECHO ---------------------------------------------------------------------- ECHO コマンド1 & ECHO コマンド2 ECHO. CD && ECHO 成功1 CD : && ECHO 失敗1 ECHO. CD || ECHO 成功2 CD : || ECHO 失敗2 REM %をエスケープし CALL 経由でコマンド実行することで、環境変数を遅延展開する REM コマンド拡張機能バージョンが 2 以降なら、遅延環境展開が使用出来る REM REM SETコマンドは末尾のスペースも代入されるので REM コマンドを続ける場合は、&の位置に注意 ECHO. SET TEST=スペースを空ける & CALL ECHO [%%TEST%%] SET TEST=スペースは空けない&CALL ECHO [%%TEST%%] GOTO :EOF :LABEL_BAT_INFO_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■BATファイル名を取得する ECHO ---------------------------------------------------------------------- REM ラベル指定でのCALL中、%0 はラベル名が設定されるが REM 完全修飾パス名等は、元のBATファイル名に応じて正常に展開される ECHO 起動時に指定されたBAT名:%0 ECHO 完全修飾パス名 :%~f0 ECHO ファイル名 :%~nx0 ECHO ディレクトリ :%~dp0 GOTO :EOF :LABEL_CD_BAT_DIR_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■カレントディレクトリを BATファイルが存在するディレクトリに移動する ECHO ---------------------------------------------------------------------- CD CD /D "%~dp0" CD GOTO :EOF :LABEL_PRINT_TIME_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■現在時刻を秒以下まで出力する ECHO ---------------------------------------------------------------------- REM Win2000以降なら、%time% が使用出来る FOR /F "tokens=2" %%I IN ('ECHO.^|TIME') DO ECHO 現在時刻[%%I] GOTO :EOF :LABEL_GET_DATE_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■現在日時を任意の書式で使用する ECHO ---------------------------------------------------------------------- CALL :LABEL_GET_DATE ECHO 年[%YYYY%] 月[%MM%] 日[%DD%] 時[%HH%] 分[%NN%] 秒[%SS%] SET DATE SET TIME GOTO :EOF :LABEL_GET_DATE REM -------------------------------------------------- REM Win2000以降なら、%date% %time% が使用出来る REM Win2000 と WinXP以降では日付 %date% の書式が違う REM REM 日付と時刻を同時取得する仕組が存在しないので、 REM 日付と時刻の取得中に日が変化した場合の対策済み REM REM 0~9時の時、TIME や %time% 時刻情報の先頭は REM 0ではなくスペース REM -------------------------------------------------- REM ------------------------------------ REM WinNT4.0以降版 :DATE_NT4 FOR /F %%I IN ('DATE /T') DO SET DATE2=%%I FOR /F "tokens=2" %%I IN ('ECHO.^|TIME') DO SET TIME2=%%I SET HH=%TIME2:~0,2% SET HH=%HH::=% IF %HH% LSS 10 SET TIME2=0%TIME2% IF "%TIME2:~0,5%"=="00:00" FOR /F %%I IN ('DATE /T') DO SET DATE2=%%I SET YYYY=%DATE2:~0,4% SET YY=%DATE2:~2,2% SET MM=%DATE2:~5,2% SET DD=%DATE2:~8,2% SET HH=%TIME2:~0,2% SET NN=%TIME2:~3,2% SET SS=%TIME2:~6,2% GOTO :EOF REM ------------------------------------ REM Win2000以降版 SET DATE2=%date%&SET TIME2=%time: =0% IF "%TIME2:~0,5%"=="00:00" SET DATE2=%date% SET YYYY=%DATE2:~-10,4% SET YY=%DATE2:~-10,2% SET MM=%DATE2:~-5,2% SET DD=%DATE2:~-2,2% SET HH=%TIME2:~0,2% SET NN=%TIME2:~3,2% SET SS=%TIME2:~6,2% GOTO :EOF REM ------------------------------------ :LABEL_WAIT_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■◯秒待つ ECHO ---------------------------------------------------------------------- SET WAIT_SEC=3 ECHO %WAIT_SEC%秒待ち FOR /F "tokens=2" %%I IN ('ECHO.^|TIME') DO ECHO 開始時刻[%%I] CALL :LABEL_WAIT %WAIT_SEC% FOR /F "tokens=2" %%I IN ('ECHO.^|TIME') DO ECHO 終了時刻[%%I] GOTO :EOF :LABEL_WAIT REM -------------------------------------------------- SETLOCAL SET /A PING_COUNT=%1+1 ping.exe -n %PING_COUNT% localhost >NUL ENDLOCAL GOTO :EOF REM -------------------------------------------------- :LABEL_YN_INPUT_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■Y/N入力 ECHO ---------------------------------------------------------------------- ECHO 処理を継続しますか(Y/N)? CALL :LABEL_YN_INPUT IF ERRORLEVEL 1 GOTO :LABEL_YN_INPUT_SAMPLE_N ECHO 処理を継続 GOTO :EOF :LABEL_YN_INPUT_SAMPLE_N ECHO 処理を中断 GOTO :EOF :LABEL_YN_INPUT REM -------------------------------------------------- SETLOCAL SET TEMP_FILE=%1 IF "%TEMP_FILE%"=="" SET TEMP_FILE=%TEMP%\$$%~n0.tmp ECHO temp file>%TEMP_FILE% DEL /P %TEMP_FILE%>NUL IF EXIST %TEMP_FILE% GOTO :LABEL_YN_INPUT_N ENDLOCAL GOTO :EOF :LABEL_YN_INPUT_N DEL %TEMP_FILE%>NUL ENDLOCAL CD : 2>NUL GOTO :EOF REM -------------------------------------------------- :LABEL_MAKE_FILE_LIST_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■Grep処理向けのファイル一覧を作成する ECHO ---------------------------------------------------------------------- CALL :LABEL_GET_DATE CALL :LABEL_MAKE_FILE_LIST "%SystemDrive%\." "*.exe *.com *.bat" "%~dp0FileList1_%YYYY%%MM%%DD%_%HH%%NN%%SS%.txt" CALL :LABEL_MAKE_FILE_LIST "%SystemDrive%\Program Files" "*.exe *.com *.bat" "%~dp0FileList2_%YYYY%%MM%%DD%_%HH%%NN%%SS%.txt" GOTO :EOF :LABEL_MAKE_FILE_LIST REM -------------------------------------------------- SETLOCAL SET TARGET_PATH=%~f1 SET TARGET_FILE=%2 SET TARGET_FILE=%TARGET_FILE:"=% SET OUTPUT_FILE=%~f3 REM ※ NT4では引用句 (")を削除するだけの %~2 が使用できないため、置換で対処する ECHO 対象ディレクトリ:[%TARGET_PATH%] ECHO 対象ファイル :[%TARGET_FILE%] ECHO 結果ファイル :[%OUTPUT_FILE%] ECHO [%TARGET_PATH%]>"%OUTPUT_FILE%" ECHO [%TARGET_FILE%]>>"%OUTPUT_FILE%" ECHO.>>"%OUTPUT_FILE%" SETLOCAL FOR %%I IN ("%TARGET_PATH%") DO SET TARGET_PATH_SHORT=%%~fsI FOR /R %TARGET_PATH_SHORT% %%I IN (%TARGET_FILE%) DO SET SRC=%%~fI& CALL SET DST=%%SRC:%TARGET_PATH_SHORT%=%%& CALL ECHO %%DST%%>>"%OUTPUT_FILE%" REM ※ NT4環境では、FOR の /R の後にスペース含むパスを指定すると正常に REM ※ 動作しないので、引数を短い名前だけのパスに変換したものを使用する ENDLOCAL GOTO :EOF REM -------------------------------------------------- :LABEL_RECURSIVE_FILE_PROCESSING_SAMPLE ECHO ---------------------------------------------------------------------- ECHO ■対象ディレクト以下にあるファイルを処理し、 ECHO ■処理結果をディレクトリ構成を保った別のディレクトリに出力する ECHO ---------------------------------------------------------------------- REM ---- テストデータ 準備 ---- CD /D %~dp0 MKDIR "src dir\sub1\sub2" MKDIR "src dir\sub3" ECHO 1 > "src dir\1.txt" ECHO 2 > "src dir\sub1\2.txt" ECHO 3 > "src dir\sub1\sub2\3.txt" ECHO 4 > "src dir\sub3\4.txt" DEL /S /Q "dst dir\*.*" RMDIR /S /Q "dst dir" REM 処理開始 CALL :LABEL_RECURSIVE_FILE_PROCESSING "%~dp0src dir" "*.txt" "%~dp0dst dir" :SAMPLE_FILE_PROCESSING REM 結果ファイルの一覧表示 TREE /F "%~dp0src dir" TREE /F "%~dp0dst dir" GOTO :EOF :SAMPLE_FILE_PROCESSING REM ---- 1ファイル毎のサンプル処理 ---- REM nkfを使用し、*.eml の MIME をデコードしSJISに変換したり、 REM SJISでは誤動作を起こす海外製のツールのためにソースコードをEUCに変換するなど ECHO [%~f1]-^>[%~dpn2_done%~x2] ECHO %~f1> "%~dpn2_done%~x2" TYPE "%~f1">>"%~dpn2_done%~x2" GOTO :EOF :LABEL_RECURSIVE_FILE_PROCESSING REM -------------------------------------------------- SETLOCAL SET TARGET_PATH=%~f1 SET TARGET_FILE=%2 SET TARGET_FILE=%TARGET_FILE:"=% SET OUTPUT_PATH=%~f3 SET FILE_PROCESSING=%4 REM ※ NT4では、引用句 (")を削除する %~2 が使用できないため、置換で対処する ECHO 対象ディレクトリ:[%TARGET_PATH%] ECHO 対象ファイル :[%TARGET_FILE%] ECHO 出力ディレクトリ:[%OUTPUT_PATH%] XCOPY "%TARGET_PATH%\%TARGET_FILE%" "%OUTPUT_PATH%" /I /E /T FOR %%I IN ("%TARGET_PATH%") DO SET TARGET_PATH_SHORT=%%~fsI FOR /R %TARGET_PATH_SHORT% %%I IN (%TARGET_FILE%) DO SET SRC=%%~fI& CALL SET DST=%%SRC:%TARGET_PATH_SHORT%=%OUTPUT_PATH%%%& CALL %FILE_PROCESSING% %%SRC%% "%%DST%%" ENDLOCAL GOTO :EOF REM -------------------------------------------------- :LABEL_MAKE_CMD_HELP_SAMPLE ECHO ---------------------------------------------------------------------- ECHO コマンド インタプリタのヘルプファイルを作成する ECHO ---------------------------------------------------------------------- :LABEL_MAKE_CMD_HELP ECHO ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★>CmdHelp.txt ECHO ★コマンド インタプリタ>>CmdHelp.txt ECHO ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★>>CmdHelp.txt VER >>CmdHelp.txt ECHO.>>CmdHelp.txt ECHO %ComSpec% >>CmdHelp.txt SET CMDEXTVERSION2=0 IF CMDEXTVERSION 1 SET CMDEXTVERSION2=1 IF CMDEXTVERSION 2 SET CMDEXTVERSION2=%CMDEXTVERSION% ECHO.>>CmdHelp.txt ECHO コマンド拡張機能バージョン:%CMDEXTVERSION2%>>CmdHelp.txt ECHO.>>CmdHelp.txt FOR /F "skip=4 tokens=1,2,3,4" %%I IN ('DIR %ComSpec%') DO ECHO %%L TIME[%%I %%J] SIZE[%%K]>>CmdHelp.txt & GOTO :LABEL_MAKE_CMD_HELP2 REM ------------------------------------------------------------ :LABEL_MAKE_CMD_HELP2 ECHO.>>CmdHelp.txt CALL :PRINT_COMMAND_HELP %ComSpec% ECHO ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★>>CmdHelp.txt ECHO ★内部コマンド>>CmdHelp.txt ECHO ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★>>CmdHelp.txt CALL :PRINT_COMMAND_HELP ASSOC CALL :PRINT_COMMAND_HELP BREAK CALL :PRINT_COMMAND_HELP CALL CALL :PRINT_COMMAND_HELP CD CALL :PRINT_COMMAND_HELP CHDIR CALL :PRINT_COMMAND_HELP CLS CALL :PRINT_COMMAND_HELP COLOR CALL :PRINT_COMMAND_HELP COPY CALL :PRINT_COMMAND_HELP DATE CALL :PRINT_COMMAND_HELP DEL CALL :PRINT_COMMAND_HELP DIR CALL :PRINT_COMMAND_HELP DPATH CALL :PRINT_COMMAND_HELP ECHO CALL :PRINT_COMMAND_HELP ENDLOCAL CALL :PRINT_COMMAND_HELP ERASE CALL :PRINT_COMMAND_HELP EXIT CALL :PRINT_COMMAND_HELP FOR CALL :PRINT_COMMAND_HELP FTYPE CALL :PRINT_COMMAND_HELP GOTO CALL :PRINT_COMMAND_HELP IF CALL :PRINT_COMMAND_HELP KEYS CALL :PRINT_COMMAND_HELP MD CALL :PRINT_COMMAND_HELP MKDIR CALL :PRINT_COMMAND_HELP MOVE CALL :PRINT_COMMAND_HELP PATH CALL :PRINT_COMMAND_HELP PAUSE CALL :PRINT_COMMAND_HELP POPD CALL :PRINT_COMMAND_HELP PROMPT CALL :PRINT_COMMAND_HELP PUSHD CALL :PRINT_COMMAND_HELP RD CALL :PRINT_COMMAND_HELP REM CALL :PRINT_COMMAND_HELP RENAME CALL :PRINT_COMMAND_HELP RMDIR CALL :PRINT_COMMAND_HELP SET CALL :PRINT_COMMAND_HELP SETLOCAL CALL :PRINT_COMMAND_HELP SHIFT CALL :PRINT_COMMAND_HELP START CALL :PRINT_COMMAND_HELP TIME CALL :PRINT_COMMAND_HELP TITLE CALL :PRINT_COMMAND_HELP TYPE CALL :PRINT_COMMAND_HELP VER CALL :PRINT_COMMAND_HELP VERIFY CALL :PRINT_COMMAND_HELP VOL ECHO.>>CmdHelp.txt ECHO.>>CmdHelp.txt ECHO.>>CmdHelp.txt ECHO.>>CmdHelp.txt ECHO.>>CmdHelp.txt :LABEL_MAKE_CMD_HELP3 ECHO ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★>>CmdHelp.txt ECHO ★外部コマンド>>CmdHelp.txt ECHO ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★>>CmdHelp.txt CALL :PRINT_COMMAND_HELP ATTRIB CALL :PRINT_COMMAND_HELP CACLS CALL :PRINT_COMMAND_HELP CHCP CALL :PRINT_COMMAND_HELP CHKDSK CALL :PRINT_COMMAND_HELP COMP CALL :PRINT_COMMAND_HELP COMPACT CALL :PRINT_COMMAND_HELP DISKCOMP CALL :PRINT_COMMAND_HELP DISKCOPY CALL :PRINT_COMMAND_HELP EXPAND CALL :PRINT_COMMAND_HELP FC CALL :PRINT_COMMAND_HELP FIND CALL :PRINT_COMMAND_HELP FINDSTR CALL :PRINT_COMMAND_HELP LABEL CALL :PRINT_COMMAND_HELP MODE CALL :PRINT_COMMAND_HELP MORE CALL :PRINT_COMMAND_HELP RECOVER CALL :PRINT_COMMAND_HELP REPLACE CALL :PRINT_COMMAND_HELP SORT CALL :PRINT_COMMAND_HELP SUBST CALL :PRINT_COMMAND_HELP TREE CALL :PRINT_COMMAND_HELP XCOPY ECHO ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■>>CmdHelp.txt GOTO :EOF REM ------------------------------------------------------------ :PRINT_COMMAND_HELP ECHO %1 /? ECHO.>>CmdHelp.txt ECHO ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■>>CmdHelp.txt ECHO ■%1 /?>>CmdHelp.txt ECHO ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■>>CmdHelp.txt ECHO.>>CmdHelp.txt %1 /? >>CmdHelp.txt ECHO.>>CmdHelp.txt GOTO :EOF