昔も今も変わらぬバッチファイルのお作法

情報システム

昔も今も変わらぬバッチファイルのお作法


プログラムの自動更新バッチファイル

バッチファイルはその名のとおり、Windowsのシェル(コマンドプロンプト)で実行させたい処理を、まとめて呼び出して走らせるための、拡張子がbatのテキストファイルで、いにしえのDosの時代から存在しました。

新卒入社したシステム会社で、Windows NT上で複数のフォルダをまるごとコピー(xcopy)する処理を書いたのがバッチファイル初体験でしたが、学生時代のPC操作の授業では、特殊記号(@, % <など)アレルギーで、意味を説明されても慣れるのにずいぶん時間がかかりました。

業務システム運用上でのバッチファイルの定番として、クライアントモジュールを起動する際に、サーバー上の最新版のバージョンをチェックして、新しければ自動アップデートする、というのがありまして、これには繰り返し(for)と条件分岐(if)と遅延環境変数の展開(enabledelayedexpansion)という、難しいシェルコマンドの作法が含まれています。

  • 1行目:@で自コマンドを表示しない。echo offで以降のコマンドも表示しない。
  • 2行目:バッチファイルが実行されているディレクトリ(カレントディレクトリ)を環境変数%CD%から取得し変数にセット。
  • 3行目:プログラムが置かれたサーバーのディレクトリのパスを変数にセット。
  • 5行目:Pingコマンド 試行1回、タイムアウト1秒
  • 6行目:環境変数errorlevelの値が1ならerrorルーチンに飛ぶ
  • 9行目:for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド
    in (%SVRDIR%\setting.ini):プログラムが置かれたサーバーのディレクトリにあるsetting.iniの中が対象
    /f:テキストファイルからトークン(文字列の最小単位で通常はタブ区切り文字)を取り出して代入
    "tokens=1,2 delims==" %%a:イコール("=")区切りのトークンの1番目を変数%%a、2番目を変数%%bに取得
  • 10行目:変数%%aの値が"version"であれば、変数%%bの値を変数versionに代入
  • 13行目:for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド
    in (ver.ini):カレントディレクトリにあるver.iniの中が対象
    /f:テキストファイルからトークン(文字列の最小単位で通常はタブ区切り文字)を取り出して代入
    "tokens=1,2 delims==" %%a:イコール("=")区切りのトークンの1番目を変数%%a、2番目を変数%%bに取得
  • 14行目:変数%%aの値が"ver"であれば、変数%%bの値を変数verに代入
  • 16行目:VerがVersionより小さければupdルーチンに飛ぶ
  • 17行目:更新成功時にはprocessルーチンに飛ぶ
  • 18行目:バッチファイルの最後に移動する。
@echo off
SET CDIR=%CD%
SET SVRDIR=\\192.168.1.100\Share_Folder

Ping 192.168.1.100 -n 1 -w 1000
if errorlevel 1 goto:error

rem サーバー上のsetting.iniと自フォルダ内のver.iniのバージョンを比較
for /f "tokens=1,2 delims==" %%a in (%SVRDIR%\setting.ini) do (
if %%a==version set version=%%b
)

for /f "tokens=1,2 delims==" %%a in (ver.ini) do (
if %%a==ver set ver=%%b
)
if %Ver% LSS %Version% goto :upd
goto:process
goto:eof


rem 更新処理ルーチン
:upd
xcopy /s/y "%SVRDIR%" %CDIR%
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (ver.ini) do (
  set var=%%a
  if not {!var!}=={!var:ver=!} set var=ver=%version%
  echo.!var! >> output.ini
)
del ver.ini
rename "output.ini" "ver.ini"
endlocal
goto:process
goto:eof


rem 更新成功時の処理ルーチン
:process
setlocal enabledelayedexpansion
start AccountPRO.lnk AccountPRO
endlocal
exit
goto:eof


rem pingエラー発生時の処理ルーチン
:error
echo you are not conected to server please check network ...
pause

サーバー上にあるsetting.iniファイル

[settings]
version=1.23

カレントディレクトリにあるver.iniファイル

ver=1.01
  • 23行目:サーバーのディレクトリをカレントディレクトリにまるまるコピー
    /sオプション:ファイルが存在する場合のみディレクトリごとコピー
    /yオプション:同名のファイルが存在する場合、上書きの確認を行わない
  • 24行目:定義した変数のローカル化(setlocal~endlocalの外に影響しない)
    enabledelayedexpansionオプション:実行中に変数の値が変化
  • 25行目:for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド
    in (ver.ini):カレントディレクトリにあるver.iniの中が対象
    /f:テキストファイルからトークン(文字列の最小単位で通常はタブ区切り文字)を取り出して代入
    "tokens=*" %%a:すべての文字列を変数%%aに取得
  • 27行目:変数varに"var=変数version"をセット
  • 28行目:変数verをoutput.iniファイルに書き出す。
  • 30行目:ver.iniを削除
  • 31行目:output.iniをver.iniにリネーム
  • 40行目:AccountPROのリンクをAccountPROというタイトルで開く
    startコマンドの第1引数はアプリケーションのタイトルを設定する文字列
  • 42行目:バッチファイルを途中で終了させる。
  • 43行目:バッチファイルの最後に移動する。
  • 49行目:「Please press any key to continue...」を表示させ何かしらのキー入力があるまで動作を停止。

コマンドの書き方あれこれ

Unixのカーネル(核)を操作するシェル(貝)コマンドはcygwinのようなターミナル(端末)から入力しますが、Windowsのカーネルを操作するコマンドプロンプト(cmd.exe)はコンソール(ターミナルではない)から入力します。

環境変数

Windowsのシステム環境変数の代表格Pathに、コマンドを実行するプログラムのあるディレクトリを設定することで、コマンドプロンプトからフルパスを入れずコマンドのみで実行できますが、これらシステム環境変数はWindows環境で共通なので、自分のPCで作成したバッチファイルを他人のPCで実行することができます。

一方で環境変数はユーザー自身が独自に定義することも可能で、「SET」コマンドで定義して「%環境変数%」でバッチファイル中で参照することができます。

日付と時間の取得

バッチファイルから取得する日付のフォーマットは、コントロールパネルのRegion and language(地域と言語)から設定されますが、日本式のyyyy/MM/ddと英語のM/d/yyyyとでは方法が異なります。

日本式(yyyy/MM/dd)の場合

%DATE:~-10,4% : 後ろから10桁目(-は^でエスケープされている)から4桁が年
%DATE:~-5,2% : 後ろから5桁目から2桁が月
%DATE:~-2% : 後ろから2桁目から最後までが日
%TIME:~0,2% :前から2桁が時
%TIME:~3,2% : 前から3桁目から2桁が分
%TIME:~6,2% : 前から6桁目から2桁が秒

英語式(M/d/yyyy)の場合

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YYYY=%dt:~0,4%"
set "MM=%dt:~4,2%"
set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%"
set "Min=%dt:~10,2%"
set "Sec=%dt:~12,2%"

pingのエラーレベル

pingコマンドはオプションと引数のセットで指定しますが、「-n 1」で試行回数1回、「-w 1000」でタイムアウト時間を1000ミリ秒(1秒)に指定しますが、結果に応じて環境変数errorlevelに以下の値を返します。

  • ホストが見つからない:1
  • 応答なし:1
  • 応答あり:0
  • 経路なし:0

ルーターを経由しない社内LAN上のサーバーであれば「経路なし」はありえないので、errorlevelが0(応答あり)か1(応答なし)で判断できます。

エスケープシーケンス

環境変数に特殊記号を代入する場合に、エスケープ文字(^)を付ける必要があり、例えばユーザー環境変数LOGOに「&TOKYO」という文字列を入れる場合は、SET LOGO=^&TOKYO となります。





おすすめ記事一覧

大統領選挙で考えたギャップにハマるということ 1

ギャップにキュンとするというのは人間の本能みたいなもので、ジョコウィの私利私欲のない素朴なおじさん像と、その実強力なリーダーシップを発揮する実務派という内面が、一見普通の人だが実はスゴイというギャップ好きのインドネシア人に大ウケして、大衆は一種の集団催眠状態にあるようです。

情報の質のレベル 2

見える化された結果を共有化することで問題点が共通認識されますが、共有化が進むことで情報の持つ希少価値が薄れて困る人間がいる場合、有益な情報を独占することでポジションを高めようという政治力が働きます。

3

日本人がインドネシアに来ると、インドネシア人ののんびり加減にイライラするというのは昔からよく聞く話で、インドネシア在住日本人にとってのバイブル的小説である深田祐介著「ガルーダ商人」の中でも、インドネシア宗教省の高官が日本人とインドネシア人を自宅に招待する際に、インドネシア人向けの招待状には、遅刻することを前提にパーティ開始時間を三十分早く書いておくという記述があるほどです。

宗教によって異なる「死んだらどうなる」の考え方 4

キリスト教もイスラム教もともにユダヤ教から派生した宗教であり、それぞれイエス・キリスト(本人が神)またはアッラーという唯一無二の神を信じます。

株価操作なんてインドネシア株では当たり前 5

株価は売り注文と買い注文により変動し、大量の売り注文を買う注文がたくさん入れば、他の投資家達は「俺も俺も」と続くことで株価が上がります。

心臓に毛が生えたインドネシア人のずうずうしい転職活動を応援してみた 6

インドネシア人は秘密の話は誰かに暴露しないと精神の安定を保てない人が多いため、内緒の話に情報の希少性は少なく信憑性も低いことが多いので、「ここだけの話」という枕詞付きで聞かされる話は話半分に聞いておいたほうがいいかもしれません。

日系企業のインドネシアでの存在意義 7

今のまま日本の人口減が続けば、内需は縮小の一途をたどるわけで、そうなると日本国内市場だけで生き残るのは難しいと判断する国内企業が、海外市場に活路を見出そうとするのは必然です。

