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

2013年1月7日月曜日

【VBScript】800A0036 800A003E ファイル操作エラー

詰まったので、メモ

VBScriptで、
「あるファイルを開き、ある文字列が書かれていれば何もしない、
書かれていなければその文字列を追記する」
という要件があったのですが、

800A0036「ファイルのモードが不正です」
800A003E「ファイルの最期を超えた入力を行おうとしました」

などのエラーが頻発。

テキストストリームオブジェクトの
 AtEndOfStream
 ReadAll
などは「読み取りモード」でないと動作せず、
 Write
 WriteLine
メソッドなどは書き込みモードでないと動作しないことが原因でした。


Dim fs
Set fs = WScript.CreateObject("Scripting.FileSystemObject")
Dim ts
Set ts = fs.OpenTextFile(FilePath,1,True) 'いったん読み取りで開く

Dim filebody
If ts.AtEndOfStream Then
 filebody = ""
Else
 filebody = ts.ReadAll
End If
ts.Close

Set ts = fs.OpenTextFile(FilePath,8,True) '書き込みで開き直す

'---------------何か書き込むコード--------------

ts.Close

Set ts = fs.OpenTextFile(FilePath,1,True) '再度読み取りで開く

'---------------書き込み結果を処理(メール送信など)するコード--------------

ts.Close
Set fs = Nothing


なかなか煩わしいですね・・・。

FileSystemObjectに関する詳細は こちら

2012年8月24日金曜日

バイナリデータのチェック

VBSでバイナリデータのヘッダをチェックするコードを書いてます。
バイナリデータのヘッダ情報については以下のページを参考にしました。
http://www.garykessler.net/library/file_sigs.html

方法はADODB.Streamオブジェクトで引っ張って、ダンプ形式に変換するというものです。
参考コード
Function GetBinaryDumpDisplay(filename,length)
 Dim Stream
 Set Stream = CreateObject("ADODB.Stream")
 Dim LineBuffer,DispBuffer,CWork,i,j
 Stream.Open
 Stream.Type = 1  ' StreamTypeEnum の adTypeBinary
 Stream.LoadFromFile filename
 DispBuffer = ""
 j = 1
 Do while not Stream.EOS
  LineBuffer = Stream.Read(1)
  Cwork = AscB(LineBuffer)
  Cwork = Hex(Cwork)
  Cwork = Ucase(Cwork)
  Cwork = Right( "0" & Cwork, 2 )
  DispBuffer = DispBuffer & Cwork & " "
  If (j Mod 16) = 0 Then
   DispBuffer = DispBuffer & "
" & vbCrLf End If If j = length Then Exit Do End If j = j + 1 Loop Stream.Close GetBinaryDumpDisplay = DispBuffer End Function

2011年6月8日水曜日

VBScript Subプロシージャの()とCall

VBScript(asp上)でSubプロシージャの呼び出し方を調べました。

Dim a:a="a":
Dim b:b="b":

Sub sub0()
 Response.Write "z":
End Sub
Sub sub1(x)
 Response.Write x:
End Sub
Sub sub2(x,y)
 Response.Write x & y:
End Sub

sub0()
sub0
Call sub0()
Call sub0

sub1(a)
sub1 a
Call sub1(a)
Call sub1 a '←×

sub2(a,b) '←×
sub2 a,b
Call sub2(a,b)
Call sub2 a,b '←×


引数がそれぞれ0,1,2個のSubプロシージャを用意し、
括弧()の有り無し、Callの有り無しで呼び出してみました。
結果は上手くいくものとそうでないものが有り、
上記の通りコメントで「×」としたものがエラーとなりました。

Callと括弧()はワンセットで使う、もしくはどちらも使わない
と覚えておくのが良いでしょう。

2011年4月5日火曜日

64bit環境でBASP21を使うには

IIS上で動かすには
Microsoft.Jet.OLEDB.4.0 と 64bit環境
でも書いたように「32ビットアプリケーションの有効化」を行えば動きます。

WSHで動かすには、
デフォルトで
C:\Windows\System32\wscript.exe(cscript.exe)
で起動するところを
C:\Windows\SysWOW64\wscript.exe(cscript.exe)
に変更してあげると動きます。

2011年2月28日月曜日

AccessmdbのSQLインジェクション対策

1つ前の書き込み「VBScript IsNullとかIsEmptyとかIsNumericとか」で、
「実際にはポストされていないデータをRequestで取得してしまった場合、その値はEmptyとなる」
また、「IsNumeric(Empty)はTrueになる」ということを確認しました。

Access MDB では、数値型を「'(シングルクォート)」で囲むことができないため、
クエリに数値型のパラメータを埋めこまなくてはならない場合、埋め込む値が
数値型であるかどうかを厳密にチェックする必要があります。
VBScriptのIsNumericだけでは意図したチェックにならない可能性があるので、
注意しなくてはなりません。

Webのようなインジェクションの恐れがある環境で、
データベースにmdbを用いないのが本来だとは思うのですが・・・。

VBScript IsNullとかIsEmptyとかIsNumericとか

定義 構文 結果
num = "" Response.Write num
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
(num=0) スクリプトエラー
(num="0") False
num = Empty Response.Write num
TypeName(num) Empty
IsNull(num) False
IsEmpty(num) True
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") False
num = null Response.Write num
TypeName(num) Null
IsNull(num) True
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
IsNull(num=0) True
IsNull(num="0") True
num = 0 Response.Write num 0
TypeName(num) Integer
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") True
num = "0" Response.Write num 0
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") True
num = "0"(全角) Response.Write num
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") False
num = "〇"(漢数字) Response.Write num
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
(num=0) スクリプトエラー
(num="0") False
num = "3D2" Response.Write num 3D2
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=300) True
(num="300") False


上記は各データをチェックした一覧です。
想像していたのと、違う結果になっていないでしょうか。

特に↓のような時
Dim num
num = Request("numnum") '←実際はnumnumというnameのデータはポストされていない
numはEmptyとなるので、IsNumericで数値チェックをするとTrueとなってしまいます。

2010年4月12日月曜日

VBScript では同じ関数名でも許される

Sub hoge()
 response.write "hoge"
End Sub
Sub hoge()
 response.write "hogehoge"
End Sub
Call hoge()
'実行結果 hogehoge



後に宣言した方が有効らしい・・・。
おいおい