Contents
- 構文
- LongWord = POS( 探す文字, 探される文字列, [n個目] )
- 引数
- 探す文字
- 探したい文字列
- 探される文字列
- 探される文字列
- n個目
- nを指定するとn個目の文字位置を返す(マイナス値で指定すると後ろからサーチ)
- 戻り値
見つかった位置 (1から)
(見つからなければゼロを返す)
(大文字,小文字の区別はしません)
※ANSI(バイト)処理の場合は POSB
文字列が存在するかを調べる
IF POS(探す文字列, 探される文字列) <> 0 THEN
存在するときの処理
ELSE
存在しないときの処理
ENDIF
プログラム実行例
無線LANのインターフェイス情報を取得
HASHTBL LAN
str = SPLIT(DOSCMD("netsh wlan show interface"), "<#CR>")
FOR n = 0 TO UBound(str)
IFB POS(":", str[n]) THEN
arr = SPLIT(str[n], ":")
LAN[TRIM(arr[0])] = TRIM(arr[1])
ENDIF
NEXT
DIM items[] = "名前", "説明", "GUID", "物理アドレス", "状態", + _
"SSID", "BSSID", "ネットワークの種類", "無線の種類", "認証", + _
"暗号", "接続モード", "チャネル", "受信速度 (Mbps)", "送信速度 (Mbps)", + _
"シグナル", "プロファイル", "ホストされたネットワークの状態"
FOR item IN items
PRINT item + ":" + LAN[item]
NEXT
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
- 結果
名前:ワイヤレス ネットワーク接続 説明:Intel(R) WiFi Link 1000 BGN GUID:*** 物理アドレス:74 状態:接続されました SSID:*** BSSID:18 ネットワークの種類:インフラストラクチャ 無線の種類:802.11n 認証:WPA2-パーソナル 暗号:CCMP 接続モード:自動接続 チャネル:10 受信速度 (Mbps):72 送信速度 (Mbps):72 シグナル:80% プロファイル:*** ホストされたネットワークの状態:利用不可
ユーザー名を取得
HASHTBL ENV
DIM str = SPLIT(DOSCMD("SET"), "<#CR>")
FOR n = 0 TO UBound(str)
IFB POS("=", str[n]) THEN
arr = SPLIT(str[n], "=")
ENV[TRIM(arr[0])] = TRIM(arr[1])
ENDIF
NEXT
PRINT ENV["USERNAME"]
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
解説
- 1行目
- 連想配列ENVを宣言します。環境を表すEnvironmentの略です。
HASHTBL ENV
- 3行目
- コマンドプロンプトでSETコマンドを実行し環境変数を取得します。その結果を改行毎にstr配列に格納します。str[0]=1行目、str[1]=2行目、str[n]=n+1行目、…という風に格納されます。
DIM str = SPLIT(DOSCMD("SET"), "")
- 5行目
- 変数nが0からstr配列の要素数分処理を繰り返します。str配列の要素数はSETコマンドの出力結果の行数-1となります。
FOR n = 0 TO UBound(str)
- 6-9行目
- もしstr[n]に"="が含まれていたら、"="を区切り文字列としてarr配列に格納します。arr[0]にstr[n]の"="より前の文字列、arr[1]にstr[n]の"="より後の文字列が格納されます。その後、arr[0]をキー、arr[1]を値として連想配列ENVに格納します。簡単に説明すると、str[n]の"="より前の文字列をキー、"="より後を値として連想配列を作成しています。
IFB POS("=", str[n]) THEN arr = SPLIT(str[n], "=") ENV[TRIM(arr[0])] = TRIM(arr[1]) ENDIF
- 12行目
- ENV["USERNAME"]の値を出力します。
PRINT ENV["USERNAME"]
デフォルトプリンターを取得
CONST ssfPRINTERS = 4
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfPRINTERS)
DIM FolderItems = Folder.Items
HASHTBL iColumn
FOR n = 0 TO 350
iColumn[Folder.GetDetailsOf(EMPTYPARAM, n)] = n
NEXT
FOR n = 0 TO FolderItems.Count - 1
DIM FolderItem = FolderItems.Item(n)
DIM PrinterName = Folder.GetDetailsOf(FolderItem, iColumn["名前"])
FOR i = 0 TO FolderItem.Verbs.Count - 1
IF POS("通常使うプリンターに設定", FolderItem.Verbs.Item(i).Name) <> 0 THEN CONTINUE 2
NEXT
PRINT PrinterName
BREAK
NEXT
- CREATEOLEOBJ
- NameSpace メソッド
- Folder.Items メソッド
- Folder.GetDetailsOf メソッド
- FolderItemsオブジェクト
- FolderItems.Item メソッド
- POS
- FolderItem.Verbs メソッド
- FolderItemVerbs.Item メソッド
- FolderItemVerb.Name プロパティ
- 結果
Brother DCP-J963N Printer
Yahoo!天気・災害情報より直近に発生した地震情報を取得しその場所をGoogleマップで表示
DIM IE = IEBoot()
IE.Navigate("http://typhoon.yahoo.co.jp/weather/earthquake/")
BusyWait(IE)
DIM ID = GETID("地震情報")
CTRLWIN(ID, MAX)
DIM array[-1][-1]
DIM element = IE.document.getElementById("eqinfdtl")
DIM elements = element.getElementsByTagName("table")
element = elements.Item(0)
getTableData(element, array)
HASHTBL tbl
FOR r = 0 TO UBound(array)
tbl[TRIM(array[r][0])] = array[r][1]
NEXT
DIM way[1]
IF POS("北緯", tbl["緯度/経度"]) THEN way[0] = "N"
IF POS("東経", tbl["緯度/経度"]) THEN way[1] = "E"
IF POS("西経", tbl["緯度/経度"]) THEN way[1] = "W"
IF POS("南緯", tbl["緯度/経度"]) THEN way[0] = "S"
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "度", "")
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "北緯", "")
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "東経", "")
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "西経", "-")
tbl["緯度/経度"] = REPLACE(tbl["緯度/経度"], "南緯", "-")
DIM coordinate = SPLIT(TRIM(tbl["緯度/経度"]), "/")
DIM z = 7
DIM url = "https://www.google.co.jp/maps/place/" + degToDMS(coordinate[0]) + way[0] + "," + degToDMS(coordinate[1]) + way[1] + "/@" + coordinate[0] + "," + coordinate[1] + "," + z + "z/"
url = REPLACE(url, "°", "%C2%B0")
url = REPLACE(url, "<#DBL>", "")
IE.Navigate(url)
BusyWait(IE)
//////////////////////////////////////////////////
// 【引数】
// IE : IEオブジェクト
// 【戻値】
//
//////////////////////////////////////////////////
PROCEDURE BusyWait(Var IE)
SLEEP(0.500)
DIM t = GETTIME()
TRY
REPEAT
DIM tm = GETTIME() - t
FUKIDASI("BusyWait:" + tm)
SLEEP(0.010)
IF tm >= 60 THEN BREAK
UNTIL !IE.Busy AND IE.readyState = 4
EXCEPT
IE = getIEObj(-1)
PRINT IE.document.URL + " のIEオブジェクトを取得しました。"
BusyWait(IE)
ENDTRY
FUKIDASI()
FEND
//////////////////////////////////////////////////
// 【引数】
// deg : 角度(°)
// 【戻値】
// 角度(deg°分'秒")
//////////////////////////////////////////////////
FUNCTION degToDMS(deg)
DIM degree = INT(deg)
DIM minute = (deg - INT(deg)) * 60
DIM second = ROUND(minute - INT(minute), -10) * 60
RESULT = degree + "°" + INT(minute) + "'" + ROUND(second, -5) + ""
FEND
//////////////////////////////////////////////////
// 【引数】
// 文字列 or 数値 : 取得したいIEオブジェクトのタイトル・URLもしくは数値を指定
// 完全一致フラグ : (TRUE : 文字列が完全一致したものを取得、FALSE : 文字列の一部を含むものを取得)
// 【戻値】
// Internet Explorerオブジェクト
//////////////////////////////////////////////////
FUNCTION getIEObj(str, flg = FALSE)
DIM Shell = CREATEOLEOBJ("Shell.Application")
SELECT CHKNUM(str)
CASE TRUE
DIM cnt = 0
SELECT TRUE
CASE str > 0
FOR n = 0 TO Shell.Windows.Count - 1
TRY
IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
cnt = cnt + 1
IFB str = cnt THEN
RESULT = Shell.Windows.Item(n)
EXIT
ENDIF
ENDIF
EXCEPT
ENDTRY
NEXT
CASE str = 5
SELEND
RESULT = ERR_VALUE
FEND
//////////////////////////////////////////////////
// 【引数】
// table : tableエレメント
// arr : 取得したデータを格納する配列(参照引数)
// 【戻値】
//
//////////////////////////////////////////////////
PROCEDURE getTableData(table, Var arr[][])
rowMax = table.rows.length - 1
colMax = 0
FOR row = 0 TO table.rows.length - 1
IFB table.rows(row).cells.length - 1 > colMax THEN
colMax = table.rows(row).cells.length - 1
ENDIF
NEXT
DIM arr[rowMax][colMax]
FOR row = 0 TO table.rows.length - 1
FOR col = 0 TO table.rows(row).cells.length - 1
n = 0
WHILE arr[row][col + n] ""
n = n + 1
WEND
arr[row][col + n] = table.rows(row).cells(col).innerText
IFB table.rows(row).cells(col).rowSpan > 1 AND table.rows(row).cells(col).colSpan > 1 THEN
rmax = table.rows(row).cells(col).rowSpan - 1
cmax = table.rows(row).cells(col).colSpan - 1
FOR r = 1 TO rmax
FOR c = 1 TO cmax
arr[row + r][col + c] = "←"
NEXT
NEXT
ENDIF
IFB table.rows(row).cells(col).rowSpan > 1 THEN
n = table.rows(row).cells(col).rowSpan - 1
WHILE n
arr[row + n][col] = "↑"
n = n - 1
WEND
ENDIF
IFB table.rows(row).cells(col).colSpan > 1 THEN
n = table.rows(row).cells(col).colSpan - 1
WHILE n
arr[row][col + n] = "←"
n = n - 1
WEND
ENDIF
NEXT
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// InPrivate : InPrivateブラウズ・モードを有効にするときはTRUEを指定(デフォルトはFALSE)
// 【戻値】
// InternetExplorerオブジェクト
//////////////////////////////////////////////////
FUNCTION IEBoot(InPrivate = FALSE)
DIM IE
SELECT InPrivate
CASE TRUE
DOSCMD("start iexplore -private")
GETID("InPrivate - Internet Explorer - [InPrivate]", "IEFrame", -1)
IE = GETACTIVEOLEOBJ("InternetExplorer.Application","InPrivate - Internet Explorer - [InPrivate]")
CASE FALSE
TRY
IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
EXCEPT
EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
GETID("Internet Explorer", "IEFrame", -1)
TRY
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
EXCEPT
IE = getIEObj(-1)
ENDTRY
ENDTRY
SELEND
RESULT = IE
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND