WSHでUTF-8をなんとかする

ものすごく久しぶりのEntryなのにWSHっていうのはどうかと思うのですが、意外と時間がかかったのでメモしておく。
そもそもは、Web.configのDB接続文字列を手軽に書き換えたいというただそれだけだったんだけどなあ。
まあまあ、細かいエラー処理とか、お作法とかそういうのはどうでもよいので気にせずゆこう


ポイントは

  • ADODB.Streamを使うこと
  • ファイルを一旦streamに読み込むこと
  • streamからファイル出力すること
<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
  <job id="changeconfig">
  <?job error="true" debug="true" ?>
  <script language="VBScript">
  <![CDATA[
Main()

Sub Main()

	'■ファイル名の設定
	Dim inputFileName
	Dim outputFileName
	inputFileName = WScript.Arguments(0)
	outputFileName = WScript.Arguments(1)

	'■入力ストリームの生成・設定(テキスト、UTF-8)
	Const streamType = 2 '[1:バイナリデータ 2:テキストデータ]
	Const streamCharset = "UTF-8"
	Dim inStream
	Set inStream = CreateObject("ADODB.Stream")
	inStream.type = streamType
	inStream.charset = streamCharset
	inStream.open
	inStream.LoadFromFile inputFileName

	'■出力ストリームの生成・設定(テキスト、UTF-8)
	Dim outStream
	Set outStream =CreateObject("ADODB.Stream")
	outStream.type = streamType
	outStream.charset = streamCharset
	outStream.open

	'■入力ファイルから一行ずつ読み出して、出力ストリームへ書き出す
	Const readType = -2 '[-1:全部読み込む -2:一行読み込む]
	Const writerType = 1 '[0:文字列のみ書き込む 1:文字列+改行を書き込む]
	Dim records
	Do While inStream.EOS = False
		'読み出し
		records = inStream.ReadText(readType) 
		'出力ストリームへ書き出す
		outStream.WriteText ChangeValue(records), writerType
	Loop

	'■出力ファイル生成
	Const outputType = 2 '[1:ファイルがない場合はファイル作成 2:ファイルがある場合は上書き]
	outStream.SaveToFile outputFileName, outputType

	'■ストリームを閉じてObjectを解放
	inStream.Close
	outStream.Close
	Set inStream = Nothing
	Set outStream = Nothing
	MsgBox "Web.configの書き換えを終えました。"

End Sub

Function ChangeValue(beforeValue)
	Const DataSource="SERVER\MAINDB"
	Const NewDataSource="localhost\SQLEXPRESS"
	Dim newStr
	newStr=Replace(beforeValue, DataSource, NewDataSource)
	ChangeValue = newStr
End Function
  ]]>
  </script>
  </job>
</package>