ラベル VBScript の投稿を表示しています。 すべての投稿を表示
ラベル VBScript の投稿を表示しています。 すべての投稿を表示

2010/01/03

アレ対応版・・・


前の版で困難だった、ネットワークドライブ/フォルダ上のファイルアクセスも容易にする為、
対象ファイル読み込み処理だけ、ADODB.Streamから FileSystemObject.OpenTextFileに差し替えました。

以前のログにも記述した通り、ADODB.Streamでは、どう処理の順序を変えても、
ネットワーク先からローカルドライブへ、無条件にテンポラリってしまい、
大量のファイルを連続処理するのはおろか、1つのファイルだけでも多大な時間を要していたのです。

で、今朝・・・ つーか深夜だけどw 夜通しでFSO版を試作してみて、その問題の解消に至りました。
やっぱり餅は餅屋、ファイルアクセスなら、DB向けオブジェクト使うより、FSOってコトですかね・・・(^_^;)
って、書き込みとかはADOのままですケドww以下はアーカイブです。

X3FSIR.zip βReleaseArchive - 20100103 0739 launch -
▲ を、右クリックしてファイルとして保存してください。


とは云え まだまだ、

     アクマで暫定版デスから。結局こんなん出ました~w

'***** ↓↓↓ScriptTitle↓↓↓ *********************************************************
' X3FSIR.vbs - X3F ShootingInformationsReader
' FoveonX3 RAWファイルから、撮影情報を文字列として取得する。

' - Created by LazwardFox -

'

' Update -------- ----
' Release
' Update
' βRelease
' Update 20100103 0706 Source読み込み部のみ、ADODB.Streamから
' FileSystemObject.OpenTextFileに差し替えるコトで、
' ファイルへのアクセスを最小限化、LANファイルアクセス対応へ。
' Update 20091231 1814 0byteファイルに因るエラーへ対策。
' Update 20091231 0425 処理集約の誤りを修正。
' Update 20091230 0315 複数ファイル指定に暫定対応。
' Update 20091230 0130 撮影日時文字列化処理追加/テキストデータの範囲可変に対応。
' αRelease 20091226 2150 単一ファイル取得版、データも内容のまま列挙。
' 日本語/最適化準備中。
' DevStart 20091226 2040

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Option Explicit
Public My, Parameters, Fs, objADO ', MySh, objSMTP, objMx
Set My = WScript
With My
Set Parameters = .Arguments ' パラメーター取得
If Parameters.Count <= 0 Then ' パラメータなし起動の無効化
.Quit
End If

Set Fs = .CreateObject("Scripting.FileSystemObject")
Set objADO = .CreateObject("ADODB.Stream")
'Set MySh = .CreateObject("WScript.Shell")
'Set objSMTP = .CreateObject("CDO.Message") ' SMTP Object
'Set objMx = .CreateObject("MSXML2.XMLHTTP") ' URL Check
End With

'***** ↓↓↓ Decralations ↓↓↓ *************************************************
'Public ThisScriptFull, ThisScript, Start
Const vbWq = """"

' Const - Letters
Dim vbWCrLf, vbTc, vbNullB
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf
vbNullB = chr(&h00)

' Const - Date/Times


'***** ↓↓↓ LocalDecralations ↓↓↓ *************************************************
Dim X3FSet

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
'On Error Resume Next

'X3FSet = Array("X3F",, 264, 1500, "VERSION_BF", "BURST", "TIME", "1970/1/1")
X3FSet = Array("X3F",, 0, 1800, "VERSION_BF", "BURST", "TIME", "1970/1/1")
BPS Parameters, X3FSet


' ----- ExitProcess
Set Fs = Nothing
Set objADO = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
' X3FSIs
'------------------------------------
' Binary Pickup to Strings
' バイナリファイル中 範囲を指定し、任意の文字列群を抽出する。

' - Created by LazwardFox -

' Fs、objADO、cnvDateTime

' Update
' Release
' βRelease
' Update 20091231 1814 0byteファイルに因るエラーへ対策。
' Update 20091231 0425 処理集約の誤りを修正。
' Update 20091230 0315 複数ファイル指定に暫定対応。
' αRelease 20091230 0300
' DevStart 20091230 0200 X3FSIsを汎用用途向けに修正。

' BPS (
' arFileNames - 対象ファイル群配列。
' ,arSet - 動作パラメータを、下記スキーマ準拠の配列で指定。
' )


' ▼▼ arSet Schema ▼▼▼▼▼

' = Array(strEx, SaveFileName, StartBit, ReadByte, Firstkey, Lastkey, strTimeKey, BaseDate)

' arSet
' (0) {strEx} 対象拡張子 (String)
' (1) {SaveFileName} 保存ファイル名 (String)
' (2) StartBit 読み取り先頭位置(Bit) (Number)
' (3) ReadByte 読み込み範囲(byte) (Number)
' (4) Firstkey 先頭キー名 (String)
' (5) Lastkey 最終キー名 (String)
' (6) {strTimeKey} 時間キー名 (String)
' (7) {BaseDate} 時間変換基日付文字列("y/m/d") (String)


Function BPS(arFileNames, arSet)
Dim kNothing, iADO, strTarget, Pc, fKey, rSource, rHeader, lHeader
Dim pResult, arResult, rUnits, sResult
kNothing = String(5, vbNullB) ' キーも値も存在しない範囲の、データ排除向け
Set iADO = objADO
For Each strTarget In arFileNames
If Fs.GetExtensionName(strTarget) = arSet(0) Then
arSet(1) = Replace(strTarget,"." & arSet(0),".txt") ' < 暫定
Set rSource = Fs.OpenTextFile(strTarget,1) ' 対象ファイルを読み取りモードで開く
With rSource
' ファイルから指定範囲をメモリへ取得
If arSet(2) > 0 Then
.Skip(arSet(2)) ' 先頭位置をセット
End If
rHeader = .Read(arSet(3)) ' 指定範囲を取得
End With
Set rSource = Nothing
With iADO
If LenB(rHeader) > 0 Then
' Convert to PlainText
rHeader = CStr(rHeader) ' 次処理に備え、文字列データ化
rHeader = Replace(rHeader, "SECc", "") ' 無効キー排除
rHeader = Replace(rHeader, kNothing, "") ' 無効範囲の消去
.Type = 2 ' AccessMode - Text
.Charset = "_autodetect" '"Shift_JIS" "Unicode" "utf-8"
.Open
.Position = 0
.WriteText = rHeader
lHeader = .Position ' 取得データ長
rHeader = ""
For Pc = 1 To lHeader Step 2
.Position = Pc
pResult = pResult & .ReadText(1)
Next
.Close
arResult = Split(pResult, vbNullB) ' 配列化。
pResult = ""
For Each sResult In arResult
If sResult = arSet(4) Or fKey > 0 Then ' スタートキー
If fKey = 4 Then ' 日付データ変換
sResult = cnvDateTime(arSet(7), sResult)
End If
rUnits = rUnits & sResult ' 値書き込み
' ▼ 末尾符号/キー検出処理 ▼▼▼▼▼
If fKey < 2 Then
If sResult = arSet(5) Then ' 終了キー
fKey = 5
ElseIf sResult = arSet(6) Then ' 時刻値変換対象
fKey = 4
Else
fKey = 3
End If
rUnits = rUnits & "," ' キー末尾処理
Else
rUnits = rUnits & vbCrLf ' データ末尾処理
If fKey = 5 Then ' 処理終了
Exit For
End If
fKey = 1
End If
' ▲ 末尾符号/キー検出処理 ▲▲▲▲▲
End If
sResult = ""
Next
arResult = ""
fKey = 0
' 指定ファイルへ書き込み
.Type = 2 ' AccessMode - Text
.Charset = "_autodetect"
.Open
.Position = 0
.WriteText rUnits
.SaveToFile arSet(1), 2
End If
.Close
End With
rUnits = "" ' < 暫定
End If
Next
Set iADO = Nothing
End Function

'------------------------------------
' cnvDateTime
' 秒整数で構成された日時データを、Windowsシリアル値に変換。
' 基準日の異なる値の変換にも対応。

' - Created by LazwardFox -

'

' Update
' Release
' βRelease 20091230 0300
' αRelease 20091229 1635
' DevStart 20091229 1500

' cnvDateTime (
' strBaseDate - "y/m/d"形式の日付文字列、基準日を指定。
' ,SourceDateTime - Secベースの経過時間を表す整数
' )

Function cnvDateTime(strBaseDate, SourceDateTime)
Dim sDate
sDate = DateValue(strBaseDate)
cnvDateTime = (((SourceDateTime / 60) / 60) / 24) + sDate
End Function




< ファイルの一部へのみアクセスするなら、FileSystemObject(FSO) >

2009/12/31

ダメだな・・・


ADODBStream使っても、LAN経由(ネットワークドライブ)のファイルへ読み込み掛けると、
その対象ファイル全容量を、一旦ローカルにキャッシュしてるワ。

ファイルが小さいとか、GigabitEtherとか使ってる分には無問題なんだろうケドねぇ・・・(´ヘ`;)

色々試したが、やっぱり この方法では、部分的に読み込むのはムリな模様(-_-;)
もしかしてADODBStreamよりも、FileSystemObjectの類似処理のほうが向いているのか?

2009/12/30

またかいっ・・・


先の おでかけ撮影のトキにもヤられた、SD14の撮影データ破損。
今朝の就寝前定点撮影データも完全ロスト・・・ もう勘弁して(-_-;)

CFメーカー/商品問わず こんな症状出るようなら、新たにCFを買い足すとしても躊躇する罠・・・(´ヘ`;)

取り敢えずChkDskで回復させたが、確保できた.chkファイルの拡張子をX3F変え、
そのままSIGMA PhotoProで現像を試みたトコロで、余程 運が良くない限り、現像は出来ない。
しかし、面白いコトがついさっき判った。
前ログ公開のスクリプトで、正常なファイルと同様に撮影情報が取得できたのだワw

確かに、元々から、完全に全ての情報を取得できないスクリプトだったワケだが、
Header破損しているファイルからも、正常なファイルからのモノと変わらないデータを抜き出せたコトに驚いている。

・・・でも、現像は出来ないんだよなぁ(;_;)
RAW内のメインデータの範囲を取得する手段があれば復元できそうだが、
その情報を格納しているハズのFooterも死んでるコトが多いし、
当然ファイル内で一番規模の大きいメインデータの破損も考えられるワケだから、
結局安直には解決できん・・・(´ヘ`;)


ま、撮影のログだけでも簡単に確保できたので、ヨシとするしかナイ罠・・・

なんだか・・・


・・・またまた遅延。 真に おきつねさまくおりてぃww


って アレ、まだ完成はしていない。


・・・先のを うpしたアトに気付いたコトなのだが、今回、スクリプトの対象としているトコロのX3Fファイルってのは、
どうやらカメラ側の設定次第で、付随するデータの開始位置も変ってしまうようで、
文字列として抽出する範囲固定で処理しているようなブツでは、うまく対応できないと云う罠(-_-;)

また、撮影日時の値も、秒で構成された小数点以下の値を使わない整数で表されている上、
基準日時が通常端末とは異なる1970/01/01と云う仕様。
・・・Longで表されるシリアル値で、且つ 1900/01/01を基準として動作するVBScriptの日付関数では、
単純に そのまま代入して使うと云うワケには逝かなかった。

今回は、それらの点への対応と、オブジェクトの再利用など、処理の流れを大幅に見直し効率化を図り、且つ
暫定ではあるが、複数ファイルドロップも可能にした。


・・・ただ、カメラの設定項目で、SIGMA PhotoProでも抽出でき、撮影データと深く関わりのある、
露出補正/コントラスト/彩度/シャープネス は、あれらテキストとは、独立したBitで記録されているらしく、
今回の版でも取り出せてない。

そのヘン、X3Fファイルのデータ形式について物色したら、意外に単純でない項目があって、
仕様の通りの処理していては、ファイルの全領域を読み込む必要性に迫られてしまう・・・
コレは、ネットワークドライブを多用している おきつねさま的には、非常~にヨロしくない(´ヘ`;)
なので、実機サンプル撮影後のデータを比較解析し、詳細が判明し次第、スクリプトに反映させるコトとした。


ま、今回のでも、前の版よりは、全然マシではあるモノの、以下は やっぱり、
まだまだ アクマでサンプルですから・・・m(_ _)mスクリプトは、散々コソコソ差し替えつつも、何気にメドイさんだったんで
アーカイブせずに放置していたのだが、取り敢えず、うpしますたm(_ _)m


X3FSIR_a.zip αReleaseArchive - 20100103 0723 Update -
▲ を、右クリックしてファイルとして保存してください。晒し者w

'***** ↓↓↓ScriptTitle↓↓↓ *********************************************************
' X3FSIR_a.vbs - X3F ShootingInformationsReader
' FoveonX3 RAWファイルから、撮影情報を文字列として取得する。

' - Created by LazwardFox -

'

' Update -------- ----
' Release
' Update
' βRelease
' Update 20100103 0603 変数整理。
' Update 20091231 1814 0byteファイルに因るエラーへ対策。
' Update 20091231 0425 処理集約の誤りを修正。
' Update 20091230 0315 複数ファイル指定に暫定対応。
' Update 20091230 0130 撮影日時文字列化処理追加/テキストデータの範囲可変に対応。
' αRelease 20091226 2150 単一ファイル取得版、データも内容のまま列挙。
' 日本語/最適化準備中。
' DevStart 20091226 2040

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Option Explicit
Public My, Parameters, Fs, objADO ', MySh, objSMTP, objMx
Set My = WScript
With My
Set Parameters = .Arguments ' パラメーター取得
If Parameters.Count <= 0 Then ' パラメータなし起動の無効化
.Quit
End If

Set Fs = .CreateObject("Scripting.FileSystemObject")
Set objADO = .CreateObject("ADODB.Stream")
'Set MySh = .CreateObject("WScript.Shell")
'Set objSMTP = .CreateObject("CDO.Message") ' SMTP Object
'Set objMx = .CreateObject("MSXML2.XMLHTTP") ' URL Check
End With

'***** ↓↓↓ Decralations ↓↓↓ *************************************************
'Public ThisScriptFull, ThisScript, Start
Const vbWq = """"

' Const - Letters
Dim vbWCrLf, vbTc, vbNullB
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf
vbNullB = chr(&h00)

' Const - Date/Times


'***** ↓↓↓ LocalDecralations ↓↓↓ *************************************************
Dim X3FSet

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
'On Error Resume Next

'X3FSet = Array("X3F",, 264, 1500, "VERSION_BF", "BURST", "TIME", "1970/1/1")
X3FSet = Array("X3F",, 0, 1764, "VERSION_BF", "BURST", "TIME", "1970/1/1")
BPS Parameters, X3FSet


' ----- ExitProcess
Set Fs = Nothing
Set objADO = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
' X3FSIs
'------------------------------------
' Binary Pickup to Strings
' バイナリファイル中 範囲を指定し、任意の文字列群を抽出する。

' - Created by LazwardFox -

' Fs、objADO、cnvDateTime

' Update
' Release
' βRelease
' Update 20091231 1814 0byteファイルに因るエラーへ対策。
' Update 20091231 0425 処理集約の誤りを修正。
' Update 20091230 0315 複数ファイル指定に暫定対応。
' αRelease 20091230 0300
' DevStart 20091230 0200 X3FSIsを汎用用途向けに修正。

' BPS (
' arFileNames - 対象ファイル群配列。
' ,arSet - 動作パラメータを、下記スキーマ準拠の配列で指定。
' )


' ▼▼ arSet Schema ▼▼▼▼▼

' = Array(strEx, SaveFileName, StartBit, ReadByte, Firstkey, Lastkey, strTimeKey, BaseDate)

' arSet
' (0) {strEx} 対象拡張子 (String)
' (1) {SaveFileName} 保存ファイル名 (String)
' (2) StartBit 読み取り先頭位置(Bit) (Number)
' (3) ReadByte 読み込み範囲(byte) (Number)
' (4) Firstkey 先頭キー名 (String)
' (5) Lastkey 最終キー名 (String)
' (6) {strTimeKey} 時間キー名 (String)
' (7) {BaseDate} 時間変換基日付文字列("y/m/d") (String)


Function BPS(arFileNames, arSet)
Dim kNothing, iADO, strTarget, Pc, fKey, rSource
Dim lHeader, pResult, arResult, rUnits, sResult
kNothing = String(5, vbNullB) ' キーも値も存在しない範囲の、データ排除向け
Set iADO = objADO
For Each strTarget In arFileNames
If Fs.GetExtensionName(strtarget) = arSet(0) Then
arSet(1) = Replace(strtarget,"." & arSet(0),".txt") ' < 暫定
With iADO
' ファイルから指定範囲をメモリへ取得
.Type = 1 ' AccessMode - Binary
.Open
.LoadFromFile strTarget ' 対象ファイル
.Position = arSet(2) ' 先頭位置をセット
rSource = .Read(arSet(3)) ' 指定範囲を取得
If .Position > 0 Then ' 20091231 1814
.Close
' Convert to PlainText
rSource = CStr(rSource) ' 次処理に備え、文字列データ化
rSource = Replace(rSource, kNothing, "") ' 無効範囲の消去
.Type = 2 ' AccessMode - Text
.Charset = "_autodetect" ' "Shift_JIS" "utf-8" "Unicode"
.Open
.Position = 0
.WriteText = rSource
lHeader = .Position ' 取得データ長
rSource = ""
For Pc = 0 To lHeader
.Position = Pc
pResult = pResult & .ReadText(1)
Next
.Close
arResult = Split(pResult, vbNullB) ' 配列化。
pResult = ""
For Each sResult In arResult
If sResult = arSet(4) Or fKey > 0 Then ' スタートキー
If fKey = 4 Then ' 日付データ変換
sResult = cnvDateTime(arSet(7), sResult)
End If
rUnits = rUnits & sResult ' 値書き込み
If fKey < 2 Then ' ▼ 末尾符号/キー検出処理 ▼▼▼▼▼
If sResult = arSet(5) Then ' 終了キー
fKey = 5
ElseIf sResult = arSet(6) Then ' 時刻値変換対象
fKey = 4
Else
fKey = 3
End If
rUnits = rUnits & "," ' キー末尾処理
Else
rUnits = rUnits & vbCrLf ' データ末尾処理
If fKey = 5 Then ' 処理終了
Exit For
End If
fKey = 1
End If ' ▲ 末尾符号/キー検出処理 ▲▲▲▲▲
End If
sResult = ""
Next
arResult = ""
fKey = 0
' 指定ファイルへ書き込み
.Type = 2 ' AccessMode - Text
.Charset = "_autodetect"
.Open
.Position = 0
.WriteText rUnits
.SaveToFile arSet(1), 2
End If
.Close
End With
rUnits = "" ' < 暫定
End If
Next
Set iADO = Nothing
End Function

'------------------------------------
' cnvDateTime
' 秒整数で構成された日時データを、Windowsシリアル値に変換。
' 基準日の異なる値の変換にも対応。

' - Created by LazwardFox -

'

' Update
' Release
' βRelease 20091230 0300
' αRelease 20091229 1635
' DevStart 20091229 1500

' cnvDateTime (
' strBaseDate - "y/m/d"形式の日付文字列、基準日を指定。
' ,SourceDateTime - Secベースの経過時間を表す整数
' )

Function cnvDateTime(strBaseDate, SourceDateTime)
Dim sDate
sDate = DateValue(strBaseDate)
cnvDateTime = (((SourceDateTime / 60) / 60) / 24) + sDate
End Function

2009/12/26

いい加減シビレを切らせて・・・


・・・構築中なのデス! SIGMA RAW(FoveonX3Fファイル)の撮影情報連続取得スクリプト。
最新版は次のログで公開/更新中・・・ コチラのログは、スクリプト比較向けに放置w

因みに あの、X3Fって拡張子のファイル、厳密に云うと、JPEGで云うトコロのEXIFってのには準拠出来ていない。
なので、Windowsのエクスプローラで使うには結構不便を強いられる。

しかも、本家提供の現像アプリSIGMA PhotoPro3.xですら、
ファームウェア更新などで拡張されたプロパティ等を、完全に読み出せないと云う罠・・・
撮影したら即、必要な情報メモっておくか、カメラ(CF)にデータがあるウチ(端末へ転送してしまう前)に、
情報控えておかないと、管理できない・・・

そんなデジタルデータなんて、使い悪くて仕方ないんだが・・・(-_-;)


で、バイナリエディタでX3Fファイル覗いたら、なんか知らん、ファイルの先頭に全てあるではナイでsky♪
だったら、文字列解析で利用した、ADODBStreamで特定範囲を読み出すだけのほうが、
SPP使うよりアクセス時間短縮できる・・・  ってのは、随分前から考えていたのだが、
ソコはソレおきつねさまくおりてぃ、ダレかが作るだろうと永らく放置していたのだ!

・・・って、チョイと文字列の扱いが面倒だったので手を付けなかっただけなのだが、
此度は諦め、1日使って最適な呼び出し方など模索し、解決に至った。

以下スクリプトで単体動作可能だが、1ファイルずつドロップする体なので、使い勝手は良くない。
このレベルだと、SPPでやってるよりは マシンに負荷が掛からないってぇトコだけが利点な程度。
おきつねさますくりぷととしては、とてもクオリティを満たしているとは云い難い。
ツマり・・・


     アクマでテストな版デスから。


ってコトでw


明日 このコアに、連続ファイル/フォルダ投入/日時文字列化/iniローダ/日付バックアップ/html吐き出しなど、
今までのライブラリを そのまま適用したり、下記に内包させて最適化を図るなどして、
SPPと等価の文字列を連続したHTMLとして取得可能なスクリプトに仕上げる。
(ココに晒す写真や そのデータを手作業で並べるのが面倒になっただけw)


取り敢えずコアなどww

'***** ↓↓↓ScriptTitle↓↓↓ *********************************************************
' X3F ShootingInformationsReader
' - Created by LazwardFox -

'

' Update -------- ----
' Release
' Update
' βRelease
' αRelease 20091226 2150 単一ファイル取得版、データも内容のまま列挙。
' 日本語/最適化準備中。
' DevStart 20091226 1241

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Public My, Parameters, Fs, objADO ', MySh, objSMTP, objMx
Set My = WScript
With My
Set Parameters = .Arguments ' パラメーター取得
If Parameters.Count <= 0 Then ' パラメータなし起動の無効化
.Quit
End If

Set Fs = .CreateObject("Scripting.FileSystemObject")
Set objADO = CreateObject("ADODB.Stream")
'Set MySh = .CreateObject("WScript.Shell")
'Set objSMTP = .CreateObject("CDO.Message") ' SMTP Object
'Set objMx = .CreateObject("MSXML2.XMLHTTP") ' URL Check
End With

'***** ↓↓↓ Decralations ↓↓↓ *************************************************
'Public ThisScriptFull, ThisScript, Start
Const vbWq = """"

' Const - Letters
Dim vbWCrLf, vbTc, vbNullB
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf
vbNullB = chr(&h00)

' Const - Date/Times


'***** ↓↓↓ LocalDecralations ↓↓↓ *************************************************
'Dim rdSource, svRoot, edMove, eSource
'Dim arLog, arResult, strReport

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
'On Error Resume Next

X3FSIR Parameters(0),34

' Msgbox strResult,,"CreateTesters"

' ----- ExitProcess
Set Fs = Nothing
Set objADO = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
'------------------------------------
' X3F ShootingInformationsReader
' FoveonX3 RAWファイルから、撮影情報を文字列として取得する。

' - Created by LazwardFox -

' Fs、objADO

' Update
' Release
' βRelease
' αRelease 20091226 2150 単一ファイル取得版、データも内容のまま列挙。
' 日本語/最適化準備中。
' DevStart 20091226 1241

' X3FSIs (
' strTarget - X3Fファイル名を指定する。他の種類は無効。
' ,KeyCount - キー数を指定。
' )

Function X3FSIR(strTarget, KeyCount)
Dim Lc, sName, iADO, sADO, Pc, kPc, rByte, cResult, arResult, rUnits
Const strEx = "X3F"
Lc = (KeyCount * 2) - 1
If Fs.GetExtensionName(strtarget) = strEx Then
sName = Replace(strtarget,"." & strEx,".txt") ' < 暫定
Set iADO = objADO
With iADO
.Type = 1 ' - Binary
.Open
.LoadFromFile strTarget ' 対象ファイル
For Pc = 1 To 1100 Step 1
.Position = 527 + Pc
rByte = rByte & CStr(.Read(1))
Next
.Close
cResult = Replace(rByte,vbNullB & vbNullB & vbNullB & vbNullB & vbNullB, "")
cResult = Replace(cResult," ", "")
arResult = Split(cResult,vbNullB)
For Pc = 0 To Lc
rUnits = rUnits & arResult(Pc)
If kPc = 0 Then
rUnits = rUnits & ","
kPc = 1
Else
rUnits = rUnits & vbCrLf
kPc = 0
End If
Next
.Type = 2 ' - Text
.Charset = "_autodetect" ' "Shift_JIS" '"utf-8" '"utf-8" ' "Unicode"
.Open
.WriteText rUnits
.Position = 0
.SaveToFile sName, 2 ' < 暫定
.Close
End With
Set iADO = Nothing
End If
End Function



・・・SD14のX3Fファイルでしかテスト出来ないので、このままで同社他機種に対応できるかは不明。
ただ、メチャクチャ単純な処理しか使っていないので、各位で好き勝手改変して使ってもらうのもアリだろう。
メドイけど(^_^;)

2009/12/06

VB弾投下っ!・・・


VBScript等で、時刻文字列とか、2つの日時から その差異や平均を取得となると、
簡単なようで、厳密にやろうとすると結構面倒な上、難しいと云うのは、
そのヘン触ったコトのある身なら、ダレでも既知のコトと思う。

で、以前公開した、日付文字列取得関数を簡単に改良した版と、日時の差異を色々な形式で取得できる関数、
変数内データ確認関数、簡単な桁揃え関数などを一纏めにし、且つ、ソレらが連携するよう組んだサンプルを、
以下にうpしてみた。

アーカイブはコチラ ・・・今回は サンプルなので、エンコード版は非同梱。


おやくそくの ひけらかしw

'***** ↓↓↓ScriptTitle↓↓↓ ****************************************************
' dtDiffs (X3FManeger)
' - Created by LazwardFox -

' 時間文字列取得関数と、時間差取得関数のテストパッケージ。
' mSecレベルを未処理な為、平均時間取得で、秒の精度が低い。

' 特徴)
' 時間差異取得関数 dtDiff で 得られる差異は最大、9999/12/31 23:59:59
' また、比較時刻に差異が無かった場合には、既存日付関数では取得不可能な、
' 0年0ヶ月0日 0時間0分0秒を、様々な形式の値として取得可能。

' 注)
' 上記特徴に起因し、時間差異取得関数 dtDiff で 得た値は、
' 概ね、そのまま日付処理関数に代入できない。

' Tips 01)
' VBScriptの時刻取得関数で得られた値には、ミリ秒が含まれる。
' が、このスクリプトに含まれる処理だけでは、
' ソレを表示結果に反映させるコトは出来ない。
' (JavaScriptにある、MilliSeconds に、該当する関数はナイ)

' Tips 02)
' テストで用いている Sleep関数は、1/1000秒レベルの精度を持たない。
' 故に、テストでのミリ秒の値は安定しない。
' つまり、.Sleep 3000 としても、ジャスト3000mSecでは動作していない。
' (JavaScriptで類似処理を用いても、ほぼ同様)

' 単純数値化
' yyyymmddhhnnss と結果を並べて、(倍精度)整数に変換したモノ。
' もし仮に、結果の差異が 11年 6ヶ月 2日 16時間 22分 4秒 であった場合、
' 110602162204 が(文字列ではなく)整数で返される。


' それら特徴や問題に起因し、平均値を得るに、
' 丁度割り切れる秒数でナイ場合の精度は期待できない。


' Update -------- ----
' Release -------- ----
' Update 20091206 0307 平均値出力暫定追加(ミリSecレベル未対応版)
' Update 20091206 0247 公開用にX3FManegerから分離し、テストスクリプト化。
' βRelease 20091011 0625
' DevStart 20091010 1549

'***** ↓↓↓ ObjectDecralations ↓↓↓ *******************************************
Public My, Fs ', Parameters, MySh,
Set My = WScript
With My
'Set Parameters = .Arguments ' パラメーター取得
'If Parameters.Count <= 0 Then ' パラメータなし起動の無効化
' .Quit
'End If

'Set MySh = .CreateObject("WScript.Shell")
Set Fs = .CreateObject("Scripting.FileSystemObject")
'Set objSMTP = .CreateObject("CDO.Message") ' SMTP Object
'Set objMx = .CreateObject("MSXML2.XMLHTTP") ' URL Check
End With

'***** ↓↓↓ Decralations ↓↓↓ *************************************************

' Const - Letters
Dim vbWCrLf, vbTc
Const vbWq = """"
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf

' Const - Date/Times


'***** ↓↓↓ LocalDecralations ↓↓↓ ********************************************
Dim sStartTime, sEndTime, ElapsedTime
Dim StartTime, EndTime
Dim strReport
strReport = "時間差異と平均時間取得テスト" & " " & vbWCrLf

'***** ↓↓↓ TestParameter Decralations ↓↓↓ ***********************************
Const sPar = 3 ' テスト用平均値取得パラメータ

'***** ↓↓↓MainRoutine↓↓↓ ****************************************************
'On Error Resume Next
sStartTime = Now() ' 開始時刻シリアル値取得
My.Sleep 6000 ' テスト間隔
sEndTime = Now() ' 終了時刻シリアル値取得
dtDiff sStartTime, sEndTime, sPar, ElapsedTime ' 経過時間
iDT sStartTime,,,, 0, StartTime ' 開始時刻文字列取得
iDT sEndTime,,,, 0, EndTime ' 終了時刻文字列取得

strReport = strReport & "みなし処理回数 - " & sPar & " " & vbWCrLf

strReport = strReport & "開始-" & StartTime & " " & vbCrLf
strReport = strReport & "終了-" & EndTime & " " & vbCrLf
strReport = strReport & "経過-" & Join(ElapsedTime(0)," ") & " " & vbCrLf
strReport = strReport & "経過時間単純数値化-" & ElapsedTime(1) & " " & vbCrLf
strReport = strReport & "平均-" & Join(ElapsedTime(2)," ") & " " & vbCrLf
strReport = strReport & "平均時間単純数値化-" & ElapsedTime(3) & " "
Msgbox strReport & " ",,Fs.GetBaseName(My.ScriptName)
Set Fs = Nothing
'Set MySh = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ ******************************************************