チャンスはあるが勝てる分野を見つけるのが難しい 8

実際にインドネシアに住んでみて、自分で動いて人と話しをして、現地の事情を少しずつ理解していくにつれて、インドネシアで起業することが意外と手強いことに気づき、その難しさの原因は、高い送料と関税であったりローカル企業との競争であったり、就労ビザ(IMTA)や外国人技能開発基金(DPKK)などのランニングコストの高さであったりします。

インドネシアのシステムインテグレーション業界 9

先日JETRO(日本貿易振興機構)さんと、インドネシアの中小企業のIT投資について意見交換させていただく機会をいただいたのですが、そこで「システム投資のコストメリットはどのように説明できるのか」という、システムインテグレーターの存在価値にも関わる重要な問題提起がありました。

肉体と精神と心と魂 10

「Body and Soul」といえば、昨日の内閣改造に伴う人事で内閣府政務官に内定した自民党の今井絵理子参議院員がメンバーだったSPEEDのデビュー曲であり、インドネシアの老舗女性ファッションブランド名でもあります。

ジャカルタのラーメン市場 11

僕がインドネシアに初めて来たのが1997年10月、インドネシア語は分からないし、仕事は辛いし、周囲の人間は理不尽だし、一時期日本に帰りたくて仕方がない時期がありましたが、当時自分をかろうじてインドネシアに繋ぎ止める心の支えとなっていたのが、協栄プリンスビル(今のWisma Keiai)の日本食レストラン「五右衛門」であり、ここでキムチラーメンを食べることが唯一の楽しみと言っても過言ではありませんでした。

ブランド力、技術力、資金力の3要素 12

1998年のジャカルタ暴動後、ルピアが暴落し海外からのドル建て債務を抱えた国内企業が利子の支払いに苦しんでいた頃、僕は外貨が獲得できるインドネシアでの新しいビジネスを探していました。

日本とインドネシアの間でのタイムマシン経営が通じなくなっている件 13

先進国と後進国との間にある流行のタイムラグを利用して、先進国での成功例を後進国で実践するビジネスモデルをタイムマシン経営といいますが、インターネットの普及に伴い情報がフラット化してしまい、モノと情報のタイムラグが限りなく小さくなった今、先駆者である中小零細同業他社が乱立し市場が出来上がったところに、後発の大手が参入し先発零細を駆逐していく、という典型的な負けパターンにはまります。

サリナデパートとマクドナルド 14

本日5月10日を最後にインドネシアのマクドナルド第1号店であるサリナデパート店(Sarinah)が閉店になりますが、ジャカルタのショッピングモールが新しいコンセプトでモダンにリニューアルされ続ける中で、僕がインドネシアに来たばかりの20数年前には、若者の待ち合わせ場所の定番でもあったサリナデパートやブロックMのパサラヤ(Pasaraya)などは完全に時代に取り残されてしまいました。

不景気の歴史 15

僕がインドネシアに来てからこれまで何度か経済不況を見てきましたが、今回の新型コロナウィルスの感染拡大により、間違いなく景気後退しますので、数年後にはこれがコロナショックとかコロナ不況とか呼ばれるようになるのかもしれません。

日本のバブル経済崩壊後とインドネシアの通貨危機後 16

自分が大学に入学したのがバブル経済末期の1991年、土地も株価もMAX爆上げして、三菱地所がアメリカの象徴であるロックフェラーセンタービルを買収し、ジュリアナ東京でワンレンボディコン(登美丘高校ダンス部のバブリーダンスみたいなやつ)のお姉さん達が扇子振って踊っている時期でした。

内需と外需の自国経済に及ぼす影響 17

公共事業投資を行っても、お金が企業内や個人の貯蓄に滞留してしまい国内消費が増えないのが日本の状況であり、国内消費は増えても消費材の輸入品比率が高く、国内資産が海外に流出しているのがインドネシアの状況です。

2019年の総選挙を前にインドネシア政治史のおさらい 18

来年の大統領選挙(Pemilu Pilpres Pileg Indonesia 2019)に向けての選挙運動(Kampanye)を解禁するにあたり、投票用紙に印字される順番はジョコウィ現職大統領・マフル副大統領候補組が1番、プラボウォ大統領候補・サンディアガウノ副大統領候補組が2番と決まりました。

コーヒーをもっと楽しくもっと美味しく 19

インドネシアは北回帰線と南回帰線をはさむコーヒーベルトに位置するコーヒー栽培に適した国で、1602年の東インド会社の進出を契機にオランダの植民地支配が300年以上続き、その間アラビカ種のコーヒーが持ち込まれ、気候のいい高原地帯で栽培が開始されました。

インドネシア人の悪魔祓い 20

人間誰しも自分の中に悪魔が潜んでおり、それが何らかのきっかけで表面に出て来るという考え方自体には、背景に宗教が有るか無いかの違いだけで、基本的に理解できる話であり、それを信じるか信じないかは別として、そういう考えがあることを認めることは大切なことだと思います。

-情報システム

© 2020 バテラハイシステム Powered by STINGER