【IRIS/Cache】バッチファイルを実行し引数を受け取る

はじめに

ローカル環境であれば、windowsのバッチファイルを実行する事はほぼありません。
バッチファイルで出来る事は、だいたいIRIS/Cacheで出来ちゃいますからね。

ただ、そうは言っても、他社とサーバに相乗りしてかつ連携を求められたときは、バッチファイルを実行して引数を受け取ったりする事もあったりします。

今回は、バッチファイルの実行と、引数の受け取り方をご紹介します。

バッチファイルを実行し引数を受け取る

サンプル用バッチの作成

先ずはサンプルとして、戻り値を返すバッチを作成しました。
ファイルパスは「D:\Temp\bat\sample.bat」になります。

@echo off

set x=709
set y=5
set /a ret=x + y

echo %ret%

冒頭に「@echo off」を入れておかないと、正常に戻り値が取得できないので必須で組み込みます。

処理の内容については、特に何を記述しても問題ありません。
今回は簡単に「709 + 5」を計算し、その答えを戻り値として設定します。

サンプルの戻り値は「714」になります。

IRIS/Cacheコマンド

バッチファイルを実行しつつ戻り値を受け取る方法は、「%Library.File.cls」を使用します。
ファイルを開くモードは「rq」をしていします。

s ret = ""
s cmd=##class(%File).%New("D:\Temp\bat\sample.bat")
d cmd.Open("rq")
while('cmd.AtEnd){ s ret=cmd.ReadLine() q:ret'="" }
w ret

ターミナルで上記コマンドを実行すると、下記結果を受け取ります。

SAMPLE>s ret=""
 
SAMPLE>s cmd=##class(%File).%New("D:\Temp\bat\sample.bat")
 
SAMPLE>d cmd.Open("rq")
 
SAMPLE>while('cmd.AtEnd){ s ret=cmd.ReadLine() q:ret'="" }
 
SAMPLE>
 
SAMPLE>w ret
714
SAMPLE>

バッチファイルからの戻り値を、正常に受け取れている事が分かります。

戻り値は数値だけではなく、アルファベット・日本語も問題無く取得する事が可能です。

バッチファイルを実行する(※戻り値は取得しない)

ただバッチファイルを実行したいのであれば、$zf(-1) or $zf(-100)で実行可能です。
$zf(-1)はセキュリティ的に非推奨なので、今回は「$zf(-100)」をご紹介いたします。

一先ず、動作が確認できるようにPowerShellとバッチファイルを作成します。
ファイル名が「sample.ps1(上)」と「sample.bat(下)」と名付けました。

Param($COMMENT)

Set-Location (Split-Path $MyInvocation.MyCommand.Path -parent)

$TIME = (Get-Date).ToString("yyyyMMdd_HHmmss")
New-Item -Path "D:\Temp\bat" -Name "${TIME}_sample.txt" -ItemType "file" -Value $COMMENT -Force
set THIS_PATH=%~dp0
powershell -ExecutionPolicy RemoteSigned -File %THIS_PATH%sample.ps1 -COMMENT "%1"

処理の流れとしては下記になります。

[IRIS(ターミナル)] > [sample.bat] > [sample.ps1] > テキスト出力(yyyymmdd_hhmmss_sample.txt)

ではターミナルを起動し、バッチファイルを実行します。
 ・2番目の引数は「/SHELL」を指定して下さい。
 ・sample.batファイルに渡す文字列は「abcdefg」になります。

w $zf(-100, "/SHELL", "D:\Temp\bat\sample.bat", "abcdefg") // -> 0

コマンドの実行が成功したら「0」が返ってきます。
 ※失敗すると「1 or -1 or <NOTOPEN>」が返ります。

では、PowerShellによって作成されたテキストファイルを確認したいと思います。
ここにターミナルから送った「abcdefg」が表示されていれば、一連の動作確認は成功になります。

ファイルが作成され、テキストの内容も問題ありませんね。
バッチが正常に実行された事を確認致しました。

実行結果をロギングする

$zfコマンドは、実効したさいに出力される結果が分からないのが現状です。
そのため、コマンドが失敗した時の原因を特定するまでに時間がかかってしまいます。

そこで、実行結果をロギングしましょう。

コマンドは下記になります。
サンプルコマンドは、バッチファイル「C:\temp\a.bat」を動作させるコマンドになります。

s flg = $zf(-100, "/ENV=env.../STDERR=""C:\temp\log.txt""", "C:\temp\a.bat")

2番目に記載している「”/ENV=env…/STDERR=””C:\temp\log.txt”””」がロギングのキモになります。

実行するとファイル「C:\temp\log.txt」が作成され、実行時に出力される文言を確認する事ができます。

コマンドが動かないときは、ぜひお試しください。

おわりに

今回は、IRIS/Cacheからのバッチファイル実行方法をご紹介いたしました。

IRIS/Cacheユーザであれば、バッチファイルを動かす事が少ないかと思います。
バッチファイルを動かす必要がでた場合は、何らかのお役に立てれば嬉しいです。

戻り値が(-1, <NOTOPEN>)が返ってきた場合、サービス・アカウントの設定が必要になります。
windowsコマンドプロンプトより、下記コマンドを実行して下さい。

cd [インストールディレクトリ]\bin
irisinstall setserviceusername [インスタンス名] [管理者ユーザ名] [パスワード]

Cacheだと「cinstall」になります。