' X3FManeger (fCopy)
'------------------------------------
' iDT - 日時文字列 ないし 日/時配列取得 for VBScript
' - Created by LazwardFox -

' VarChk

' Update 20091103 1149 パラメータチェックを完全外部化。
' Update 20091010 1736 文字列/シリアル値による日時指定、
' 及び パラメータ省略に対応。
' Update 20090228 0458 変数宣言変更
' Update 20090223 0959 時刻桁処理変更
' Update 20090223 0253 Len記述忘れ修正
' Update 20090223 0135 変数宣言忘れ修正
' Update 20090210 0218
' Update 20090210 0115
' Release 20090209 2035

' iDT (
' {tDateTime} - Serial / DateTimeStrings (省略可、既定値 - Now)
' ,{dSplitter} - DateSplitString (省略可、既定値 - "/")
' ,{dtSeparater} - Date/Time SepaleteString (省略可、既定値 - " ")
' ,{tSplitter} - TimeSplitString (省略可、既定値 - ":")
' ,{Control} - 戻り値 文字列/配列指定 0 or 1 (省略可、既定値 - 1)
' ,Result - 結果日時文字列 (省略不可)
' )

' Memo - いずれかのSplitterに ~|" を設定すると、全ての要素が、配列として返されます。
' iDT ,"|",,,,arDT ' - (0) YYYY / (1) MM / (2) DD / (3) HH / (4) NN / (5) SS

Public Function iDT(tDateTime, dSplitter, dtSeparater, tSplitter, Control, Result)
Dim vDateTime, cDateTime, nD, nS, strYMD, strHNS
Dim dVal, cVar, arVar
dVal = Array(Now(),"/"," ",":",1) ' 既定値配列
cVar = Array(Array(tDateTime,7,False,dVal(0)),Array(dSplitter,10,True,dVal(1)), _
Array(dtSeparater,10,True,dVal(2)),Array(tSplitter,10,True,dVal(3)), _
Array(Control,2,False,dVal(4)))
arVar = VarChk(cVar)
tDateTime = arVar(0)
strYMD = FormatDateTime(DateValue(tDateTime),0) 'Update 20091010 1736
nS = ":" & Split(CStr(FormatDateTime(tDateTime,3)),":")(2) 'Update 20090223 0951
strHNS = FormatDateTime(tDateTime,4) & nS 'Update 20090223 0951
If arVar(3) = dVal(3) Then
Else
strHNS = Replace(strHNS,dVal(3),arVar(3))
End If
If arVar(1) = dVal(1) Then
Else
strYMD = Cstr(Replace(strYMD,dVal(1),arVar(1)))
End If
If arVar(4) = dVal(4) Then
Result = Split(strYMD & "|" & strHNS,"|")
Else
Result = strYMD & arVar(2) & strHNS
End If
End Function

' X3FManeger (fCopy)
'------------------------------------
' VarChk
' 変数内データの確認と、既定値への置換をサポート。
' 関数への代入パラメータ確認向け
' - Created by LazwardFox -

' Update
' Release
' βRelease 20091103 1152
' DevStart 20091103 1014

' VarChk - 結果を配列で返す。
' (
' arVar - 調査対象と条件を配列で代入する。 (省略不可)
' )

' arVar = Array(Array(Value,VarTypes,Boolean,DefaultData),Array(Value,VarTypes,Boolean,DefaultData),・・・)

' Value - 確認対象となる値、ないし変数
' VarTypes - VarType定数 (日時値を得る場合は、基が文字列代入であっても 8 を指定)
' Boolean - 条件の可否
' DefaultData - 代替規定値 (データ型自由)

Function VarChk(arVar)
If VarType(arVar) >= 8192 Then
ReDim iResult(UBound(arVar))
Dim Pc, iVar, cVar ,vVar, vDT, cDT
Pc = 0
For Each iVar In arVar
cVar = VarType(iVar) >= 8192 And Ubound(iVar) = 3
If cVar Then
cVar = VarType(iVar(1)) = 2 And VarType(iVar(2)) = 11
If cVar Then
If iVar(1) = 8 Then
vDT = VarType(iVar(0))
cDT = vDT <> 10 And (vDT = 7 Or (vDT = 8 And IsDate(iVar(0))))
If cDT Then ' シリアル値/日時文字列 識別
iResult(Pc) = DateValue(iVar(0)) + TimeValue(iVar(0))
Else
iResult(Pc) = iVar(3) ' Now()
End If
Else
vVar = VarType(iVar(0))
If iVar(2) = (vVar = iVar(1)) Then
iResult(Pc) = iVar(3)
Else
iResult(Pc) = iVar(0)
End If
End If
End If
End If
Pc = Pc + 1
Next
End If
VarChk = iResult
End Function

' X3FManeger
'------------------------------------
' dtDiff
' 日時値の差異を取得。
' "各単位の差異のみを単純に取得"するDateDiffとは異なる。
' ※ iDTの仕様起因し、利用する場合、コチラを先に実行する必要がある。
' - Created by LazwardFox -

' Digit, VarChk

' Update 20091208 0119 平均値取得時のゼロ除算回避を追記。
' Update 20091206 0626 VarChk使用で、Par 省略に対応。
' Update 20091206 0356 暫定版平均値取得機能追加。
' Update 20091206 0217 差異演算基底日付値に伴う修正。
' Update 20091105 0329 単純化した時間差数値を出力可能に
' Update 20091105 0315 文字列桁揃えをサポート
' Release 20091103 1655
' βRelease 20091103 1626
' DevStart 20091103 1606

' dtDiff - 各単位別の結果を配列で返す。
' Var(0) 日付 - (0) Y / (1) M / (2) D
' Var(1) 時間 - (0) H : (1) N : (2) S
' (
' Before - Serial / DateTimeStrings (省略不可)
' ,{After} - DateSplitString (省略可、既定値 - Now())
' ,{Par} - AverageParameter (省略可、既定値 - 1)
' ,Result - 結果を日/時別の文字列を配列として返す。 (省略不可)
' Result(0)(0) - "Y/M/D" / (1) - "H:N:S"
' Result(1) - YYYYMMDDHHNNSS を並べ、単純数値化した結果が返る。
' Result(2)(0) - "Y/M/D" / (1) - "H:N:S"
' Result(3) - YYYYMMDDHHNNSS を並べ、単純数値化した結果が返る。
' 例) 時間差が 4日と2時間15分5秒 なら 4021505
' )

' Result と Join(Var(0),"/") & " " & Join(Var(1),":") は、等価。
' 数値で、単位別の値の取得が不要であれば、以下書式だけで利用可能。

' dtDiff Before, After, Result

Function dtDiff(Before, After, Par, Result)
If VarType(Before) = 7 Then
Dim cVar, arVar, lDate, Diffs, avDiffs, iResult
cVar = Array(Array(After,7,False,Now()), Array(Par,2,False,1))
arVar = VarChk(cVar)
lDate = DateSerial(0,1,1) ' 差異演算基底日付値 (0,1,1) = 2000/01/01
Diffs = arVar(0) - Before 'After - Before
If arVar(1) > 0 Then
avDiffs = Diffs / arVar(1)
End If
Diffs = lDate + Diffs
avDiffs = lDate + avDiffs
iResult = Array( _
Array(Digit(Year(Diffs) - 2000, "0000"),Digit(Month(Diffs) - 1, "00"),Digit(Day(Diffs) - 1, "00")), _
Array(Digit(Hour(Diffs), "00"), Digit(Minute(Diffs),"00"), Digit(Second(Diffs),"00")), _
Array(Digit(Year(avDiffs) - 2000, "0000"),Digit(Month(avDiffs) - 1, "00"),Digit(Day(avDiffs) - 1, "00")), _
Array(Digit(Hour(avDiffs), "00"), Digit(Minute(avDiffs),"00"), Digit(Second(avDiffs),"00")))
Result = Array(Array(Join(iResult(0),"/"),Join(iResult(1),":")),Cdbl(Join(iResult(0),"") & Join(iResult(1),"")), _
Array(Join(iResult(2),"/"),Join(iResult(3),":")),Cdbl(Join(iResult(2),"") & Join(iResult(3),"")))
dtDiff = iResult
Else
dtDiff = False
End If
End Function

