[AS/400]ライブラリバックアップ&FTPダウンロードスクリプト

概要

前にも、ライブラリバックアップやりましたが、今度は、複数ライブラリをまとめて、って言うか、順番にバックアップ&ダウンロードします。
それに今回は BASP21 を使わずに(使えずに)、Windows におまけの ftp.exe を使ってます。
しかも、ダウンロードは別プロセス起動で、SAVF と平行して動くぞ!(^o^)
タイムアウトになったら、ログ見て、手動でフォローして下さい・・・。

登録:2009/01/24

良い子のお約束

このページに書かれている事を実行して、何が起こっても私は知りません。
まぁ、このページに到達された方なら大丈夫でしょうけど(^o^)。

環境とか

使い方

スクリプト re971001.hta の固定値をご自分の環境に合わせて変更し、起動して下さい。
ログ保存フォルダに、色々残ります。ダウンロードが終わったら、自分で削除して下さい。 例によって、保管ジョブとFTPは別ジョブなので、保管ファイル作成ライブラリに QTEMP は使えません。

こんな感じの画面です。

スクリプトのソース

[re971001.hta:ここから]======================================================================
<html>
<head>
	<HTA:APPLICATION
		APPLICATIONNAME="ASライブラリFTPダウンロード"
		ICON="wupdmgr.exe" 
		SCROLL="no"
		ID="myHTA"
	/>
	<style type="text/css">
	<!--
		body,select,input,td	{
			font-family 		: monospace;
		}
		h1	{
			margin-top 			: 0.0em;
			padding-top			: 0.3em;
			padding-bottom		: 0.2em;
			margin-bottom 		: 0.5em;
			padding-left		: 1em;
			color				: #3333ff;
			background-color	: #99ffff;
			font-size			: 130%;
			font-family			: "DF平成明朝体W7","MS 明朝",monospace;	
			font-weight			: normal;
		}
		p	{
			margin-top 			: 0 em;
			padding-top			: 0 em;
			padding-bottom		: 0 em;
			margin-bottom 		: 0 em;
		}
		textarea.data_list	{
			font-family 		: monospace;
			font-size			: 150%;
		}
		textarea.log_list	{
			font-family 		: monospace;
		}
		input.pc_file	{
			width				: 23em;
		}
		input.text	{
			font-family 		: monospace;
			width				: 8em;	
		}
	-->
	</style>
</head>
<body onload="onload_proc()">
<form id="form_main" onsubmit="">
<h1 id="page_title">対象AS</h1>
<table title="フォルダ名には、ブランクを含めないように!">
<tr>
	<td>
		<textarea class="data_list" name="member_lists" rows="14" cols="10">
PJ1DTA
PJ1PGM
PJ1SRC</textarea>
	</td>
	<td class="form_options">
		<dl>
			<dt>←保管するライブラリ名を、改行で区切って入れて下さい。</dt>
		</dl>
		<dl>
			<dt>保管ファイル保存フォルダ(末尾の \ は無くても可)</dt>
			<dd>
				<input class="pc_file"  name="data_dir" value="C:\FTP_Download\SAVF" />
			</dd>
			<dt>ログ保存フォルダ(末尾の \ は無くても可)</dt>
			<dd>
				<input class="pc_file"  name="log_dir" value="C:\FTP_Download\log" />
			</dd>
			<dd>
				スクリプト実行ログ・FTP送信スクリプト・FTP実行ログが保存されます。
				ログは追加、FTP送信スクリプトは上書きされます。
			</dd>
			<dt>対象AS</dt>
			<dd>
				<select name="AS_SYSTEM" size="1" >
					<option value="192.168.100.101" selected>AS1号機</option>
					<option value="192.168.100.102" >AS2号機</option>
				</select>
			</dd>
			<dt>ユーザーID/パスワード</dt>
			<dd>
				<input class="text" name="AS_UID" value="" />
				/<input class="text" name="AS_PWD" value="" type="password"/>
			</dd>
			<dt>保管オプション</dt>
			<dd>
				<input id="SAV_DTACPR" type="checkbox"><label for="SAV_DTACPR">DTACPR(*HIGH)</label>
				<input id="SAV_ACCPTH" type="checkbox"><label for="SAV_ACCPTH">ACCPTH(*YES)</label>
				TGTRLS <select name="SAV_TGTRLS" size="1" >
					<option value="*CURRENT" selected>*CURRENT</option>
					<option value="V5R4M0"   >V5R4M0</option>
					<option value="V5R3M0"   >V5R3M0</option>
					<option value="V5R2M0"   >V5R2M0</option>
					<option value="V5R1M0"   >V5R1M0</option>
				</select>
			<dd>
			</dd>
			<dt>保管ファイル作成ライブラリ名</dt>
			<dd>
				<input class="text" name="AS_lib_to" value="QGPL" />
			</dd>
		</dl>
		<dl>
			<dt><input type=button onclick="S_Download()" value="ダウンロード" /></dt>
		</dl>
	</td>
