INIイニ関数

本ページには広告が含まれています。

INIファイルの読み書きを行います。

構文
INI.Read( section, key, path, default )
INI.Write( section, key, value, path )
INI.Delete( section, key, path )
INI.escape( value )
INI.unescape( value )
引数
section 必須
セクション
key 必須
キー(Delete関数は省略可)
value 必須
path 省略可
INIファイルのパス
default 省略可
セクションとキーが存在しなかった場合に返す値
戻り値

プログラム

UWSC
//////////////////////////////////////////////////
// 【引数】
//   section : セクション 
//   key : キー(Delete関数は省略可) 
//   value : 値 
//   path : INIファイルのパス 
//   default : セクションとキーが存在しなかった場合に返す値 
// 【戻り値】
//   
//////////////////////////////////////////////////
MODULE INI
	DEF_DLL GetPrivateProfileStringW(wstring,wstring,wstring,var pwchar,dword,wstring):dword:kernel32
	DEF_DLL WritePrivateProfileStringW(wstring,wstring,wstring,wstring):bool:kernel32
	FUNCTION Read(section = NULL, key = NULL, path = NULL, default = EMPTY)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		DIM n = 1024
		DIM buffer = FORMAT(CHR(0), n)
		IFB GetPrivateProfileStringW(section, key, default, buffer, n, path) = 0 THEN
			RESULT = default
		ELSE
			RESULT = SLICE(SPLIT(buffer, CHR(0), TRUE))
			IF section <> NULL AND key <> NULL THEN RESULT = RESULT[0]
		ENDIF
	FEND
	FUNCTION Write(section, key, value, path = NULL)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		RESULT = WritePrivateProfileStringW(section, key, value, path)
	FEND
	PROCEDURE Delete(section, key = NULL, path = NULL)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		PRINT WritePrivateProfileStringW(section, key, NULL, path)
	FEND
	FUNCTION escape(value)
		DIM esc = ";#=:"
		FOR i = 1 TO LENGTH(esc)
			DIM s = COPY(esc, i, 1)
			value = REPLACE(value, s, "\" + s)
		NEXT
		RESULT = value
	FEND
	FUNCTION unescape(value)
		DIM esc = ";#=:"
		FOR i = 1 TO LENGTH(esc)
			DIM s = COPY(esc, i, 1)
			value = REPLACE(value, "\" + s, s)
		NEXT
		RESULT = value
	FEND
ENDMODULE

使い方

C:\Users\username\AppData\Roaming\UWSC\UWSC.INIの内容です。

UWSC.INI
[SET]
Position=411,338
PlayHotKey=1,2
StopHotKey=2,2
RecHotKey=3,2
TrayHotKey=14,5
LunchMenuHotKey=19,2
MouseOrg=0
NotActive=0
StayOnTop=0
LogLines=2000
DefaultFont=,
TaskTrayStart=1
RecLevel=1
Cp2Clipboard=1
NotExtraMovRec=0
[LUNCHMENU]
Position=0,0
T1=
S1=
P1=1
T2=
S2=
P2=0
[SCHEDULE]
MaxNumber=40
WakeUp=0
Sound=0

以下に示すプログラムはこのUWSC.INIと同じディレクトリでの実行結果です。

違うディレクトリで実行する場合は、第三引数に絶対パスを指定する必要があります。

UWSC
DIM path = "C:\Users\" + TRIM(DOSCMD("echo %USERNAME%")) + "\AppData\Roaming\UWSC\UWSC.INI"

PRINT INI.Read(NULL, NULL, path)

指定したセクション名、キー名の値を取得

UWSC.INIのSETセクションのPositionキーの値を取得します。

UWSC
PRINT INI.Read("SET", "Position", "UWSC.INI")
結果
プレーンテキスト
411,338

キー名=値のあとにコメントがあると、コメントも取得されるので注意してください。

UWSC.INI
[SET]
Position=7,81				; 位置
UWSC
PRINT INI.Read("SET", "Position", "UWSC.INI")
結果
プレーンテキスト
7,81				; 位置

すべてのセクションを取得

セクション・キーにNULLを指定した場合、すべてのセクションを取得します。以下はUWSC.INIにあるセクションの一覧を返します。

UWSC
FOR section IN INI.Read(NULL, NULL, "UWSC.INI")
	PRINT section
NEXT
結果
プレーンテキスト
SET
LUNCHMENU
SCHEDULE

セクションの数を取得

UWSC.INIにあるセクションの数を返します。[SET][LUNCHMENU][SCHEDULE]の3つなので3を返します。

UWSC
PRINT LENGTH(INI.Read(NULL, NULL, "UWSC.INI"))
結果
プレーンテキスト
3

指定したセクションのすべてのキー名を取得

UWSC.INIのSETセクションにあるキー名の一覧を取得します。

UWSC
FOR item IN INI.Read("SET", NULL, "UWSC.INI")
	PRINT item
NEXT
結果
プレーンテキスト
Position
PlayHotKey
StopHotKey
RecHotKey
TrayHotKey
LunchMenuHotKey
MouseOrg
NotActive
StayOnTop
LogLines
DefaultFont
TaskTrayStart
RecLevel
Cp2Clipboard
NotExtraMovRec

指定したセクションにあるキーの数を取得

UWSC.INIのSETセクションにあるキーの数を返します。

UWSC
PRINT LENGTH(INI.Read("SET", NULL, "UWSC.INI"))
結果
プレーンテキスト
15

すべてのセクション名、キー名、値を取得

UWSC.INIのすべてのセクション、キー、値を出力します。

UWSC
FOR section IN INI.Read(NULL, NULL, "UWSC.INI")
	PRINT "[" + section + "]"
	FOR key IN INI.Read(section, NULL, "UWSC.INI")
		PRINT key + "=" + INI.Read(section, key, "UWSC.INI")
	NEXT
NEXT
結果
プレーンテキスト
[SET]
Position=411,338
PlayHotKey=1,2
StopHotKey=2,2
RecHotKey=3,2
TrayHotKey=14,5
LunchMenuHotKey=19,2
MouseOrg=0
NotActive=0
StayOnTop=0
LogLines=2000
DefaultFont=,
TaskTrayStart=1
RecLevel=1
Cp2Clipboard=1
NotExtraMovRec=0
[LUNCHMENU]
Position=0,0
T1=
S1=
P1=1
T2=
S2=
P2=0
[SCHEDULE]
MaxNumber=40
WakeUp=0
Sound=0

指定したセクションにキーが存在するか

SETセクションのキーにPositionが存在するかを調べます。

UWSC
DIM keys = INI.Read("SET", NULL, "UWSC.INI")
PRINT inArray("Position", keys)

//////////////////////////////////////////////////
// 【引数】
//   needle : 探す値 
//   haystack : 配列 
//   strict : 型も同じかチェックします 
// 【戻り値】
//   TRUE : 配列中に指定した値が存在する、FALSE : 配列中に指定した値が存在しない 
//////////////////////////////////////////////////
FUNCTION inArray( needle, haystack[], strict = FALSE)
	DIM res = FALSE
	FOR item IN haystack
		IFB needle = item THEN
			IFB strict THEN
				IFB VARTYPE(needle) = VARTYPE(item) THEN
					res = TRUE
					BREAK
				ENDIF
			ELSE
				res = TRUE
				BREAK
			ENDIF
		ENDIF
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   section : セクション 
//   key : キー(Delete関数は省略可) 
//   value : 値 
//   path : INIファイルのパス 
//   default : セクションとキーが存在しなかった場合に返す値 
// 【戻り値】
//   
//////////////////////////////////////////////////
MODULE INI
	DEF_DLL GetPrivateProfileStringW(wstring,wstring,wstring,var pwchar,dword,wstring):dword:kernel32
	DEF_DLL WritePrivateProfileStringW(wstring,wstring,wstring,wstring):bool:kernel32
	FUNCTION Read(section = NULL, key = NULL, path = NULL, default = EMPTY)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		DIM n = 1024
		DIM buffer = FORMAT(CHR(0), n)
		IFB GetPrivateProfileStringW(section, key, default, buffer, n, path) = 0 THEN
			RESULT = default
		ELSE
			RESULT = SLICE(SPLIT(buffer, CHR(0), TRUE))
			IF section <> NULL AND key <> NULL THEN RESULT = RESULT[0]
		ENDIF
	FEND
	FUNCTION Write(section, key, value, path = NULL)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		RESULT = WritePrivateProfileStringW(section, key, value, path)
	FEND
	PROCEDURE Delete(section, key = NULL, path = NULL)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		PRINT WritePrivateProfileStringW(section, key, NULL, path)
	FEND
	FUNCTION escape(value)
		DIM esc = ";#=:"
		FOR i = 1 TO LENGTH(esc)
			DIM s = COPY(esc, i, 1)
			value = REPLACE(value, s, "\" + s)
		NEXT
		RESULT = value
	FEND
	FUNCTION unescape(value)
		DIM esc = ";#=:"
		FOR i = 1 TO LENGTH(esc)
			DIM s = COPY(esc, i, 1)
			value = REPLACE(value, "\" + s, s)
		NEXT
		RESULT = value
	FEND
ENDMODULE
結果
プレーンテキスト
True

値を書き込む

SETセクションのPositionキーの値を0,0に書き換えます。UWSC起動時の座標を表しています。

存在しないキー名を指定した場合は指定したセクションの末尾、存在しないセクションを追加した場合はファイルの末尾に追加されます。

UWSC
INI.Write("SET", "Position", "0,0")

すべてのセクションを削除

UWSC
WITH INI
	FOR section IN .Read(NULL, NULL)
		.Delete(section, NULL)
	NEXT
ENDWITH

参考文献

  1. GetPrivateProfileString API(Win32) - いじくるつくーるのヘルプ

関連記事

DELETEINI関数 (スクリプト関数)
WRITEINI関数 (スクリプト関数)
WRITEINI関数はINIファイルに値を書き込む関数です。値を読み込むにはREADINI関数を使います。
READINI関数 (スクリプト関数)
READINI関数はINIファイルから値を読み込みます。値を書き込むにはWRITEINI関数を使います。