' X3FManeger
'------------------------------------
' Digit
' 文字列表記の数値の桁揃えを行う。
' - Created by LazwardFox -

' Update
' Release
' βRelease 20091105 0303 チョー暫定発行 そにょ2
' DevStart 20091105 ----

Function Digit(Num, dig)
Digit = Right(Clng("1" & dig) + Num, Len(Dig))
End Function



ココまでヤる意味があるかは、利用側の用途次第かw

mSec対応版も組んでたんだけど、時間無くなったので途中のまま・・・(-_-;)
<そのまま使えるVBscript 日時文字列 時刻差異取得>

2009/12/03

未だに・・・


SIGMAのRAWデータを、適切な画像に現像でき、且つコストの生じないアプリケーションは、
実質、同社が無償発行している PhotoProシリーズのみと云う現状。

ただ このアプリ、ファイル操作に限ってはエクスプローラ程の操作性が無い。
従って、事前のRAWファイル取捨選択くらいは、エクスプローラで出来るほうが望ましいのだ。

しかし、PhotoProをインストールしても、X3F(SIGMA FoveonX3 RAW)ファイルを、
サムネイルする機能をWindowsに対して提供してはくれない。

その上、MS提供の某では、SIGMA機データに対しては、全くの無力・・・
そうなると、ArcSoft RAW Thumbnail Viewer の様なPlugIn的ブツに頼らざるを得ない。

で、更にソレを便利に使うのに、前ログのようなツールがあったら良かったんだが、
そのまま使えるようなスクリプトは公開されてなくて、で、ヤシが役に立ったと・・・

正直アレって、当時、エクスプローラのjpegのサムネイルが小さいことにキレて、組んだんだよねw
<そのまま使えるVBscript, ThumbnailSizeSettings>

2009/12/01

発掘 ! ・・・


去年春に作成し、HDDの何処かにロストしていたブツが見つかった。

先頃にも話題にした、Arcsoft の RAW Thumbnail Viewer [日本語解説]を使い、
各社カメラのRAWデータの画像チェックや選択を容易にする為に、
Windowsのエクスプローラの縮小版(サムネイル)画像のサイズ変更をレジストリ操作で行う・・・
コレ、確かに簡単な手順で出来るのだが、意外に、手動で ちまちまヤるのは結構メドイさんだったので、
過去に それっぽいスクリプトを組んでいたのだよ・・・


で、今回はソレを うpすることにした。


まずは、ソースなど ひけらかしw・・・

'***** ↓↓↓Title↓↓↓ *********************************************************

'ThumbnailSettings
'Developed by LazwardFox
'Release 20080507_0410


'◆◆◆ Information ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

'本スクリプトでは、エクスプローラでの画像のサムネール(縮小版)表示の
'サイズと表示品質を任意に設定できます。



' VBScriptでは、クォーテーション [ ' ] が、行頭にある部分は実行されません。
' 正しくは、クォーテーション以降は注釈扱いとなります。念の為…

'本スクリプトは、コマンドライン ないし ショートカット中に
'パラメータ /t を付加することで、テストモードで動作します。

'ショートカット中の記述 ▼
' "C:\Documents and Settings\[Account]\デスクトップ\Thumbnail Settings.vbs" /t




'***** ↓↓↓Decralations↓↓↓ *********************************************************

On Error Resume Next