</tr>
</table>
</form>

<script language="VBScript">
	option explicit

	Const C_title_text = "ASライブラリFTPダウンロード"
	'接続初期値
	Const C_Default_AS	= "192.168.100.101"
	Const C_Default_user	= "USER"
	Const C_Default_pass	= "PASS"
	Const C_window_width	= 650
	Const C_window_height	= 490
	Const C_lib_FTP_DL_log_file_name		= "AS_Lib_FTP_DL.log"

	dim rt,i
	dim G_AS400,G_AS_CMD
	dim G_fso,G_write_file
	dim G_log_file_name

'--------------------------------------------------------------------------------
'ライブラリダウンロード
Sub S_Download()

	dim LA_member,L_member

	'1.AS/400接続
	'2.ライブラリ単位のループ処理
	'3.終了処理

	Err.clear
	'1.AS/400接続
	Set G_AS400 		= createobject("cwbx.AS400System")
	G_AS400.define 		document.all("AS_SYSTEM").value
	G_AS400.UserID 		= document.all("AS_UID").value
	G_AS400.Password 	= document.all("AS_PWD").value

	Set G_AS_CMD = createobject("cwbx.Command")
	Set G_AS_CMD.system = G_AS400

	'ログファイルのオープン
	G_log_file_name = trim(document.all("log_dir").value) & "\" & C_lib_FTP_DL_log_file_name
	Set G_fso = CreateObject("Scripting.FileSystemObject")
	Set G_write_file = G_fso.OpenTextFile(G_log_file_name,8,true)

	'2.ライブラリ単位のループ処理
	LA_member = Split(document.all("member_lists").value,vbcrlf)
	for i = 0 to UBound(LA_member)	'それぞれのメンバー毎の処理
		L_member = trim(LA_member(i))
		if L_member <> "" then	'ブランク行は無視で。
			'ライブラリ単位の処理
			Call S_Download_by_LIB(L_member)
		end if
		If Err.Number <> 0 Then
			exit for
		end if
	next

	'ログファイルのクローズ
	G_write_file.Close
	Set G_fso = nothing

	Set G_AS_CMD = Nothing
	Set G_AS400 = Nothing

	On Error Goto 0

	Call msgbox("おわりました。")

end sub

