ゆっきーのブログ

実践的なシステム設計開発、アプリケーションフレームワーク開発、トラブルシューティング、 後輩育成のためのブログ。その他、キャンプ、トレッキング・登山やレジャー等。

1. システムエンジニアリング bat_vbs 実装技術

DOSバッチリファレンス

投稿日:2018年11月25日 更新日:

ちょっとした事でbatファイルを作成することが多い。
そのたびにネット検索するのが非効率なため、リファレンス化しようと思う。
そういう目的なので、自分がよく調べる項目に絞っている。

開発時の注意点

  • 直観的に「カレントディレクトリは、バッチファイルのあるディレクトリ」と勘違いすることが多い。タスクスケジューラ等のツールから実行する場合は正しいことがあるが、コマンドプロンプトからパス指定で実行する場合は正しくない。
    このように、実行方法によってカレントディレクトリが変わってしまわないよう、バッチの先頭処理で、カレントディレクトリを変更しておく。(cd /d “%~dp0”)
  • %0, %1系変数を使用する場合、状況によって引用符が入ったりすることを考慮しないと、引用符が入ってきた場合の変数の構築が崩壊する。
    これらの変数を別の変数に代入する場合は%~で引用符を外す。コマンド実行等の最終段では引用符を付けて変数を展開する。

    set BASE_FOLDER=%~dp0
    set LOG_FILE=%BASE_FOLDER%log.txt
    dir "%BASE_FOLDER%"
    echo hello > "%LOG_FILE%" 
    

リファレンス

コマンド引数:
変数 説明 出力例
%0 起動されたバッチファイルのパス。
実行時に指定された絶対パスまたは相対パスに展開される。空白を含むようなパスの場合、引用符も付与される。
「C:\work\test.bat arg1 arg2」の場合、「C:\work\test.bat」
「”C:\work\test of.bat” arg1 arg2」の場合、「”C:\work\test of.bat”」
%1 第1引数の値。
同様に%2, %3は第2, 3引数の値。
引用符を付けて引数を指定した場合は引用符も含まれる。
「C:\work\test.bat arg1 arg2」の場合、%1は「arg1」、%2は「arg2」
「C:\work\test.bat “arg1a arg1b”」の場合、%1は「”arg1a arg1b”」
変数参照:
※変数参照は”%0″で記載しているが”%1″等でも同様
※出力例は、%0が「”subwork\test of.bat”」の場合を想定
※”For /?”で参照可

変数参照 説明 出力例
%~0 引用符(“)を削除 subwork\test of.bat
%~f0 完全修飾パス C:\work\subwork\test of.bat
%~d0 ドライブ文字のみ C:
%~p0 パス名のみ \work\subwork\
%~n0 ファイル名のみ(拡張子はなし) test of
%~x0 拡張子のみ .bat
%~s0 短いファイルパス C:\work\subwork\TESTOF~1.BAT
%~a0 ファイル属性 –a——–
%~t0 ファイルの日付/時刻 2018/11/25 01:20
%~z0 ファイルサイズ 243
%~$PATH:0 PATH変数のディレクトリを検索して最初に見つかった完全修飾名に展開 C:\work\subwork\test of.bat

