ocr ( Python + Tesseract ) で惨敗した
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
リンクの記事で Python で ocr をしたのですが、全然正しく文字を認識しませんでした。
初心者が Python で初めての ocr - 解析エンジニアの自動化 blog
画像を変えて、また、 Python で ocr してみます。
プログラム
ソースコード
# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os # os の情報を扱うライブラリ
import pytesseract # tesseract の python 用ライブラリ
from PIL import Image # 画像処理ライブラリ
import matplotlib.pyplot as plt # データプロット用ライブラリ
import numpy as np # データ分析用ライブラリ
# カレントディレクトリを変更する
os.chdir("C:\\作業")
# pytesseract に tesseract のパスを通す
pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
# 画像の読み込み
#img = Image.open('C:\作業\ocr-test1.jpg')
img = Image.open('C:\作業\ocr-test2.png')
#img = Image.open('C:\作業\ocr-test3.png')
#img = Image.open('C:\作業\ocr-test4.png')
#img = Image.open('C:\作業\ocr-test5.png')
#img = Image.open('C:\作業\ocr-test6.png')
#img = Image.open('C:\作業\ocr-test7.png')
#img = Image.open('C:\作業\ocr-test8.png')
#img = Image.open('C:\作業\ocr-test9.png')
#img = Image.open('C:\作業\ocr-test10.png')
#img = Image.open('C:\作業\ocr-test11.png')
# 画像を配列に変換
im_list = np.array(img)
# データプロットライブラリに貼り付け
plt.imshow(im_list)
# 表示
plt.show()
# テキスト抽出
txt = pytesseract.image_to_string(img)
# 抽出したテキストの出力
print()
print(txt)
print()
使い方
画像の読み込みについては何回も失敗に失敗を重ねて 11 枚の画像を作りました。 1 つの記事には出来そうに無いので、1 つの記事で 1 画像ずつ紹介していきます。コメントを意味する ♯ を順に付けていきながら、読み込む画像を変えて ocr していきました。
その他の Python ソースコードについてはソースコードのコメントに処理内容を書いたので、説明は割愛します。
ocr の結果
図2 は ocr の結果をキャプチャした画像です。
図3 は 図2 を比較表にまとめた画像です。
なんか数字をたくさん抽出しています。しかし、ところどころアルファベットが混じっています。
前回よりは進歩している気がします。
コメント
初めての ocr よりはマシになった気がしますが、全く使えません…
こんな調子で 11 枚もの画像を作りました。
ここで、 10 × 10 の表の数字を読み取るのを早々に諦めて、簡単に読み取れそうな画像から試していく事にしました。
以上
初心者が Python で初めての ocr
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
リンクの記事で Tesseract と pytesseract をインストールしました。
初心者が Python で ocr するために Tesseract をインストールする - 解析エンジニアの自動化 blog
初心者が Python で ocr するために pytesseract をインストールする - 解析エンジニアの自動化 blog
ここまできたら、後はもう少しです。
Python で ocr してみます。
プログラム
ソースコード
# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os # os の情報を扱うライブラリ
import pytesseract # tesseract の python 用ライブラリ
from PIL import Image # 画像処理ライブラリ
import matplotlib.pyplot as plt # データプロット用ライブラリ
import numpy as np # データ分析用ライブラリ
# カレントディレクトリを変更する
os.chdir("C:\\作業")
# pytesseract に tesseract のパスを通す
pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
# 画像の読み込み
img = Image.open('C:\作業\ocr-test1.jpg')
#img = Image.open('C:\作業\ocr-test2.png')
#img = Image.open('C:\作業\ocr-test3.png')
#img = Image.open('C:\作業\ocr-test4.png')
#img = Image.open('C:\作業\ocr-test5.png')
#img = Image.open('C:\作業\ocr-test6.png')
#img = Image.open('C:\作業\ocr-test7.png')
#img = Image.open('C:\作業\ocr-test8.png')
#img = Image.open('C:\作業\ocr-test9.png')
#img = Image.open('C:\作業\ocr-test10.png')
#img = Image.open('C:\作業\ocr-test11.png')
# 画像を配列に変換
im_list = np.array(img)
# データプロットライブラリに貼り付け
plt.imshow(im_list)
# 表示
plt.show()
# テキスト抽出
txt = pytesseract.image_to_string(img)
# 抽出したテキストの出力
print()
print(txt)
print()
使い方
画像の読み込みについては何回も失敗に失敗を重ねて 11 枚の画像を作りました。 1 つの記事には出来そうに無いので、1 つの記事で 1 画像ずつ紹介していきます。コメントを意味する ♯ を順に付けていきながら、読み込む画像を変えて ocr していきました。
その他の Python ソースコードについてはソースコードのコメントに処理内容を書いたので、説明は割愛します。
ocr の結果
図2 は ocr の結果をキャプチャした画像です。
図3 は 図2 を比較表にまとめた画像です。
全然読めてません。全くの役立たずでした。
コメント
まさかの精度でした…
この結果から、どんな画像なら読み込めるのかどんどん試しました。
続く…
以上
初心者が Python で ocr するために pytesseract をインストールする
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
Python で ocr してみようと思いたって、リンクの記事で Tesseract をインストールしました。
Python で ocr するために Tesseract をインストールする - 解析エンジニアの自動化 blog
次に pytesseract を Windows 7 にインストールします。
インストール環境
Windows 7 64 bit
インストール
コマンドプロンプトの起動
『 WinPython Command Prompt.exe 』を起動します。図1 は exe ファイルの画像です。
起動画面
図1 の exe ファイルを起動すると図2 の画面が表示される。インストールコマンド入力
『 pip install pytesseract 』と入力して、 Enter を入力します。図3 が入力した時の WinPython Command Prompt です。
コメント
これで準備が整いました。
あとは Python で コーディングしてプログラムを動かすだけです。
しかし、『 pip 』コマンドって楽ですね。
以上
初心者が Python で ocr するために Tesseract をインストールする
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
テキスト抽出が出来ないスキャンされた PDF や 画像からテキスト抽出したい事が結構な頻度であります。
プログラムで自動化する時も一連の作業の流れの中で、どうしてもテキストを読み取る作業は人間が行うために、処理を中断させたり、前もって入力しておく事が必要になったりします。
結果的に何回も同じ情報を探していたりするので、出来る事ならプログラムに書類を読ませようと思い、 Python で ocr してみようと思います。
そこで、まず Tesseract を Windows 7 にインストールします。
インストール環境
Windows 7 64 bit
ダウンロード
インターネット検索
『 tesseract-ocr-setup-3.02.02.exe 』で検索します。図1 は 2018/11/08 現在の検索結果の画像です。
ダウンロード
1 番上の Web ページにアクセスして、数秒待っていると、ダウンロード開始のポップアップが表示されます。Tesseract 入手
しばらくするとダウンロードが終わります。図3 がダウンロードした Tesseract のアイコンです。
インストール
あとはインストーラーにしたがってインストールします。全て YES でインストールすると図4 の様なフォルダが出来上がります。
コメント
とりあえず Tesseract のインストールまで。
これだけでは Python で Tesseract は使えないので、この次は pytesseract のインストールの記事を書きます。
以上
C# から VBScript を実行する C# ソースコードを自動生成する
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
リンクの記事で既存の VBScript から VBScript ファイルの作成、実行、削除する関数を作成する事に成功しました。
既存の VBScript を関数化する VBScript を作成する - 解析エンジニアの自動化 blog
せっかくなんで既存の VBScript から VBScript ファイルの作成、実行、削除する C# のソースコードを生成する VBScript を作成します。
関数
ソースコード
ForReading = 1 ' OpenTextFile 引数用変数
ForWriting = 2 ' OpenTextFile 引数用変数
ForAppending = 8 ' OpenTextFile 引数用変数
'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
"ファイルをドロップしてください。"
WScript.Quit
End If
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'-------------------------------------------------------------------------------------------------------
' ドロップされた引数がファイル以外ならアラートして終了する
For each args In WScript.Arguments
'----------------------------------------------------------------------------------------------------
' ドロップされた引数がフォルダかファイルかを判定する
If objFileSys.FolderExists(args) then
'-------------------------------------------------------------------------------------------------
' is folder.
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
ElseIf objFileSys.FileExists(args) then
'-------------------------------------------------------------------------------------------------
' is file.
If Instr(1, args, ".vbs") = 0 Then
'----------------------------------------------------------------------------------------------
' is not VBScript file.
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
WScript.Echo "VBScript では無いファイルがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
End If
Else
'-------------------------------------------------------------------------------------------------
' is unknown.
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
End If
Next
'-------------------------------------------------------------------------------------------------------
' VBScript ファイルを作成するパスの作成
WrapperVBSDir = SelfPath()
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'-------------------------------------------------------------------------------------------------------
' 引数の VBScript ファイルの読み込み
For each args In WScript.Arguments
' 引数の VBScript ファイルオープン
Set InputFile = objFileSys.OpenTextFile(args, ForReading, False)
' ファイル名のみ抽出
InputFileName = objFileSys.getFileName(args)
' コード格納用変数
code = ""
' 引数の VBScript ファイルを最終行まで読み込む
Do Until InputFile.AtEndOfStream
' 1行読み込む
strLine = InputFile.ReadLine
' 「\」を「\\」に置換する
strLine = Replace(strLine, "\", "\\")
' 「"」を「\"」に置換する
strLine = Replace(strLine, """", "\""")
' 読み込んだ文字列を「"」で囲む
strLine = """" & strLine & """"
' コード格納用変数が空なら
If code = "" Then
' 配列変数の文字列と合わせて代入する
code = " string[] arrCode = new string[] {" & """" & "Wrapped" & InputFileName & """" & ", " & strLine
' コード格納用変数が既に代入済みなら
Else
' 「, 」文字列で区切って代入する
code = code & ", " & strLine
End If
Loop
' 配列変数の最後の「)」を代入する
code = code & "};" & vbcrlf & vbcrlf
' Function コードの追加
code = "// using System.Diagnostics;" & vbcrlf & "private int Wrapper_" & Left(InputFileName, InstrRev(InputFileName, ".") - 1) & "()" & vbcrlf & "{" & vbcrlf & code
' パス取得コードの追加
code = code & " //自分自身の実行ファイルのパスを取得する" & vbcrlf
code = code & " string appPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;" & vbcrlf & vbcrlf
' VBScript 作成コードの追加
code = code & " // VBScript 作成コード" & vbcrlf
code = code & " // ストリームライターのオープン(第二引数 => true:追記 false:削除・上書き)" & vbcrlf
code = code & " StreamWriter swVBS = new StreamWriter(appPath + arrCode[0], false, Encoding.GetEncoding(""Shift_JIS""));" & vbcrlf
code = code & " // コード書き込み" & vbcrlf
code = code & " for (int i = 1; i < arrCode.Length; i++)" & vbcrlf
code = code & " {" & vbcrlf
code = code & " swVBS.WriteLine($""{arrCode[i]}"");" & vbcrlf
code = code & " }" & vbcrlf
code = code & " // ストリームライターのクローズ" & vbcrlf
code = code & " swVBS.Close();" & vbcrlf & vbcrlf
' 作成した VBScript ファイルの実行コードの追加
code = code & " // VBScript の実行" & vbcrlf
code = code & " Process proc = new Process();" & vbcrlf
code = code & " proc.StartInfo.FileName = arrCode[0];" & vbcrlf
code = code & " proc.Start();" & vbcrlf
code = code & " proc.WaitForExit();" & vbcrlf
code = code & " int ret = proc.ExitCode;" & vbcrlf & vbcrlf
' 作成した VBScript ファイルの削除コードの追加
code = code & " //作成した VBScript を削除する" & vbcrlf
code = code & " File.Delete(appPath + arrCode[0]);" & vbcrlf
' 戻り値を返すコードの追加
code = code & " // 戻り値を返す" & vbcrlf
code = code & " return ret;" & vbcrlf
' Function コードの追加
code = code & "}"
' 出力ファイルオープン
Set OutputFile = objFileSys.OpenTextFile(WrapperVBSDir & "\C#Wrapper-" & InputFileName, ForWriting, True)
' 出力
OutputFile.WriteLine code
' 引数の VBScript ファイルクローズ
InputFile.Close
' 出力ファイルクローズ
OutputFile.Close
Next
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
Function SelfPath()
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
' 自分のパスの取得
SelfPath = objFileSys.getParentFolderName(WScript.ScriptFullName)
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
End Function
使い方
既存の VBScript ファイルをドラッグ&ドロップすると、『C#Wrapper-[ドロップしたファイル名].vbs』という VBScript ファイルを作成します。ファイルの中身は『Wrapper_ [ドロップしたファイル名]』という関数名の C# コードが記述されています。
この関数を C# にコピペして、関数を使用すればドラッグ&ドロップした VBScript が実行出来ます。
ソースコード
〜ドロップした VBScript 〜
msg = "c:\test\test.txt"
msg = msg & "これは Sample2.vbs です。"
MsgBox msg
WScript.Quit(101) ' 戻り値
ソースコード
〜関数化した VBScript 〜
C#Wrapper-Sample2.vbs
// using System.Diagnostics;
private int Wrapper_Sample2()
{
string[] arrCode = new string[] {"WrappedSample2.vbs", "msg = \"c:\\test\\test.txt\"", "msg = msg & \"これは Sample2.vbs です。\"", "MsgBox msg", "WScript.Quit(101) ' 戻り値"};
//自分自身の実行ファイルのパスを取得する
string appPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// VBScript 作成コード
// ストリームライターのオープン(第二引数 => true:追記 false:削除・上書き)
StreamWriter swVBS = new StreamWriter(appPath + arrCode[0], false, Encoding.GetEncoding("Shift_JIS"));
// コード書き込み
for (int i = 1; i < arrCode.Length; i++)
{
swVBS.WriteLine($"{arrCode[i]}");
}
// ストリームライターのクローズ
swVBS.Close();
// VBScript の実行
Process proc = new Process();
proc.StartInfo.FileName = arrCode[0];
proc.Start();
proc.WaitForExit();
int ret = proc.ExitCode;
//作成した VBScript を削除する
File.Delete(appPath + arrCode[0]);
// 戻り値を返す
return ret;
}
コメント
VBScript を C# の関数化する事が出来ましたが、引数を必要とする VBScript には対応出来ません。
完全に関数化出来るようにしたいです。
まぁ、 Excel の操作とか引数のいらない簡単な設定の処理を VBScript で書いて C# に組み込めれば良いのかなと思っています。
以上
既存の VBScript を関数化する VBScript を作成する
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
リンクの記事で VBScript から VBScript を作成して、実行する事に成功しました。
VBScript から VBScript を作成する - 解析エンジニアの自動化 blog
作成するための VBScript コードは VBScript ファイル毎に異なってきます。
せっかく今まで作成してきた VBScript が1つにまとめられるのに、まとめるためのプログラムを書く時間が増えてしまうのはもったいないです。
今まで作成した VBScript を簡単に関数化する VBScript を作成します。
関数
ソースコード
ForReading = 1 ' OpenTextFile 引数用変数
ForWriting = 2 ' OpenTextFile 引数用変数
ForAppending = 8 ' OpenTextFile 引数用変数
'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
"ファイルをドロップしてください。"
WScript.Quit
End If
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'-------------------------------------------------------------------------------------------------------
' ドロップされた引数がファイル以外ならアラートして終了する
For each args In WScript.Arguments
'----------------------------------------------------------------------------------------------------
' ドロップされた引数がフォルダかファイルかを判定する
If objFileSys.FolderExists(args) then
'-------------------------------------------------------------------------------------------------
' is folder.
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
ElseIf objFileSys.FileExists(args) then
'-------------------------------------------------------------------------------------------------
' is file.
If Instr(1, args, ".vbs") = 0 Then
'----------------------------------------------------------------------------------------------
' is not VBScript file.
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
WScript.Echo "VBScript では無いファイルがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
End If
Else
'-------------------------------------------------------------------------------------------------
' is unknown.
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
End If
Next
'-------------------------------------------------------------------------------------------------------
' VBScript ファイルを作成するパスの作成
WrapperVBSDir = SelfPath()
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'-------------------------------------------------------------------------------------------------------
' 引数の VBScript ファイルの読み込み
For each args In WScript.Arguments
' 引数の VBScript ファイルオープン
Set InputFile = objFileSys.OpenTextFile(args, ForReading, False)
' ファイル名のみ抽出
InputFileName = objFileSys.getFileName(args)
' コード格納用変数
code = ""
' 引数の VBScript ファイルを最終行まで読み込む
Do Until InputFile.AtEndOfStream
' 1行読み込む
strLine = InputFile.ReadLine
' 「"」を「""」に置換する
strLine = Replace(strLine, """", """""")
' 読み込んだ文字列を「"」で囲む
strLine = """" & strLine & """"
' コード格納用変数が空なら
If code = "" Then
' Array 関数の文字列と合わせて代入する
code = " arrCode = Array(" & """" & "Wrapped" & InputFileName & """" & ", " & strLine
' コード格納用変数が既に代入済みなら
Else
' 「, 」文字列で区切って代入する
code = code & ", " & strLine
End If
Loop
' Array 関数の最後の「)」を代入する
code = code & ")" & vbcrlf & vbcrlf
' Function コードの追加
code = "Function Wrapper_" & Left(InputFileName, InstrRev(InputFileName, ".") - 1) & "()" & vbcrlf & vbcrlf & code
' VBScript 作成コードの追加
code = code & " ' VBScript 作成コード" & vbcrlf
code = code & " ForWriting = 2 ' OpenTextFile 引数用変数" & vbcrlf
code = code & " With CreateObject(""Scripting.FileSystemObject"").OpenTextFile(arrCode(0), ForWriting, True)" & vbcrlf
code = code & " for i = LBound(arrCode) + 1 to UBound(arrCode)" & vbcrlf
code = code & " .WriteLine arrCode(i)" & vbcrlf
code = code & " next" & vbcrlf
code = code & " .Close" & vbcrlf
code = code & " End With" & vbcrlf & vbcrlf
' 作成した VBScript ファイルの実行コードの追加
code = code & " ' シェルオブジェクト作成" & vbcrlf
code = code & " Set objWsh = WScript.CreateObject(""WScript.Shell"")" & vbcrlf & vbcrlf
code = code & " ' Wrapped" & InputFileName & " を実行" & vbcrlf
code = code & " ret = objWsh.Run(""Wrapped" & InputFileName & """, , True)" & vbcrlf & vbcrlf
code = code & " ' シェルオブジェクトの破棄" & vbcrlf
code = code & " Set objWsh = Nothing" & vbcrlf & vbcrlf
' 戻り値を返すコードの追加
code = code & " ' 戻り値を返す" & vbcrlf
code = code & " Wrapper_" & Left(InputFileName, InstrRev(InputFileName, ".") - 1) & " = ret" & vbcrlf & vbcrlf
' 作成した VBScript ファイルの削除コードの追加
code = code & " ' ファイルシステムオブジェクトの作成" & vbcrlf
code = code & " Set objFso = CreateObject(""Scripting.FileSystemObject"")" & vbcrlf & vbcrlf
code = code & " ' 作成した VBScript ファイルの削除" & vbcrlf
code = code & " Call objFso.DeleteFile(arrCode(0), True)" & vbcrlf & vbcrlf
code = code & " ' ファイルシステムオブジェクトの破棄" & vbcrlf
code = code & " Set objFso = Nothing" & vbcrlf
' Function コードの追加
code = code & vbcrlf & "End Function"
' 出力ファイルオープン
Set OutputFile = objFileSys.OpenTextFile(WrapperVBSDir & "\Wrapper-" & InputFileName, ForWriting, True)
' 出力
OutputFile.WriteLine code
' 引数の VBScript ファイルクローズ
InputFile.Close
' 出力ファイルクローズ
OutputFile.Close
Next
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
Function SelfPath()
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
' 自分のパスの取得
SelfPath = objFileSys.getParentFolderName(WScript.ScriptFullName)
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
End Function
使い方
既存の VBScript ファイルをドラッグ&ドロップすると、『Wrapper-[ドロップしたファイル名].vbs』という VBScript ファイルを作成します。ファイルの中身は『Wrapper_ [ドロップしたファイル名]』という関数名の VBScript が記述されています。
この関数をコピペして、関数を使用すればドラッグ&ドロップした VBScript が実行出来ます。
ソースコード
〜ドロップした VBScript 〜
Sample2.vbs
msg = "これは Sample2.vbs です。"
MsgBox msg
WScript.Quit(101) ' 戻り値
ソースコード
〜関数化した VBScript 〜
Wrapper-Sample2.vbs
Function Wrapper_Sample2()
arrCode = Array("WrappedSample2.vbs", "msg = ""これは Sample2.vbs です。""", "MsgBox msg", "WScript.Quit(101) ' 戻り値")
' VBScript 作成コード
ForWriting = 2 ' OpenTextFile 引数用変数
With CreateObject("Scripting.FileSystemObject").OpenTextFile(arrCode(0), ForWriting, True)
for i = LBound(arrCode) + 1 to UBound(arrCode)
.WriteLine arrCode(i)
next
.Close
End With
' シェルオブジェクト作成
Set objWsh = WScript.CreateObject("WScript.Shell")
' WrappedSample2.vbs を実行
ret = objWsh.Run("WrappedSample2.vbs", , True)
' シェルオブジェクトの破棄
Set objWsh = Nothing
' 戻り値を返す
Wrapper_Sample2 = ret
' ファイルシステムオブジェクトの作成
Set objFso = CreateObject("Scripting.FileSystemObject")
' 作成した VBScript ファイルの削除
Call objFso.DeleteFile(arrCode(0), True)
' ファイルシステムオブジェクトの破棄
Set objFso = Nothing
End Function
コメント
VBScript を関数化する事が出来ましたが、引数を必要とする VBScript には対応出来ません。
完全に関数化出来るようにしたいです。
あと Array 関数の引数が何個設定出来るのか情報が無くて、実行時エラーが発生しないかなぁって考えたりしてます。
以上
VBScript から VBScript を作成する
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
リンクの記事で VBScript から VBScript を実行する事に成功しました。
VBScript から VBScript を同期実行して戻り値を取得する - 解析エンジニアの自動化 blog
VBScript から別のVBScript が実行出来ると VBScript をたくさん作って、後から同期をとったり、機能の追加が簡単に行えたり、かなりプログラミングの幅が広がる基本スキルですが、 Script ファイルが増えてしまい、管理がめんどくさくなることがあります。
なので、 VBScript から別の VBScript を作成する VBScript を作成します。
これで、 VBScript が1つで良くなります。
関数
ソースコード
ForReading = 1 ' OpenTextFile 引数用変数
ForWriting = 2 ' OpenTextFile 引数用変数
ForAppending = 8 ' OpenTextFile 引数用変数
' プログラム作成用配列① 配列の先頭は VBScript ファイル名
PGM1 = Array( _
"Sample2.vbs", _
"msg = ""これは Sample2.vbs です。""", _
"MsgBox msg", _
"WScript.Quit(101) ' 戻り値" _
)
' プログラム作成用配列② 配列の先頭は VBScript ファイル名
PGM2 = Array( _
"Sample3.vbs", _
"msg = ""これは Sample3.vbs です。""", _
"MsgBox msg", _
"WScript.Quit(102) ' 戻り値" _
)
Call VBSMaker(PGM1)
Call VBSMaker(PGM2)
Set objWsh = WScript.CreateObject("WScript.Shell")
' Sample2.vbs を実行
ret2 = objWsh.Run("Sample2.vbs", , True)
' Sample3.vbs を実行
ret3 = objWsh.Run("Sample3.vbs", , True)
msg = "これは Sample1.vbs です。"
msg = msg & vbcrlf & _
"ret2 = " & ret2 & vbcrlf & _
"ret3 = " & ret3
MsgBox msg
Set objWsh = Nothing
Sub VBSMaker(arrPGM())
With CreateObject("Scripting.FileSystemObject").OpenTextFile(arrPGM(0), ForWriting, True)
for i = LBound(arrPGM) + 1 to UBound(arrPGM)
.WriteLine arrPGM(i)
next
.Close
End With
End Sub
使い方
上のソースコードの VBScript ファイル(Sample1.vbs)をダブルクリックすると、『Sample2.vbs』、『Sample3.vbs』という VBScript ファイルを作成します。そして、『Sample2.vbs』、『Sample3.vbs』を実行して、戻り値を取得します。
さらに、リンクの記事の図4 〜図6 と同じメッセージを表示します。
VBScript から VBScript を同期実行して戻り値を取得する - 解析エンジニアの自動化 blog
以上