コマンドプロンプト(バッチ)

本項は書きたての記事です。正確な情報は公式サイト、公式ドキュメント、記載の参照サイトでご確認ください。

注意点

ラベル

メイン部とラベル部(メイン関数とサブルーチン)の構成で作成するとき、
call :subRoutine
 ...
exit /b
 
:subRoutine
 sub...
exit /b
 
と、exit /bをメイン部とラベル部それぞれに記述しないと、ラベル部を2度実行されてしまうので注意が必要。

テンプレート

(ファイルダウンロード)テンプレートバッチ

@echo off
setlocal enabledelayedexpansion
 
:://///////////////////////////////////
:: UpDate : yyyy-mm-dd
:: 
:: FileName     : xxxxxx
:: FunctionName : xxxxxx
::
:://///////////////////////////////////
 
::// initialize
 
set flgPUSHD=0 1
 
if %flgPUSHD% eq 1 (
set CURRENTDIR=%~dp0
pushd ..
)
 
set PARENTDIR=%CD%
set SOURCEDIR=
set TARGETDIR=
set CURRENTUSER=%USERNAME%
 
set d=%date: =0%
set t=%time: =0%
set NOWDATE=%d:~0,4%%d:~5,2%%d:~8,2%
set NOWTIME=%t:~0,2%%t:~3,2%%t:~6,2%
set MICROSEC=%t:~9,2%
set SUFFIXNAME=%CURDATE:~5,2%%CURDATE:~8,2%
 
::// main
call :func_Name arg1 arg2
call :end
 
 
:end
:: PARENTDIR reset
popd
exit /b
 
 
::// functions
:func_Name
setlocal
 
set ARG1=%1
set ARG2=%2
set XXX=9999
 
exit /b
 
 

setlocal enabledelayedexpansion エラー判定でERRORLEVELを遅延展開
endlocalでスコープ限定することで副作用を軽減できる
set 定数名=値 定数
%~dp0 カレントディレクトリ取得(%~系はファイル名取得など多数ある)
pushd ディレクトリスタック(メモリ記憶)
メモリ開放(popd)とセットで使う
%CD% カレントディレクトリ取得
%USERNAME% ログインユーザー名取得
%date: =0% 0埋めフォーマット(202123⇒20210103)
%DATE:~0,4%%DATE:~5,2%%DATE:~8,2% フォーマット
(開始文字数目、終了文字数目を取得。%は半角%)
:: 疑似コメント行(本来はREMがコメント行宣言。REMarksの略)
call :ラベル名 引数1 引数2 疑似関数呼び出し
本来はラベル行以降の処理を呼び出す為だが疑似関数を呼び出すことも出来る
call 外部ファイル 引数1 引数3 疑似関数呼び出し
外部バッチファイルを呼び出す場合
:ラベル名
~処理~
exit /b
疑似関数を作る際に関数名として利用
終了定義がないため関数終了部分に exit /b を記す必要がある(戻り値を設定しても良い)
exit /b 0 スクリプトを終了し、エラーレベルを返す
エラーレベル0=正常終了、1=異常終了
exit /b %3値 戻り値(%3 値)を返す
エラーレベル(%ERROELEVEL%) 特に桁数の規定はないようなので0、1以外の数字は任意のものが使える。

再入力を求める

入力を求めるとき、入力値がなかった場合など再度質問を行うようにしたい場合がある。
このような場合は疑似コールバックで自分のラベルをgotoで呼び出すようにすればよい。

@echo off
setlocal
set /p inputvar=数字を入力:
 
echo 入力 %inputvar%
call :inputform %inputvg%
endlocal
exit /b
 
:inputform
	if "%inputvar%" equ "" (
		set /p inputvg=数字を入力:
		goto :inputform
	) else (
		echo 数字が設定されました。
	)
	exit /b
 

条件分岐

if, forはあるが、while, case, switchがない。
そのためラベルやgotoを駆使して行う必要がある。ただループや条件分岐を多用するのであればJavaScriptやPowerShellを使った方が良く、コマンドプロンプトにこだわるメリットはない。



余談

本当であればコマンドプロンプトからPowerShellに移行すべき。

しかしいまだにWindowsのバッチ処理はWSHやVBScriptもあるがコマンドプロンプトになっている。
VBScript(cscript)は2019年8月にWindows8.1以前で無効化され、MSEdgeでも廃止になっている。
PowerShellは2006年(WindowsXP)からあるが、クライアントOSに本格投入され始めたのは
Windows7から。
PowerShellはサーバエンジニア、情シス系には日常的に利用されているが、
事務系やオペレーション系職にほとんど利用されない。
その理由は「管理者権限実行」と「実行ポリシー変更」にある。
.psファイルをダブルクリックしても起動しないこと、PowerShellの知識が広まってないのもあり
浸透していない。

タグ:

win cmd
最終更新:2022年01月02日 15:31