解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

ocr ( Python + Tesseract ) で惨敗した



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


リンクの記事で Pythonocr をしたのですが、全然正しく文字を認識しませんでした。

初心者が Python で初めての ocr - 解析エンジニアの自動化 blog

画像を変えて、また、 Pythonocr してみます。



プログラム

ソースコード


# -*- 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 する画像

図1 のエクセルで作った画像を ocr しました。
フォントは『 MS Pゴシック 』で、サイズは 11 ポイントです。


図1 ocr する画像



ocr の結果

図2 は ocr の結果をキャプチャした画像です。
図3 は 図2 を比較表にまとめた画像です。

なんか数字をたくさん抽出しています。しかし、ところどころアルファベットが混じっています。

前回よりは進歩している気がします。


図2 ocr の結果


図3 ocr の結果まとめ表



コメント

初めての ocr よりはマシになった気がしますが、全く使えません…

こんな調子で 11 枚もの画像を作りました。
ここで、 10 × 10 の表の数字を読み取るのを早々に諦めて、簡単に読み取れそうな画像から試していく事にしました。



以上

初心者が Python で初めての ocr



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


リンクの記事で Tesseract と pytesseract をインストールしました。

初心者が Python で ocr するために Tesseract をインストールする - 解析エンジニアの自動化 blog

初心者が Python で ocr するために pytesseract をインストールする - 解析エンジニアの自動化 blog

ここまできたら、後はもう少しです。 Pythonocr してみます。



プログラム

ソースコード


# -*- 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 する画像

図1 のエクセルで作った画像を ocr しました。
フォントは『 MS Pゴシック 』で、サイズは 11 ポイントです。


図1 ocr する画像



ocr の結果

図2 は ocr の結果をキャプチャした画像です。
図3 は 図2 を比較表にまとめた画像です。

全然読めてません。全くの役立たずでした。


図2 ocr の結果


図3 ocr の結果まとめ表



コメント

まさかの精度でした…
この結果から、どんな画像なら読み込めるのかどんどん試しました。

続く…



以上

初心者が Python で ocr するために pytesseract をインストールする



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


Pythonocr してみようと思いたって、リンクの記事で Tesseract をインストールしました。
Python で ocr するために Tesseract をインストールする - 解析エンジニアの自動化 blog

次に pytesseract を Windows 7 にインストールします。



インストール環境

Windows 7 64 bit



インストール


コマンドプロンプトの起動

『 WinPython Command Prompt.exe 』を起動します。

図1 は exe ファイルの画像です。

図1 exe ファイル


起動画面

図1 の exe ファイルを起動すると図2 の画面が表示される。

図2 起動画面


インストールコマンド入力

『 pip install pytesseract 』と入力して、 Enter を入力します。
図3 が入力した時の WinPython Command Prompt です。

図3 インストールコマンド入力



コメント

これで準備が整いました。

あとは Python で コーディングしてプログラムを動かすだけです。

しかし、『 pip 』コマンドって楽ですね。



以上

初心者が Python で ocr するために Tesseract をインストールする



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


テキスト抽出が出来ないスキャンされた PDF や 画像からテキスト抽出したい事が結構な頻度であります。

プログラムで自動化する時も一連の作業の流れの中で、どうしてもテキストを読み取る作業は人間が行うために、処理を中断させたり、前もって入力しておく事が必要になったりします。

結果的に何回も同じ情報を探していたりするので、出来る事ならプログラムに書類を読ませようと思い、 Pythonocr してみようと思います。

そこで、まず Tesseract を Windows 7 にインストールします。



インストール環境

Windows 7 64 bit



ダウンロード


インターネット検索

『 tesseract-ocr-setup-3.02.02.exe 』で検索します。

図1 は 2018/11/08 現在の検索結果の画像です。

図1 検索結果


ダウンロード

1 番上の Web ページにアクセスして、数秒待っていると、ダウンロード開始のポップアップが表示されます。

図2 ダウンロード開始のポップアップ


Tesseract 入手

しばらくするとダウンロードが終わります。
図3 がダウンロードした Tesseract のアイコンです。

図3 Tesseract インストーラ


インストール

あとはインストーラーにしたがってインストールします。
全て YES でインストールすると図4 の様なフォルダが出来上がります。

図4 Tesseract インストールフォルダ



コメント

とりあえず 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;
}



コメント

VBScriptC# の関数化する事が出来ましたが、引数を必要とする 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



コメント

VBScript ファイルにいちいち VBScript を作成するコードを書き込むのが手間なので、そこもプログラム化したいと思います。



以上