動的環境変数:
※展開時に動的に設定される変数
変数名 説明 出力例
%CD% 現在のディレクトリ C:\work
%DATE% 日付 2018/11/25
%TIME% 時刻 3:00:26.72
%RANDOM% 乱数(0~32767) 29372
変数置換:
※”set /?”で参照可
変数置換 説明 出力例
%V% (例題) ABCDEFG
%V:X=Y% XをYに置換 %V:CD=cd% -> ABcdEFG
%V:*X=Y% XをYに置換(*:ワイルドカード) %V:*CD=bcd% -> bcdEFG
%V:~M,N% 先頭のM文字目からN文字 %V:~2,3% -> CDE
%V:~M,-N% 先頭のM文字目から、最後からN文字目 %V:~2,-1% -> CDEF
%V:~-N% 最後からのM文字目以降 %V:~-3% -> EFG
SETコマンド:
※”set /?”で参照可
表現 説明 出力例
SET /A 算術演算式 算術演算の結果を代入する。
+-*/: 加算、減算、乗算、除算
%: 余剰(バッチ上では%%と記載)
(): グループ化
0xN: 16進数(Nは任意桁の0-9A-F)
0N: 8進数(Nは任意桁の0-7)
SET /A VAL1=(2+3*2)/2
SET /A VAL2=5%%3
SET /A VAL3=0x10+04
SET /A 論理シフト式 論理シフトの結果を代入する。
<<: 左シフト
>>: 左シフト
SET /A “VAL1=1<<4"
SET /A “VAL2=-1<<2"
SET /A ビット演算式 ビット演算の結果を代入する。
&: AND
|: OR
^: XOR
SET /A “VAL1=0xff & 07”
SET /A “VAL2=0xf0 | 0x0f”
SET /P 変数=[文字列] ユーザの入力内容を代入する。 SET /P VAL=”$ “
条件判定・分岐:
※”if /?”で参照可
コード例 説明
if [not] 文字列1==文字列2 ( command ) 文字列が一致
if [not] “文字列1″==”文字列2” ( command ) 文字列が一致
(空だった場合に文法エラーになるのを回避するため)
if [not] EXIST ファイル名 ( command ) ファイルの存在確認
if [not] ERRORLEVEL 番号 ( command ) エラー番号が番号以上
if [/I] 文字列1 EQU 文字列2 ( command ) EQU: 等しい
NEQ: 等しくない
LSS: より小さい
LEQ: 以下
GTR: より大きい
GEQ: 以上
(/I: 大小文字無視)
繰り返し(For):
コード例 説明

その他

スニペット:
コード例 説明
@echo off 実行内容の出力を抑制
cd /d “%~dp0” カレントドライブ・フォルダ変更
pushd \\localhost\share

popd
ネットワークパスに一時的にCD
一時的にネットワークドライブを割り当てている。
popdでネットワークドライブを解除する。
echo.
echo[
echo(
空行の出力(左記のいずれか)
command > NUL 2>&1 コマンドの実行結果
(標準出力/標準エラー出力)を捨てる。
無視できる出力がある場合に使用する。
call external.bat 外部コマンドの実行
(callがないと非同期実行になってしまう。)
exit /b 0 外部コマンド側での戻り値返却
(“/b”がないと呼出元も終了してしまう。)
set YMD=%date:/=% yyyymmdd形式の日付
例: 20180109
set FHMSN=%time: =0%
set FHMS=%FHMSN:~,8%
set HMS=%FHMS::=%
hhmmss形式の時刻
例: 230159
goto label

:label
ジャンプ

-1. システムエンジニアリング, bat_vbs, 実装技術

執筆者:


comment

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

関連記事

CentOS7のマルチホーム化

サイトの存在を隠しつつも、sftpサーバを公開し、後輩と1G以上のファイルのやりとりしたい。 パブリック側のIPアドレスを教えてしまうと、どこのサーバだろうかとブラウザで開いたりするとサイトの存在がわ …

技術検証

Linuxでの gdrive の使い方

wordpressのデータをgoogle driveにバックアップするための基礎調査を行っている。 google driveに接続可能なライブラリは幾つかあるようだが、ここでは無料でお手軽に始められそ …

vbaでのエンコード/デコードのサンプル

Excel(vba)で、MD5/SHA-1/SHA-2(SHA-256)の出力、Hex/Base64エンコード/デコードを調べたので備忘録として残します。 動作検証した環境は、Windows10+Of …

区分データ生成ツール

区分定義書の変更時、定数や列挙体、マスタの一部を手動で修正するような運用だと、抜け漏れや間違いが発生する場合があります。この辺の手間や間違いを低減するために、区分定義書から自動的に成果物を作成するEx …

postgresqlでの拡張のインストール

PostgreSQL10で暗号化関数を使用するため拡張(pgcrypto)をインストールした際の出来事を記載します。 事象 pgcryptoの拡張をインストールしたり、インストールの確認を行うと、その …