Contents
DOSCMD関数は、コマンドライン(コマンドプロンプト)を実行する関数です。第一引数に指定したコマンドを実行します。標準出力を戻値として返しますが、同期フラグもしくは画面出力がTrueの場合は戻値はありません。
- 構文
- UString = DOSCMD( コマンド, [同期フラグ, 画面表示, UNICODE出力] )
- 引数
- コマンド
- コマンドプロンプトのコマンド
- 同期フラグ
- FALSE
- 終了を待つ(デフォルト)
- TRUE
- 待たずに戻る
- 画面表示
- FALSE
- コマンドプロンプト画面を表示しない(デフォルト)
- TRUE
- 表示する
- UNICODE出力
- FALSE
- ANSIにて出力(デフォルト)
- TRUE
- UNICODEにて出力
- 戻値
- 標準出力を返す(同期フラグがTrue、もしくは画面表示がTrueの場合は返しません)
プログラム実行例
PCをシャットダウンする
DOSCMD("SHUTDOWN /s /t 0")
解説
- 1行目
DOSCMDはコマンドラインを実行する関数です。「SHUTDOWN /s」はコンピュータのシャットダウン、「/t 0」は0秒後に実行することを意味します。DOSCMD("SHUTDOWN /s /t 0")
PCを再起動する
DOSCMD("SHUTDOWN /r /t 0")
解説
- 1行目
DOSCMDはコマンドラインを実行する関数です。「SHUTDOWN /r」はコンピュータの再起動、「/t 0」は0秒後に実行することを意味します。DOSCMD("SHUTDOWN /r /t 0")
ユーザー名を取得
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行目
コマンドプロンプトで環境変数を取得し、その結果を改行を区切り文字列としてstr配列に格納します。str[0]に1行目、str[1]に2行目という風に格納されます。DIM str = SPLIT(DOSCMD("SET"), "<#CR>")
- 5-10行目
str配列の数だけループ。FOR n = 0 TO UBound(str) IFB POS("=", str[n]) THEN arr = SPLIT(str[n], "=") ENV[TRIM(arr[0])] = TRIM(arr[1]) ENDIF NEXT
- 条件
- str配列のn番目に「=(イコール)」が含まれているか
- TRUE(「=」が含まれていたら)
- 「=」を区切り文字列としてarr配列に格納します。「環境変数名=値」という形で出力されるので、arr[0]に環境変数名、arr[1]に値が格納されます。
ENV[環境変数名]に値代入します。
- 12行目
環境変数名USERNAMEを出力します。PRINT ENV["USERNAME"]
サービスをすべて取得し、そのサービスをユーザーが開始・停止できるかどうかをブール値で返す
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM str = DOSCMD("sc query state=all | findstr /B <#DBL>SERVICE_NAME:<#DBL>")
DIM Matches = reExecute(str, "SERVICE_NAME: (.*?)\r\n")
DIM services[Matches.Count]
FOR n = 0 TO Matches.Count - 1
DIM service = Matches.Item(n).SubMatches(0)
services[n] = service + ":" + Shell.CanStartStopService(service)
NEXT
QSORT(services, QSRT_UNICODEA)
FOR service IN services
PRINT service
NEXT
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現で検索した結果をMatchesコレクションとして返します。
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Execute(str)
FEND
- 結果
- AarSvc_4de65:False
AdobeARMservice:False
AJRouter:False
ALG:False
ALUpdateService:False
(中略)
WwanSvc:False
XblAuthManager:False
XblGameSave:False
XboxGipSvc:False
XboxNetApiSvc:False
システム起動時間を取得
HASHTBL INFO
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
DIM filename = uniqueFilename(FSO.BuildPath(GET_CUR_DIR, "SYSTEMINFO.csv"))
FID = FOPEN(filename, F_READ OR F_WRITE)
FPUT(FID, DOSCMD("systeminfo /FO CSV"))
FCLOSE(FID)
FID = FOPEN(filename, F_READ OR F_WRITE)
FOR col = 0 TO 33
INFO[FGET(FID, 1, col)] = FGET(FID, 2, col)
NEXT
FCLOSE(FID)
FSO.DeleteFile(filename)
PRINT INFO["システム起動時間"]
//////////////////////////////////////////////////
// 【引数】
// path : ファイルのパス
// 【戻値】
// 重複しないファイル名
//////////////////////////////////////////////////
FUNCTION uniqueFilename(path)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
IFB FSO.FileExists(path) THEN
DIM fol = FSO.GetParentFolderName(path)
DIM filename = FSO.GetBaseName(path)
DIM extension = FSO.GetExtensionName(path)
i = 2
WHILE FSO.FileExists(FSO.BuildPath(fol, filename + " (" + i + ")." + extension))
i = i + 1
WEND
RESULT = FSO.BuildPath(fol, filename + " (" + i + ")." + extension)
ELSE
RESULT = path
ENDIF
FEND
- 結果
- 2019/12/21, 15:53:56
解説
- 1行目
連想配列INFOを宣言する。HASHTBL INFO
- 3行目
FileSystemObjectオブジェクトを作成する。DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
- 5行目
カレントディレクトリに「SYSTEMINFO.csv」というファイル名でCSVファイルを作成する。DIM filename = uniqueFilename(FSO.BuildPath(GET_CUR_DIR, "SYSTEMINFO.csv"))
- 6行目
「SYSTEMINFO.csv」を読み込み/書き込みモードで開く。FID = FOPEN(filename, F_READ OR F_WRITE)
- 7行目
コマンドプロンプトで「systeminfo /FO CSV」を実行し、その結果をファイルに書き込む。FPUT(FID, DOSCMD("systeminfo /FO CSV"))
- 8行目
CSVファイルを保存して閉じる。FCLOSE(FID)
- 10行目
「SYSTEMINFO.csv」を読み込み/書き込みモードで開く。FID = FOPEN(filename, F_READ OR F_WRITE)
- 11-13行目
1行目に項目、2行目に値が書かれているので、INFO[項目]に値を格納する。FOR col = 0 TO 33 INFO[FGET(FID, 1, col)] = FGET(FID, 2, col) NEXT
- 14行目
CSVファイルを閉じる。FCLOSE(FID)
- 16行目
CSVファイルを削除する。FSO.DeleteFile(filename)
- 18行目
「システム起動時間」を出力する。PRINT INFO["システム起動時間"]
Windowsの稼働時間を取得
HASHTBL INFO
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
DIM filename = uniqueFilename(FSO.BuildPath(GET_CUR_DIR, "SYSTEMINFO.csv"))
FID = FOPEN(filename, F_READ OR F_WRITE)
FPUT(FID, DOSCMD("systeminfo /FO CSV"))
FCLOSE(FID)
FID = FOPEN(filename, F_READ OR F_WRITE)
FOR col = 0 TO 33
INFO[FGET(FID, 1, col)] = FGET(FID, 2, col)
NEXT
FCLOSE(FID)
FSO.DeleteFile(filename)
DIM startupTime = INFO["システム起動時間"]
date1 = dateValue(startupTime) + timeValue(startupTime)
date2 = uwscToSerial(GETTIME())
PRINT INT(date2 - date1) + ":" + text(date2 - date1, "hh:mm:ss")
//////////////////////////////////////////////////
// 【引数】
// interval : 時間単位(yyyy︰年、m︰月、d︰日)
// date1 : 日時1
// date2 : 日時2
// 【戻値】
// date2からdate1を引いた日数を求めます。
//////////////////////////////////////////////////
FUNCTION dateDiff(interval, date1, date2)
DIM y1, y2, m1, m2, d1, d2, d
SELECT interval
CASE "yyyy"
GETTIME(0, date1)
y1 = G_TIME_YY
GETTIME(0, date2)
y2 = G_TIME_YY
d = y2 - y1
CASE "m"
GETTIME(0, date1)
y1 = G_TIME_YY
m1 = G_TIME_MM
GETTIME(0, date2)
y2 = G_TIME_YY
m2 = G_TIME_MM
d = (y2 - y1) * 12 + m2 - m1
CASE "d"
d1 = GETTIME(0, date1)
d2 = GETTIME(0, date2)
d = (d2 - d1) / 86400
SELEND
RESULT = d
FEND
//////////////////////////////////////////////////
// 【引数】
// str
// 【戻値】
//
//////////////////////////////////////////////////
FUNCTION dateValue(str)
HASHTBL Pattern
Pattern["year"] = "(190[0-9]|19[1-9][0-9]|[2-9][0-9]{3})"
Pattern["month"] = "(1[0-2]|0?[1-9])"
Pattern["day"] = "([1-2][0-9]|3[0-1]|0?[1-9])"
SELECT TRUE
CASE reTest(str, Pattern["year"] + "/" + Pattern["month"] + "/" + Pattern["day"])
Matches = reExecute(str, Pattern["year"] + "/" + Pattern["month"] + "/" + Pattern["day"])
WITH Matches.Item(0)
date = .SubMatches(0) + "/" + xlTEXT(VAL(.SubMatches(1)), "00") + "/" + xlTEXT(VAL(.SubMatches(2)), "00")
ENDWITH
CASE reTest(str, Pattern["year"] + "年" + Pattern["month"] + "月" + Pattern["day"] + "日")
Matches = reExecute(str, Pattern["year"] + "年" + Pattern["month"] + "月" + Pattern["day"] + "日")
WITH Matches.Item(0)
date = .SubMatches(0) + "/" + xlTEXT(VAL(.SubMatches(1)), "00") + "/" + xlTEXT(VAL(.SubMatches(2)), "00")
ENDWITH
CASE reTest(str, Pattern["month"] + "/" + Pattern["day"])
Matches = reExecute(str, Pattern["month"] + "/" + Pattern["day"])
GETTIME()
WITH Matches.Item(0)
date = G_TIME_YY4 + "/" + xlTEXT(VAL(.SubMatches(0)), "00") + "/" + xlTEXT(VAL(.SubMatches(1)), "00")
ENDWITH
CASE reTest(str, Pattern["month"] + "月" + Pattern["day"] + "日")
Matches = reExecute(str, Pattern["month"] + "月" + Pattern["day"] + "日")
GETTIME()
WITH Matches.Item(0)
date = G_TIME_YY4 + "/" + xlTEXT(VAL(.SubMatches(0)), "00") + "/" + xlTEXT(VAL(.SubMatches(1)), "00")
ENDWITH
CASE reTest(str, "^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-" + Pattern["day"] + "$")
Matches = reExecute(str, "^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-" + Pattern["day"] + "$")
SELECT Matches.Item(0).SubMatches(0)
CASE "Jan"; m = "01"
CASE "Feb"; m = "02"
CASE "Mar"; m = "03"
CASE "Apr"; m = "04"
CASE "May"; m = "05"
CASE "Jun"; m = "06"
CASE "Jul"; m = "07"
CASE "Aug"; m = "08"
CASE "Sep"; m = "09"
CASE "Oct"; m = "10"
CASE "Nov"; m = "11"
CASE "Dec"; m = "12"
SELEND
GETTIME()
date = G_TIME_YY4 + m + Matches.Item(0).SubMatches(1)
SELEND
RESULT = uwscToSerial(GETTIME(0, date))
FEND
//////////////////////////////////////////////////
// 【引数】
// 数値 : GETTIMEで取得した曜日の番号(G_TIME_WW=0:日曜….6:土曜)
// フォーマット : 以下のアルファベットは数値で指定した対応する曜日に置き換えられます。(aaa : 日〜土、aaaa : 日曜日〜土曜日、ddd : Sun〜Sat、dddd : Sunday〜Saturday)
// 【戻値】
// 数値をフォーマットした文字列を返します。
//////////////////////////////////////////////////
FUNCTION getWeekdayName(num, format = "aaa")
DIM re = CREATEOLEOBJ("VBScript.RegExp")
DIM aaa[] = "日", "月", "火", "水", "木", "金", "土";
DIM aaaa[] = "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日";
DIM ddd[] = "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat";
DIM dddd[] = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday";
match = reExecute(format, "(a|d)+")
type = match.Item(0).Value
RESULT = reReplace(format, EVAL(type + "[" + num + "]"), type)
FEND
//////////////////////////////////////////////////
// 【引数】
// シリアル値 : 時間を表すシリアル値を指定
// 【戻値】
// 例)0…00、0.5…12、1.0…24
//////////////////////////////////////////////////
FUNCTION Hour(serial)
RESULT = REPLACE(FORMAT(INT(serial * 24), 2), " ", "0")
FEND
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現で検索した結果をMatchesコレクションとして返します。
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Execute(str)
FEND
//////////////////////////////////////////////////
// 【引数】
// str1 : 置換される文字列
// str2 : 置換後の文字列
// Pattern : 置換する文字列のパターン
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現置換後の文字列
//////////////////////////////////////////////////
FUNCTION reReplace(str1, str2, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Replace(str1, str2)
FEND
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現にマッチするかどうか
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Test(str)
FEND
//////////////////////////////////////////////////
// 【引数】
// inputs : 繰り返す文字列
// multiplier : inputsを繰り返す回数
// 【戻値】
// inputsをmultiplier回を繰り返した文字列を返します
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
DIM res = ""
FOR n = 1 TO multiplier
res = res + inputs
NEXT
RESULT = res
FEND
//////////////////////////////////////////////////
// 【引数】
// serial : シリアル値
// format : フォーマット
// 【戻値】
// 数値を表示書式に基づいて変換した文字列
//////////////////////////////////////////////////
FUNCTION text(serial, format)
HASHTBL startDate
startDate["明治"] = "1868/01/25"
startDate["大正"] = "1912/07/30"
startDate["昭和"] = "1926/12/25"
startDate["平成"] = "1989/01/08"
startDate["令和"] = "2019/05/01"
DIM baseDate = "1899/12/30"
SELECT TRUE
CASE reTest(format, "\[h+\]")
Matches = reExecute(format, "\[(h+)\]")
RESULT = text(Hour(serial), strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE reTest(format, "^h+$")
Matches = reExecute(format, "^(h+)$")
RESULT = text(Hour(serial) MOD 24, strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE reTest(format, "\[m+\]")
Matches = reExecute(format, "\[(m+)\]")
RESULT = text(serial * 1440, strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE format = "m"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_MM, "0")
CASE format = "mm"
GETTIME(serial, baseDate)
RESULT = G_TIME_MM2
CASE format = "n"
GETTIME(serial, baseDate)
RESULT = G_TIME_NN
CASE format = "nn"
GETTIME(serial, baseDate)
RESULT = G_TIME_NN2
CASE format = "s"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_SS, "0")
CASE format = "ss"
GETTIME(serial, baseDate)
RESULT = G_TIME_SS2
CASE format = "yyyy"
GETTIME(serial, baseDate)
RESULT = G_TIME_YY4
CASE format = "yy"
GETTIME(serial, baseDate)
RESULT = COPY(G_TIME_YY4, 3, 2)
CASE format = "e"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 2018
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1988
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1925
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1911
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1867
SELEND
CASE format = "ee"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 2018, "00")
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1988, "00")
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1925, "00")
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1911, "00")
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1867, "00")
SELEND
CASE format = "g"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "R"
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "H"
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "S"
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "T"
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "M"
SELEND
CASE format = "gg"
RESULT = COPY(text(serial, "ggg"), 1, 1)
CASE format = "ggg"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "令和"
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "平成"
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "昭和"
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "大正"
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "明治"
SELEND
CASE format = "mmmmm"
RESULT = COPY(text(serial, "mmmm"), 1, 1)
CASE format = "mmmm"
SELECT text(serial, "m")
CASE 1; RESULT = "January"
CASE 2; RESULT = "February"
CASE 3; RESULT = "March"
CASE 4; RESULT = "April"
CASE 5; RESULT = "May"
CASE 6; RESULT = "June"
CASE 7; RESULT = "July"
CASE 8; RESULT = "August"
CASE 9; RESULT = "September"
CASE 10; RESULT = "October"
CASE 11; RESULT = "November"
CASE 12; RESULT = "December"
SELEND
CASE format = "mmm"
RESULT = COPY(text(serial, "mmmm"), 1, 3)
CASE format = "dd"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_DD2, "00")
CASE format = "d"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_DD, "0")
CASE format = "aaaa"
GETTIME(serial, baseDate)
RESULT = getWeekdayName(G_TIME_WW, "aaaa")
CASE format = "aaa"
GETTIME(serial, baseDate)
RESULT = getWeekdayName(G_TIME_WW, "aaa")
CASE format = "dddd"
GETTIME(serial, baseDate)
RESULT = getWeekdayName(G_TIME_WW, "dddd")
CASE format = "ddd"
GETTIME(serial, baseDate)
RESULT = getWeekdayName(G_TIME_WW, "ddd")
CASE reTest(format, "(0+\.?0+)?%")
Matches = reExecute(format, "(0+\.?0+)?%")
RESULT = text(serial * 100, Matches.Item(0).SubMatches(0)) + "%"
CASE reTest(format, "^\[DBNum\d{1,4}\](.*?)$")
Matches = reExecute(format, "^\[DBNum(\d{1,4})\](.*?)$")
SELECT Matches.Item(0).SubMatches(0)
CASE 1
CASE 2
CASE 3
RESULT = STRCONV(text(serial, Matches.Item(0).SubMatches(1)), SC_FULLWIDTH)
CASE 4
SELEND
CASE reTest(format, "^(.*?)(AM\/PM|am\/pm|A\/P|a\/p)(.*?)$")
Matches = reExecute(format, "^(.*?)(AM\/PM|am\/pm|A\/P|a\/p)(.*?)$")
res = ""
WITH Matches.Item(0)
res = text(serial, .SubMatches(0)) + .SubMatches(1) + text(serial, .SubMatches(2))
ENDWITH
RESULT = res
CASE reTest(format, "([^ymdagehns]{0,})?(([ymdagehns])\3{0,})([^ymdagehns]+)?")
Matches = reExecute(format, "([^ymdagehns]{0,})?(([ymdagehns])\3{0,})([^ymdagehns]+)?")
FOR n = 0 TO Matches.Count - 1
IF n = 0 THEN res = Matches.Item(n).SubMatches(0)
NEXT
FOR n = 0 TO Matches.Count - 1
WITH Matches.Item(n)
res = res + text(serial, .SubMatches(1)) + .SubMatches(3)
ENDWITH
NEXT
RESULT = res
CASE reTest(format, "(0+)\.?(0+)?") AND UBound(SPLIT(format, ".")) <= 1
Matches = reExecute(format, "(0+)\.?(0+)?")
len1 = LENGTH(Matches.Item(0).SubMatches(0))
len2 = LENGTH(Matches.Item(0).SubMatches(1))
DIM arr[] = LENGTH(INT(serial)), len1
IFB POS(".", format) THEN
RESULT = REPLACE(FORMAT(serial, CALCARRAY(arr, CALC_MAX) + len2 + 1, len2), " ", "0")
ELSE
RESULT = REPLACE(FORMAT(serial, CALCARRAY(arr, CALC_MAX)), " ", "0")
ENDIF
SELEND
FEND
//////////////////////////////////////////////////
// 【引数】
// 時間 : 「hh:mm:ss」形式
// 【戻値】
// シリアル値 (例)0…00:00:00、0.5…12:00:00、1…24:00:00
//////////////////////////////////////////////////
FUNCTION timeValue(str)
HASHTBL Pattern
Pattern["hour"] = "(1[0-9]|2[0-4]|0?[0-9])"
Pattern["minute"] = "([1-5][0-9]|60|0?[0-9])"
pattern["second"] = "([1-5][0-9]|60|0?[0-9])"
SELECT TRUE
CASE reTest(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"] + " (AM|PM)")
Matches = reExecute(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"] + " (AM|PM)")
WITH Matches.Item(0)
SELECT .SubMatches(3)
CASE "AM"
time = (.SubMatches(0) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400)
CASE "PM"
time = ((.SubMatches(0) + 12) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400)
SELEND
ENDWITH
CASE reTest(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"])
Matches = reExecute(str, Pattern["hour"] + ":" + Pattern["minute"] + ":" + pattern["second"])
WITH Matches.Item(0)
time = (.SubMatches(0) / 24) + (.SubMatches(1) / 1440) + (.SubMatches(2) / 86400)
ENDWITH
SELEND
RESULT = time
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
//////////////////////////////////////////////////
// 【引数】
// path : ファイルのパス
// 【戻値】
// 重複しないファイル名
//////////////////////////////////////////////////
FUNCTION uniqueFilename(path)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
IFB FSO.FileExists(path) THEN
DIM fol = FSO.GetParentFolderName(path)
DIM filename = FSO.GetBaseName(path)
DIM extension = FSO.GetExtensionName(path)
i = 2
WHILE FSO.FileExists(FSO.BuildPath(fol, filename + " (" + i + ")." + extension))
i = i + 1
WEND
RESULT = FSO.BuildPath(fol, filename + " (" + i + ")." + extension)
ELSE
RESULT = path
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// uwscTime : UWSC時間
// 【戻値】
// シリアル値
//////////////////////////////////////////////////
FUNCTION uwscToSerial(uwscTime)
uwscDate = uwscTime / 86400
RESULT = 36526 + uwscDate
FEND
//////////////////////////////////////////////////
// 【引数】
// num
// format
// 【戻値】
//
//////////////////////////////////////////////////
FUNCTION xlTEXT(num, format)
DIM Excel = CREATEOLEOBJ("Excel.Application")
RESULT = Excel.Evaluate("TEXT(<#DBL>" + num + "<#DBL>, <#DBL>" + format + "<#DBL>)")
FEND
- 結果
- 0:08:16:46
解説
- 1行目
連想配列INFOを宣言します。HASHTBL INFO
- 3行目
FileSystemObjectオブジェクトを作成します。DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
- 5行目
カレントディレクトリに「SYSTEMINFO.csv」というファイル名でCSVファイルを作成する。DIM filename = uniqueFilename(FSO.BuildPath(GET_CUR_DIR, "SYSTEMINFO.csv"))
- 6行目
「SYSTEMINFO.csv」を読み込み/書き込みモードで開く。FID = FOPEN(filename, F_READ OR F_WRITE)
- 7行目
コマンドプロンプトで「systeminfo /FO CSV」を実行し、その結果をファイルに書き込む。FPUT(FID, DOSCMD("systeminfo /FO CSV"))
- 8行目
CSVファイルを閉じる。FCLOSE(FID)
- 10行目
「SYSTEMINFO.csv」を読み込み/書き込みモードで開く。FID = FOPEN(filename, F_READ OR F_WRITE)
- 11-13行目
1行目に項目、2行目に値が書かれているので、INFO[項目]に値を格納する。FOR col = 0 TO 33 INFO[FGET(FID, 1, col)] = FGET(FID, 2, col) NEXT
- 14行目
CSVファイルを閉じる。FCLOSE(FID)
- 16行目
CSVファイルを削除する。FSO.DeleteFile(filename)
- 18行目
「システム起動時間」をstartupに代入する。DIM startupTime = INFO["システム起動時間"]
- 19行目
時間を小数表記にする。date1 = dateValue(startupTime) + timeValue(startupTime)
- 20行目
UWSC時間をシリアル時間に変換する。date2 = uwscToSerial(GETTIME())
- 21行目
小数表記から時間表記にする。PRINT INT(date2 - date1) + ":" + text(date2 - date1, "hh:mm:ss")
ブラウザのプロセスを終了させる
DIM arr[] = "iexplore.exe", "firefox.exe", "chrome.exe", "opera.exe", "msedge.exe"
FOR item IN arr
PRINT DOSCMD("taskkill /F /IM " + item + " /T")
NEXT
解説
- 1行目
ブラウザのイメージ名を配列に格納。DIM arr[] = "iexplore.exe", "firefox.exe", "chrome.exe", "opera.exe", "msedge.exe"
- 3-5行目
コマンドプロンプトでブラウザのプロセスを終了させる。FOR item IN arr PRINT DOSCMD("taskkill /F /IM " + item + " /T") NEXT
Outlookが起動していなかったら起動する
IF GETID(, "rctrl_renwnd32") = -1 THEN DOSCMD("start outlook")
接続したことあるWi-FiのSSIDとパスワードを取得
DIM str = DOSCMD("netsh wlan show networks")
DIM Matches_SSID = reExecute(str, "SSID \d+ : (.*?)\r\n")
FOR n = 0 TO Matches_SSID.Count - 1
DIM SSID = Matches_SSID.Item(n).SubMatches(0)
str = DOSCMD("netsh wlan show profiles name=" + SSID + " key=clear")
PRINT "SSID<#TAB><#TAB>" + SSID
Matches_Pass = reExecute(str, "主要なコンテンツ : (.*?)\r\n")
IFB Matches_Pass.Count <> 0 THEN
PRINT "パスワード<#TAB>" + Matches_Pass.Item(0).SubMatches(0)
ELSE
PRINT "パスワード<#TAB>"
ENDIF
PRINT "-----"
NEXT
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻値】
// 正規表現で検索した結果をMatchesコレクションとして返します。
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Execute(str)
FEND
Google Chromeのバージョンを取得する
PRINT DOSCMD("DIR /B /O-N <#DBL>C:\Program Files (x86)\Google\Chrome\Application<#DBL> | FINDSTR <#DBL>^[0-9].*¥>")
- 結果
- 83.0.4103.116
Firefoxのバージョンを取得する
PRINT REPLACE(DOSCMD("<#DBL>C:\Program Files\Mozilla Firefox\firefox.exe<#DBL> -v | more"), "Mozilla Firefox ", "")
- 結果
- 77.0.1