忍者ブログ

テキストファイルから指定した文字列を含む行を抽出するVBScript

2021年04月24日

ログファイルからハードウェア故障の有無を調べることがある。

何度も何度もキーワードを変えて検索を繰り返すのはくそだりぃので
該当の文字列を含む行だけ抽出するVBScriptを作ってみた。



簡単にできるだろと高を括っていたけど、意外にも苦戦。
なんとか想定した2時間で完成。

ん・・・。
ログファイルってUTF8の可能性もあるよな。。。

で、作り直し。


VBScriptでUTF8のファイル読み込みで検索したら、神がかったサイトを発見。
https://neos21.net/blog/2016/03/25-01.html

UTF-8 テキストを読み込み、同じ内容をUTF-8テキストで書き込むサンプル。

読み込みと書き込みの間に文字列を比較する処理を追加して完成。

趣味プログラミングでは、流用しやすいソースを見つけられるかで全然工数が違う。
自分でVBAで同じようなことやったのに、ググった方が早いだなんて。。。



◆使用方法◆
ソースをメモ帳にコピーし、「.vbs」形式で保存。
ログファイルを保存したファイルのアイコンにドラッグドロップする。
(複数ファイルにも対応)
ログファイルの文字コードに合わせて設定を変えなきゃいけないのはめんどいな。


以下、ソース。
PR
つづきはこちら "テキストファイルから指定した文字列を含む行を抽出するVBScript"

ドラッグドロップで更新日時をファイル名に付与するVBScript

2021年03月25日
フォルダ別に作成されたログファイルが全部同じ名前で保存されている。。。

全件をローカルにコピペした場合は、(数字)で持ってこれるけど、
負荷軽減のために複数回に分けようとすると、windowsのバージョンが古いせいか
上書きしますかYES/NOしかない。

ファイル名に更新日時を付与したい衝動にかられる。

バッチファイルで使えそうなやつをみつけたけど、
更新日時の秒が入ってないのでそのままじゃ使えず。

軽くいじってみるも、うまくいかず断念。

自動的にファイル名に更新日付を付けるバッチファイルを作ったら便利すぎた
Engineer's Notebook
https://eng-notebook.com/post-3246/



VBScriptで自作を決意。
でもそのまえにググってみたら、もろHIT!

本部長は管理ができない
http://gren-dken.hatenablog.com/entry/2013/08/22/000119


冒頭部分のエラー処理については、こちらのサイトから

解析エンジニアの自動化 blog
http://chuckischarles.hatenablog.com/entry/2018/10/29/002921




利便性を考えて、更新日時の文字数は冒頭の定数で変更可能にした。

リネーム後のファイル名が既に使われている場合、
自動的に(№)を付与する仕様に変更。
ファイルの頭につけるかお尻につけるか
定数を定義して、IF文で分岐するように修正。

以下、ソース
つづきはこちら "ドラッグドロップで更新日時をファイル名に付与するVBScript"

ファイル名として使えない文字列を除去

2020年04月30日
完全に個人的メモです。

前回作った、コピーした文字列をテキストファイルとして保存するVBscript。

メールの件名から本文までをコピーして、
ファイル名指定で、コピーしたテキストを貼り付けると
件名だけがファイル名になるのだけど、
よく使われる":"は、禁則文字になっててエラーになる。

なので、自動的に除去する関数を作ってみた。

以下、ソース。
つづきはこちら "ファイル名として使えない文字列を除去"

クリップボードの内容をテキストファイルに保存するVBScript②

2020年04月27日

前回、クリップボードの文字列を取得して、
日時+ファイル名指定でメモ帳に保存するVBscriptを作った。

動作確認したところ、環境依存文字が含まれるとうまくいかない。
WEBページの文字列って環境依存系多いのよね。

ブラウザ履歴を取得するマクロを作ったときも苦労したな。。。

で、調べたらいいページ発見。
https://blog.systemjp.net/entry/2013/04/10/191821

CreateTextFileの指定を変えるとUnicodeになるようだ。
修正前:fso.CreateTextFile(fName, true)
修正後:fso.CreateTextFile(fName, true,true)

CreateTextFileメソッドについては、ここがわかりやすい。
https://vbabeginner.net/filesystemobject%E3%81%AEcreatetextfile%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89/

ただし、VBscript自体の文字コードもUnicodeで保存する必要あり!


その他、InputBoxを表示中にコピー操作もあるので、処理順を変更。
以下、ソース。

'ファイル名を生成
dim iText
iText = inputbox("ファイル名を指定")
dim ClipText 
ClipText=GetClipboardText()
dim date,fName
date=Replace(now, "/", "") 
date=Replace( date , ":" , "" )
date=Replace( date , " " , "_" )
date=left(date , 13)
if iText ="" then
fName ="ClipText_" & date & ".txt"
else
fName ="ClipText_" & date & "(" & iText & ").txt"
end if
'テキストファイルを作って書き込み https://win.just4fun.biz/
dim fso,tso
Set fso = CreateObject("Scripting.FileSystemObject")
Set tso = fso.CreateTextFile(fName, true,true) ' unicode
tso.Write(ClipText)
tso.Close
'クリップボードを取得 'http://osanai.org/47/
Function GetClipboardText()
    Dim objHTML
    Set objHTML = CreateObject("htmlfile")
    GetClipboardText = Trim(objHTML.ParentWindow.ClipboardData.GetData("text"))
End Function

日付のフォルダを作るVBscript

2020年04月27日
なんかの作業をする場合、日付のフォルダを作ることが多い。

日付だけの場合もあれば、アンダーバーで区切って内容を入れることも。


前回、日付のファイルを作ったので、同様にやってみた。


まずは、日付のフォルダを作るところをググる。
https://dev.w.ezic.info/1926.html

こんなもんか。

例によって、InputBoxを使って文字を取得して、
その内容によって分岐。

テキストファイルは上書きでOKだけど、
フォルダはそうもいかないので存在チェック。
https://multiplechoice.hatenablog.com/entry/2017/12/10/195302

ファイルとフォルダ違うけど、fileをFolderに修正して動いた。


処理の流れは、こんな感じ。

まず、文字を入力。

なしなら日付のフォルダ、あれば日付_入力した文字のフォルダ。
個人的な都合で、「)」で始まる文字を入れた場合は、
日付を()で挟むフォルダ。

以下、ソース。

'文字列を取得
dim iText
iText = inputbox("作成するフォルダの内容は?")
'フォルダ名
dim date,DirName
date=Replace(now, "/", "") 
date=left(date , 8)
if iText ="" then
DirName =date
elseif left(iText,1)=")" then
DirName = "(" & date & ")_" & mid(iText ,2,len(iText)-1)
else
DirName = date & "_" & iText 
end if
 
' ファイルストリーム・オブジェクト生成
Set objFS = CreateObject("Scripting.FileSystemObject")
 
If objFS.FolderExists(DirName) Then
msgbox "すでにフォルダが存在します"
else
' フォルダを生成する
str_path = objFS.CreateFolder(DirName)
end if