NT4.0対応 BAT Tips


@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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>