Const vbWq = """"
Const strRootKey = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\"
Const strTgtKeys = "ThumbnailQuality,サムネイルのクオリティを数値で指定してください。,50,100,90,DWORD*ThumbnailSize,サムネイルのサイズを入力してください。,32,256,96,DWORD"

'----- ExtendConstantLiterals
Dim vbWCrlf
vbWCrlf = vbCrLf & vbCrLf
'--------------------------

Dim strCL1stPar, arTgtKeys, strTgtKey, arTgtValues, strKey
Dim numMin, numMax, numDef,valType, strErr, strMsg, strStVal, numStrVal
Dim strInVal, numVal, strVal, intDig, strWtVal, strEnd

Set WSHArguments = WScript.Arguments 'コマンドラインパラメーター取得
Set WshShell = WScript.CreateObject("WScript.Shell")
Set FS = WScript.CreateObject("Scripting.FileSystemObject") 'レジストリキー作成に使用。

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************

strCL1stPar = WSHArguments(0)
arTgtKeys = Split(strTgtKeys, "*")
For Each strTgtKey In arTgtKeys
arTgtValues = Split(strTgtKey, ",")
strKey = CStr(Fs.BuildPath(strRootKey, arTgtValues(0)))
numMin = arTgtValues(2)
numMax = arTgtValues(3)
numDef = arTgtValues(4)
valType = arTgtValues(5)
strErr = ""
strMsg = arTgtValues(1) & vbWCrlf & vbTab & "指定可能な値は、" & numMin & "~" & numMax & " で、" & vbCrLf & vbTab & "既定値は " & numDef & " です。"
strStVal = WshShell.RegRead(strKey)
numStrVal = CInt(strStVal)
Do
strInVal = InputBox(strErr & strMsg, arTgtValues(0), numStrVal)
If strInVal = "" Then
If strEnd = "" Then
strEnd = "処理を中止しました。"
End If
Exit Do
End If
numVal = Cint(strInVal)
strErr = "◆ 入力値が誤っているか、範囲を超えています。◆" & vbWCrlf
Loop Until numVal < numMin or numVal > numMax
If Not strInVal = "" Then
Pc = Pc + 1
strEnd = UCase(Pc) & "つの設定を"
If valType = "DWORD" Then
strVal = CStr(numVal) 'Cstr(Hex(numVal))
intDig = 8 - Len(strVal)
strWtVal = String(intDig, "0") & strVal
Else
strWtVal = strVal
End If
valType = "REG_" & valType
If LCase(strCL1stPar) = "/t" Then
msgbox "RegKey - " & strKey & vbCrlf & "SetValue - " & strWtVal & vbCrlf & "ValueType - " & valType
strEnd = "テストモードです。" & vbWCrlf & strEnd & "表示しました。"
Else
WshShell.RegWrite strKey, strWtVal, valType '対象となるレジストリキーへ、値を書き込む。
strEnd = strEnd & "変更しました。"
End If
End If
Next
WSHShell.Popup strEnd, 5, "Thumbnail Settings", vbInformation


結構前に組んだので、ブログ幅全く気にしてなかったり、余計な解説入ってたり、変数名の付け方違ったり と、
最近のとは かなり趣が異なっているのだが、このトコロ、とんと公開していないので、
殆どの閲覧されている諸兄には、何のコトやらサッパリなコトかとオモワレw


で、コレ▼ が、アーカイブ。 中身の実行ファイルがインストーラなので、手間はナイ。

ThumbnailSizeSettings.zip

設定が済み、端末を再起動すると、変更が適用されます。
以後は、管理ツール内にできる [ThumbnailSize Settings] を使い、何度でも設定変更可能です。


まぁ、スクリプトベースの"なんちゃってGUI"も、インストーラ仕立てで なんとなく様になってて、
この程度仕上げてあれば、なんとかまだ、使い良いほうかと・・・

・・・って、ホントは VB2k8でスライダ使った仕様のを用意していたのだが、
結局同時期に、途中のまま放置されていると云う事実もあったりww


なにせ 一度設定してしまえば要らないモノなんでねぇ、そりゃモチベーション揚がらない罠(´ヘ`;)-----
今年夏に発行されたばかりの、RAW Thumbnail Viewer2 な、サイトから消えてるw
やっぱりExif取得失敗バグの修正、容易には出来なかったか・・・

あと、RAW Thumbnail Viewer のほう、DLサイトはEnglishのみなのだワ、コレが。
それに、同画面には、"Download Trial" とあるが、無償ツールだ。
疑うなら コチラを観てもらえば判る、一覧中の このアプリには、購入ボタンはナイのだよ。
<そのまま使えるVBscript インストーラ仕様w>

2009/07/18

先週辺りから・・・


ロクに仕事もしてないのに熱中症症状憑きの夏バテ気味の おきつねさまがココに居るw
今週は、今の今までメールチェキすら してませんでした。

・・・で、昨日は なんか、

  URLが確定した ないし時間経過が そのままファイル名になっていて
  定期的に更新されるタイプの画像を自動強奪する

系のスクリプト組んでました・・・ 某サイトから定期的更新される画像を確保したかったので(^_^;)
って、処理的には "ファイル名をつけて画像を保存" を、VBSでやるだけのモノ。
とは云え、更新されていなければ、待機後取得します。
・・・つか、意外に無かったりするのだよ、この案件で、処理について簡単な解説の在るサイト(´ヘ`;)
小難しい解説多いワ、モノも そのままだと(用途的には)ムダ多いワ、容量制約受けるワで、結局自分で描きましたw
端末が許す限り動画などの大きなファイルも扱えます(動作確認済み)。 完全なURLが判るものに限りますが・・・

今回も、処理を汎用関数化するカタチで作成しています。
ちなみに強奪部は、テスト版により動作確認後、nObjGet として関数化を完了しました。
同テスト版中の、URL既存確認関数 URLExist も実装済みです。

更にオマケとして、以前公開した日時取得関数で、VBのFormat関数をVBScriptで模した簡易版 iDT の、
機能拡張版 aDTs とiDTs の2つを作成中で、以前から放置されていたブツの、完成の目途が立ちましたww
また、そのいずれにも、時間取得の利便性向上の為、インターバル出力機能を内包しています。(既に実装済み)
動作としては、現在時刻からイチバン近い、指定分おきの、経過時刻を返します。

Format関数を模す為には絶対に欠かせない、文字列の解析配列化関数 lFormat も作成完了しています。

ソレら関数と その解説を、今日明日には まとめてココで公開予定、乞う御期待。

・・・出来てるならナゼ公開しないのかって? 
上記の通り、主要2関数と、全体の仕上げが まだなのだよ(-_-;因みに、このログのログw診るに、VBS系記事がイチバンアクセス数稼げるみたいなんだよね・・・
企業の鯖管理者っポイ アクセスが伸びるのだよ・・・
多分、よくあるTipsサイトは、ドッチかというと、極判ってる系向けな解説のほうが多いので、
初心者は元より、企業で急ぎ処理探してる向きには、使い悪いんだろうね。

欲しい処理を、サイトからDLして そのまま使える、ないし、それが内包するモノを、
コピペだけで他のスクリプトへ流用できるだけ造り込んだ関数を公開しているところも少ないしね(´ヘ`;)
逆にモノがイイと Shareだったり、ロハでもエンコード済みでソース公開してなかったり・・・

つって、一般的な おべんきおとしての向きには、適当ではナイのカモしれないな、既に完結しててw
おきつねさま的には、在る程度デキてるモノから学んで欲しいと云う意図があるのだが(^_^;)

初心者向けとして、簡単なTipsサイト少ないのも そうなんだケド、
MSから代替として配布されているPowerShellのほうも、着実に改善して来ていて(?)、
どうも、ソチラへの移行組も それなりに増えているらしい・・・
更新されているVBS系サイトの総数自体が少なくなってる(゚Д゚;)

実際には、企業での需要とか まだ結構あるんだけどね・・・
モノとしては既に、枯れてるが・・・(爆)

2009/04/30

VBScriptで一気にRename・・・



---------- Update 200905040237
スクリプト中に1処理2行を追加。
パラメータ中の、フォルダと、拡張子なしファイルの識別を行う重要な行。
手抜きで入れてなかった(悪) 元々暫定版だしw

アーカイブも、ココのソースも、この版に更新済み。
----------------------------


先のログで触れた、SD14のファイル管理向けReplacedRenameスクリプト、
あんまりな造りだったので、公開しない予定だったが、ちょっとした工夫を加えて汎用化したので、うpしてみた。

アーカイブはコチラ▼
   MultiReplacedRename.zip    
▲ を、右クリックしてファイルとして保存してください。

ただ単純にファイル名の文字列置換するだけだと なんか芸がないし、使い勝手が悪い。
あと、置換後の名称と同名のファイルが既存の場合は、バックアップ取らせたいし、
対象ファイルがない場合は処理したくないし・・・ とか云ってると、同じ処理の繰り返しも多くなる。
元々のモノも、そのヘンは考慮した造りだったのだが、記述自体は間に合わせ感たっぷりの、
この上なくゴチャゴチャなモノだった。

また、置換前後の文字列と対象拡張子指定を、スクリプト内に直記述していた為、全く他への流用も利かなかった・・・

んで、そのままでは、今後使い辛いってのもあったので、
ファイル名変更部や、ファイルの名称に日時を付けでバックアップする処理を分離し、
スクリプト自身のファイル名を条件パラメータとして利用する構造に変更するコトで、
現在のようなスマートな状態になった。

使い方も簡単で、このスクリプト自体のファイル名を・・・

書式)
    {Before}_{After}_{拡張子}_..._{拡張子}.vbe    

記述例)
    SDIM_SDIM01_x3f_jpg.vbe    


のように変更済ませば、スクリプト本体か そのショートカットに、対象のファイルかフォルダをドロップするだけでいい。
複数フォルダ/ファイルドロップに対応、フォルダは第1階層分のみ対応、ソレより深い階層のファイルは処理しない。


あと、蛇足だが、FileSystemObjectのFolderオブジェクトは中々のクセ者だったコトを付け加えておこう。
よく使っていた対象なので、全く油断したというのがホントのトコで、意外な伏兵だった。
フォルダ内を検索し、一部のファイルに対して処理を行う程度ならともかく、
ここで紹介しているような、フォルダ内のファイル名を順繰りに全て処理する体のスクリプトの場合、
オブジェクトを直接利用し、単純にForEach-Nextで処理を組むと、ファイル名変更済みファイルを再度、
条件に基づいて処理してしまう。

実のトコロ、ココで紹介しているスクリプトの基となった暫定版がそうだったのだよ(´ヘ`;)
しかもコレが厄介で、問題の対象は、全てが二重処理されている訳でもなく、規則性もない・・・
原因については、機器のスペックの向上なども大きいと思われるが、おそらくは仕様だろうw

症状を診るに、序盤に名称変更したファイルの幾つかが、本来最後である筈のファイルの後に続いて、
既存ファイルとして呼び出されてしまっているようだ(´ヘ`;)
この挙動から判断するに、普通の関数や配列変数を使うつもりで、
FileSystemObjectのFolderオブジェクトを利用するのは、極めて避けるべき行為なのかもしれない。

・・・仕方がないので、置換(名称変更)処理に先んじて、
フォルダオブジェクトから全てのファイル名を文字列として取り出し、
それらで構成された配列変数を作成するコトで対策とするコトにした。
コレも、よく使う処理なので別途関数にした、ソレが、Function F2a・・・
簡単な処理だが、ある と ない とではエラくちがう(^_^;

オマケだか、上記誤処理をデバッグする過程でデキた、云わば副産物の、
動作中の対象文字列の収集と表示を行う関数 も同梱してあったりするw


で、ソースはコチラ▼
    '***** ↓↓↓ScriptTitle↓↓↓ *********************************************************     
'MultiReplacedRename
'- Created by LazwardFox -

'

'Update 20090504 0227 拡張子なしファイルを、フォルダと誤認しないよう処理を追記
'Release 20090430 1843 ファイル名から動作を取得 / スクリプト名称変更
'βRelease 20090430 1755
'DevStart 20090424 2200

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Public My, Parameters, MySh, Fs
Set My = WScript
Set Parameters = My.Arguments 'パラメーター取得
If Parameters.Count <= 0 Then 'パラメータなし起動の無効化
My.Quit
End If

Set MySh = My.CreateObject("WScript.Shell")
Set Fs = My.CreateObject("Scripting.FileSystemObject") 'ファイル制御

'***** ↓↓↓ Decralations ↓↓↓ *************************************************

Public ThisScriptFull, ThisScript, Start
Const vbWq = """"