'--------------------------------------------------------------------------------
'ライブラリダウンロード
Sub S_Download_by_LIB(P_lib)

	dim L_cmd_str
	dim L_log_file_name
	dim L_FTP_script_file,L_FTP_script_file_name
	dim L_Shell,L_FTP_str

	'1.DLTF QGPL/TargetLIB
	'2.CRTSAVF QGPL/TargetLIB
	'3.SAVLIB TargetLIB *SAVF SAVF(QGPL/TargetLIB) SAVACT(*LIB) 
	'		DTACPR(*HIGH)
	'4.FTPスクリプト作成
			'1.get 〜
			'2.DLTF QGPL/TargetLIB
	'5.ftp.exe 起動

	On Error Resume Next
	'1.DLTF QGPL/TargetLIB
	L_cmd_str = "DLTF " & document.all("AS_lib_to").value & "/" & P_lib
	Call S_add_result(L_cmd_str)
	G_AS_CMD.run L_cmd_str
	'こけても無視
	If Err = -2147467259 Then Err.Clear

	'2.CRTSAVF QGPL/TargetLIB
	L_cmd_str = "CRTSAVF " & document.all("AS_lib_to").value & "/" & P_lib
	Call S_add_result(L_cmd_str)
	G_AS_CMD.run L_cmd_str
	If Err.Number <> 0 Then
		Call S_add_result(Err.Description)	'結果メッセージの表示
		exit sub
	end if

	'3.SAVLIB TargetLIB *SAVF SAVF(QGPL/TargetLIB) SAVACT(*LIB) 
	'		DTACPR(*HIGH)
	L_cmd_str = "SAVLIB " & P_lib & " *SAVF SAVF("
	L_cmd_str = L_cmd_str  & document.all("AS_lib_to").value & "/" & P_lib & ")"
	L_cmd_str = L_cmd_str  & " SAVACT(*LIB)"
	L_cmd_str = L_cmd_str  & " TGTRLS(" & document.all("SAV_TGTRLS").value & ")"
	if document.all("SAV_DTACPR").checked  then 
		L_cmd_str = L_cmd_str  & " DTACPR(*HIGH)"
	end if
	if document.all("SAV_ACCPTH").checked  then 
		L_cmd_str = L_cmd_str  & " ACCPTH(*YES)"
	end if
	Call S_add_result(L_cmd_str)
	G_AS_CMD.run L_cmd_str
	If Err.Number <> 0 Then
		Call S_add_result(Err.Description)	'結果メッセージの表示
		exit sub
	end if

	'4.FTPスクリプト作成
		'ファイル名:
			'TargetLIB.ftp
		'内容
			'OPEN 192.168.100.101
			'F
			'F
			'bin
			'get QGPL/TargetLIB (フォルダ)
			'quote rcmd DLTF QGPL/TargetLIB
			'bye
'	L_FTP_script_file_name = mid(myHTA.commandLine,2,InstrRev(myHTA.commandLine, "\", -1, 1)-1) & P_lib & ".ftp"
	L_FTP_script_file_name = trim(document.all("log_dir").value) & "\" & P_lib & ".ftp"

	Set L_FTP_script_file = G_fso.OpenTextFile(L_FTP_script_file_name,2,true)
	L_FTP_script_file.WriteLine "open " & document.all("AS_SYSTEM").value
	L_FTP_script_file.WriteLine document.all("AS_UID").value
	L_FTP_script_file.WriteLine document.all("AS_PWD").value
	L_FTP_script_file.WriteLine "bin"
	L_FTP_script_file.WriteLine "get " & document.all("AS_lib_to").value & "/" & P_lib & " """ & document.all("data_dir").value & "\\" & P_lib & """"
	L_FTP_script_file.WriteLine "quote rcmd DLTF " & document.all("AS_lib_to").value & "/" & P_lib
	L_FTP_script_file.WriteLine "bye"
	L_FTP_script_file.Close

	'5.ftp.exe 非同期呼び出し
	set L_Shell = CreateObject("WScript.Shell")
	L_FTP_str = "cmd.exe /C ftp.exe -s:" & L_FTP_script_file_name & " >> " & trim(document.all("log_dir").value) & "\" & P_lib & ".log"
	Call S_add_result(L_FTP_str)	'結果メッセージの表示
	L_Shell.run L_FTP_str,,false
	set L_Shell = nothing

	On Error Goto 0

end sub

'--------------------------------------------------------------------------------
'結果ログの追加
sub S_add_result(P_msg)
	dim L_time,L_time_text
	'※FSOと書込ファイルのオープンクローズは、外でやってます。

	L_time = time
	L_time_text = right("00" & datepart("h",L_time),2) & ":" & right("00" & datepart("n",L_time),2) & ":" & right("00" & datepart("s",L_time),2)

	G_write_file.WriteLine L_time_text & " " & P_msg

end sub
'--------------------------------------------------------------------------------
sub onload_proc()

	document.title = C_title_text
	document.all("page_title").innerText = C_title_text
	rt = window.resizeTo(C_window_width,C_window_height)

	'初期値設定
	document.all("AS_SYSTEM").value = C_Default_AS
	document.all("AS_UID").value = C_Default_user
	document.all("AS_PWD").value = C_Default_pass

end sub
'--------------------------------------------------------------------------------
</script>
</body></html>
[re971001.hta:ここまで]======================================================================