本ページには広告が含まれています。
目次
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 省略可
- セクションとキーが存在しなかった場合に返す値
- 戻り値
プログラム
//////////////////////////////////////////////////
// 【引数】
// 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の内容です。
[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と同じディレクトリでの実行結果です。
違うディレクトリで実行する場合は、第三引数に絶対パスを指定する必要があります。
DIM path = "C:\Users\" + TRIM(DOSCMD("echo %USERNAME%")) + "\AppData\Roaming\UWSC\UWSC.INI"
PRINT INI.Read(NULL, NULL, path)
指定したセクション名、キー名の値を取得
UWSC.INIのSETセクションのPositionキーの値を取得します。
PRINT INI.Read("SET", "Position", "UWSC.INI")
- 結果
411,338
キー名=値のあとにコメントがあると、コメントも取得されるので注意してください。
[SET]
Position=7,81 ; 位置
PRINT INI.Read("SET", "Position", "UWSC.INI")
- 結果
7,81 ; 位置
すべてのセクションを取得
セクション・キーにNULLを指定した場合、すべてのセクションを取得します。以下はUWSC.INIにあるセクションの一覧を返します。
FOR section IN INI.Read(NULL, NULL, "UWSC.INI")
PRINT section
NEXT
- 結果
SET LUNCHMENU SCHEDULE
セクションの数を取得
UWSC.INIにあるセクションの数を返します。[SET]、[LUNCHMENU]、[SCHEDULE]の3つなので3を返します。
PRINT LENGTH(INI.Read(NULL, NULL, "UWSC.INI"))
- 結果
3
指定したセクションのすべてのキー名を取得
UWSC.INIのSETセクションにあるキー名の一覧を取得します。
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セクションにあるキーの数を返します。
PRINT LENGTH(INI.Read("SET", NULL, "UWSC.INI"))
- 結果
15
すべてのセクション名、キー名、値を取得
UWSC.INIのすべてのセクション、キー、値を出力します。
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が存在するかを調べます。
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起動時の座標を表しています。
存在しないキー名を指定した場合は指定したセクションの末尾、存在しないセクションを追加した場合はファイルの末尾に追加されます。
INI.Write("SET", "Position", "0,0")
すべてのセクションを削除
WITH INI
FOR section IN .Read(NULL, NULL)
.Delete(section, NULL)
NEXT
ENDWITH
参考文献
関連記事
- DELETEINI関数 (スクリプト関数)
- WRITEINI関数 (スクリプト関数)
- WRITEINI関数はINIファイルに値を書き込む関数です。値を読み込むにはREADINI関数を使います。
- READINI関数 (スクリプト関数)
- READINI関数はINIファイルから値を読み込みます。値を書き込むにはWRITEINI関数を使います。