Dim vbWCrLf, vbTc
vbWCrLf = vbCrLf & vbCrLf
vbTc = vbTab & vbCrLf

Dim Source, Extention
Dim cParameters, pDepth, tExt

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
'On Error Resume Next
ThisScriptFull = My.ScriptFullName
ThisScript = Fs.GetBaseName(ThisScriptFull)
cParameters = Split(ThisScript,"_")
pDepth = Ubound(cParameters)
If pDepth >= 2 Then '▼ ファイル名から動作パラメータを取得
If pDepth > 2 Then
For Pc = 2 to pDepth
If tExt = "" Then
tExt = cParameters(Pc)
Else
tExt = tExt & "," & cParameters(Pc)
End If
Next
End If '▲
Else
My.Quit
End If
If Parameters.Count > 1 Then '多数ドロップ時のみ確認画面表示
Start = MySh.Popup("RenameStart?",15,ThisScript,33)
End If
If Start = -1 Or Start = 2 Then
Else
For Each Source in Parameters
Extention = Lcase(Fs.GetExtensionName(Source))
If Extention = "" Then
If Fs.FolderExists(strParameters) Then '拡張子なしファイルをハジく
'Folder
Dim arFiles, SourceFile
arFiles = F2a(Source)
For Each SourceFile in arFiles
'iTest SourceFile & " / Folder",15
fReplace SourceFile, cParameters(0), cParameters(1), tExt
Next
End If
Else
'File
'iTest Source & " / File",15
fReplace Source, cParameters(0), cParameters(1), tExt
End If
Next
'iTest "ResultCheck",0
MySh.Popup "Renamed",15,ThisScript,33
End If
Set Fs = Nothing
Set MySh = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
'------------------------------------
'F2a 指定フォルダ内ファイル一覧を配列化
'- Created by LazwardFox -

'Fs

' Update -------- ----
' Release 20090430 1703

Function F2a(strTarget)
Dim objFolder, arF2a(), Pc
Pc = 0
Set objFolder = Fs.GetFolder(strTarget)
For Each strTarget in objFolder.Files
Redim Preserve arF2a(Pc)
arF2a(Pc) = strTarget
Pc = Pc + 1
Next
Set objFolder = Nothing
Pc = 0
F2a = arF2a
End Function

'------------------------------------
'fReplace ファイル名内の指定文字列を置換する。
'- Created by LazwardFox -

'Fs, iRename, dRename

' Update 20090430 0120 機能毎に部品化
' Update 20090425 0053 拡張子による条件化を追加
' Release 20090425 2110

Function fReplace(strTarget, strSource, strReplace, strExts)
Dim Replaced, objTarget, RootPath, ReplacedFull '途中パスの誤置換防止 ▼
RootPath = Fs.GetParentFolderName(strTarget)
Replaced = Replace(Fs.GetFileName(strTarget),strSource,strReplace)
ReplacedFull = Fs.BuildPath(RootPath, Replaced) '▲
dRename ReplacedFull '既存バックアップ
If strExts = "" Then
Else
Dim arExts, tExt '指定拡張子識別 ▼
arExts = Split(strExts,",")
lExt = LCase(Fs.GetExtensionName(strTarget))
For Each tExt in arExts
If tExt = lExt Then
Exit For
End If
tExt = ""
Next
If tExt = "" Then
Exit Function
End If '▲
End If
iRename strTarget, Replaced
End Function

'------------------------------------
'iRename 既存ファイルの名称を変更
'- Created by LazwardFox -

'Fs

' Update -------- ----
' Release 20090429 1727

Function iRename(Target, strRename)
Dim objTarget
If Fs.FileExists(Target) Then
Set objTarget = Fs.GetFile(Target)
objTarget.Name = strRename
Set objTarget = Nothing
End IF
End Function

'------------------------------------
'dRename 指定ファイル既存の場合、ファイル名に日時を添付。既存バックアップ向け
'- Created by LazwardFox -

'Fs, iDT, iRename

' Update -------- ----
' Release 20090430 0051

Function dRename(Target)
Dim dExt, Deted
If Fs.FileExists(Target) Then
dExt = "." & LCase(Fs.GetExtensionName(Target))
Deted = Replace(Fs.GetFileName(Target),dExt," " & iDT(""," ","",0) & dExt)
iRename Target, Dated
End IF
End Function

'------------------------------------
'iDT - 日時文字列 ないし 日/時配列取得 for VBScript
'- Created by LazwardFox -

' Update 20090228 0458 変数宣言変更
' Update 20090223 0959 時刻桁処理変更
' Update 20090223 0253 Len記述忘れ修正
' Update 20090223 0135 変数宣言忘れ修正
' Update 20090210 0218
' Update 20090210 0115
' Release 20090209 2035

' iDT (
' dSplitter - DateSplitString (Normal - "/")
' ,dtSeparater - Date/Time SepaleteString (Normal - " ")
' ,tSplitter - TimeSplitString (Normal - ":")
' ,Control - 文字列 0 or 配列 1 (Default - 1)
' )

Public Function iDT(dSplitter,dtSeparater,tSplitter,Control)
Dim nX, nD, nS, strHMS, sResult 'Update 20090228 0458
nX = Now()
nD = FormatDateTime(Date(),0)
nS = ":" & Split(CStr(FormatDateTime(nX,3)),":")(2) 'Update 20090223 0951
strHMS = FormatDateTime(nX,4) & nS 'Update 20090223 0951
If tSplitter = ":" Then
Else
strHMS = Replace(strHMS,":",tSplitter)
End If
sResult = Cstr(Replace(nD,"/",dSplitter)) & "*" & strHMS
If Control = 1 Then
iDT = Split(sResult,"*")
Else
iDT = Replace(sResult,"*",dtSeparater)
End If
End Function

'------------------------------------
'iTest 動作テスト テキストデータ累積収集と表示
'- Created by LazwardFox -

' Update -------- ----
' Release 20090430 1746 表示処理も統合
' βRelease 20090430 1700 累積収集のみ機能

Public strTests, tPc
Function iTest(strTarget, Control)
If Control > 0 Then
If tPc > Control Then
tPc = 0
strTests = strTests & "," & strTarget
Else
If strTests = "" Then
strTests = strTarget
Else
strTests = strTests & vbTc & strTarget
End If
End If
tPc = tPc + 1
Else
Dim arTarget, vTarget
arTarget = Split(strTests,",")
For Each vTarget In arTarget
Msgbox vTarget,,strTarget
Next
End If
End Function
<そのまま使える SIGMA SD14 SDIM####.X3F カウント 9999 少ない 欠点 ファイル 名称 まとめて置換 日付 バックアップ>