(for Internet Explorer)
← ▼ ▲
↑
その他
→ GetOSVersion
→ SetTaskStartTime
→ 送る、に登録する
タスクに登録する
← ▼ ▲
ネットワーク
→ DownloadByHttp
インターネットからダウンロードします。
→ CheckWSHNetwork
ファイアウォールをチェックします。
→ SetVirtualFileServer
仮想ファイル・サーバーを設定します。
→ GetPercentURL
% 文字を使った正規の URL に変換します。
ホームページを開きます。
→ start
他にもあります。左のツリーから選択してください。
← ▼ ▲
DownloadByHttp
Sub DownloadByHttp( DownloadURL as string, OutLocalPath as string )
インターネットからダウンロードします。
【引数】
DownloadURL
OutLocalPath
ダウンロードする URL、または、その配列
ダウンロードしたファイルの保存先パス
デフォルトでは、Sage Plaisir 21 のホームページからダウンロードするときのみ、
ユーザーの許可を確認することなくダウンロードできます。 他のホームページ
からダウンロードするときは、ユーザーの許可を求められます。
他のホームページからダウンロードする処理を含むスクリプトを使って自動化する
ときは、ユーザーの許可を求めない exe を作成する必要があります。 デフォルト
では、ダウンロードを実際に行うのは、scriptlib\vbslibXXX\sage_p_downloader に
入っている sage_p_downloader.exe ですが、_src\Test\vbslib_test\scriptlib\
vbslib\sage_p_downloader\src にソースが含まれているので、
修正は簡単です。 ソースに記述されたダウンロードできるドメインを
変更し、再コンパイルし、exe 名を変更して、Netword.vbs にある DownloadByHttp
の定義を編集してください。 exe 名を変更することで、ウィルス対策ソフトが
ネットワークアクセスの許可を再度行います。
→ T_Download.vbs
テスト
DownloadByHttp "http://www.sage-p.com/index.html", "index.html"
関連
→ SetVirtualFileServer
→ GetPercentURL
DownloadURL には、URL に含むことができない文字も含むことができます。
内部で、GetPercentURL を呼び出しています。
ダウンロードを含む処理をするときは、SetVirtualFileServer を使えば、実際に
ネットワークにアクセスする前に、ローカル PC だけで動作確認ができます。
sage_p_downloader.exe
キーワード：
→ SetVirtualFileServer
ソース
サンプル
→ Network.vbs
DownloadURL 引数が配列のときは、OutLocalPath はフォルダーのパスになります。
DownloadURL 引数が配列のときは、実行後は、DownloadURL 配列の内容が、
保存先のファイルのパスに置き換わります。
T_SetVirtualFileServer
T_SetVirtualFileServer_Files
T_SetVirtualFileServer_Files_Manually
参考
→ src フォルダー
sage_p_downloader.exe のソース
← ▼ ▲
SetVirtualFileServer_byXML
Sub SetVirtualFileServer_byXML( SettingXML_Path as string )
SetVirtualFileServer
による仮想ファイル・サーバーの設定を XML ファイルで行います。
【引数】
SettingXML_Path
仮想ファイル・サーバーの設定がある XML ファイル、または、Empty
SetVirtualFileServer_byXML GetVar("%VirtualServer%")
サンプル
GetVar
環境変数 VirtualServer が定義されていれば、その値を XML ファイルのパスとして設定します。
定義されていなければ、仮想ファイル・サーバーを使いません。
SettingXML_Path = Empty のときは、仮想ファイル・サーバーを使わないようになります。
既に仮想ファイル・サーバーが登録されていたときも、その登録は解除されます。
ソース
テスト
XML ファイルの例
<VirtualFileServer>
<Replace from="http://www.sage-p.com/" to="http://www.sage-p.com/test/" />
<Replace from="http://www.sage-p.com/files/" to="C:\www_sage-p_com\files\" />
<Replace from="http://www.sage-p.com/download"/>
</VirtualFileServer>
キーワード：
VirtualServer, TestServer
Replace/@from
SetVirtualFileServer
の VirtualURL 引数に渡す値
Replace/@to
の LocalOrOtherPath 引数に渡す値。
SetVirtualFileServer
省略時は、Empty を渡します。
これまで登録されていた仮想ファイル・サーバーの設定は登録解除されます。
→ T_Download.vbs
T_SetVirtualFileServer_byXML
→ Network.vbs
→ SetVirtualFileServer
参考
← ▼ ▲
SetVirtualFileServer
Sub SetVirtualFileServer( VirtualURL as string, LocalOrOtherPath as string )
ネットワーク・サーバーの代わり（仮想ファイル・サーバー）を設定します。
【引数】
VirtualURL
LocalOrOtherPath
仮想ファイル・サーバーが応答するベース URL
VirtualURL に対応するローカルのパス、または URL
SetVirtualFileServer を使うと、
DownloadByHttp
を呼び出しても、インターネットからダウン
ロードせず、設定したローカル・フォルダからコピーするか、別の URL からダウンロードします。
この機能により、一般公開されているサーバーを変更しないでテストができます。
SetVirtualFileServer "http://www.sage-p.com/", "C:\www_sage-p_com\"
DownloadByHttp "http://www.sage-p.com/index_test.html", "index.html"
ソース
サンプル
→ Network.vbs
通常、VirtualURL の最後が、/ なら、LocalPath の最後は \ または / にしてください。
既に仮想ファイル・サーバーが登録されているときに呼び出すと、追加登録されます。
LocalOrOtherPath = Empty を指定すると、VirtualURL の URL に対して、仮想ファイル・サーバーを
使わないようになります。
VirtualURL = Empty を指定すると、すべての仮想ファイル・サーバーを使わないようになります。
→ DownloadByHttp のテスト
テスト
LocalOrOtherPath は、ローカル PC にあるフォルダーのパス、または、別の URL を指定します。
LocalOrOtherPath に "://" があると、別の URL が指定されたとして、ダウンロードします。
関連
→ SetVirtualFileServer_byXML
← ▼ ▲
次の文字（特殊な予約文字）は、区切り文字や予約文字ではなくすために、% にエスケープします。
・[ ] @ // RFC3986 の gen-delims
・ただし、query と fragment の @ は、エスケープしません。
・! $ & ' ( ) * + , ; = // RFC3986 の sub-delims。
・ただし、query と fragment の sub-delims は、エスケープしません。
・% < > // RFC3986 にはあるが、reserved になっていない予約文字
GetPercentURL
Function GetPercentURL( UnicodeURL as string ) as string
基本的な URL の区切り文字（:/?#）以外の予約文字を、% 文字を使った URL にエンコードします。
【引数】
UnicodeURL
基本的な URL の区切り文字だけを考慮した URL
返り値
実際に URL に使える文字だけを使った URL
url = GetPercentURL( "http://www.sage-p.com/download file.zip" )
url は、 "http://www.sage-p.com/download%20file.zip" になります。
2
!
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
1
0
3
4
5
6
7
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
9
8
7
6
5
4
3
2
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
CR
LF
6
5
4
3
0
1
2
7
spc
URLに使える文字 RFC 3986
→ Uniform Resource Identifier (URI): Generic Syntax (Web)
参考
RFC1738-ja, RFC 2396
Windows のフォルダー区切り文字 \（バックスラッシュ） は、通常、URL にするときに / に
置き換えますが、URL では定義されていません。
fooooooo://example.com:8042/over/there?name=ferret#nose
(scheme) ( authority )( path ) ( query ) ( fragment )
→ RFC 3986 - 3. Syntax Components (Web)
サンプル
ソース
→ Network.vbs
→ ConvertCharCodeInHref
関連
テスト
→ T_Download.vbs
T_GetPercentURL
→ URIに使ってよい文字の話 - 本当は怖い情報科学 (Web)
→ ECMAScript - encodeURIComponent
URL の仕様に出てこない文字（使えない文字 "^\{|}）
URL が使う一般的な予約文字 (gen-delims :/?#[]@)
URL が文字として使う文字 (unreserved A0-._~)
→ RFC 3986 - Appendix A. Collected ABNF for URI (Web)
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
authority = [ userinfo "@" ] host [ ":" port ]
host = IP-literal / IPv4address / reg-name
reg-name = *( unreserved / pct-encoded / sub-delims )
path-abempty = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-rootless = segment-nz *( "/" segment )
segment = *pchar
segment-nz = 1*pchar
query = *( pchar / "/" / "?" )
fragment = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
ALPHA = アルファベット
DIGIT = 数字
HEXDIG = 16進数の数字。 (Hex Digit)
参考
pct = percent, gen = general, delims = delimiters
→ ABNF 記法
以下に RFC 3986 の一部を示す。
RFC 3986 に基づいて URL (URI) に使える/使えない文字は、以下の通りです。
特殊な URL の予約文字 (sub-delims !$&'()*+,;=)
RFC 3986 では、unreserved と sub-delims が常に選択できる。
URL で定義がない予約文字（使えない文字 %<>）
Using <> angle brackets around each URI is especially recommended as
a delimiting style for a reference that contains embedded whitespace.
% は、pct-encoded の定義内で使われています。
< と > は、URL を囲む文字として使うことが推奨されています。 つまり、URL では使えません。
→ 情報セキュリティ技術動向調査（2009 年下期）：IPA (Web)
9 URI のエスケープ - RFC 3986 は、unreserved が減っていて読みにくくなる
（予約文字を踏まえずに多くの標準ができている身勝手な標準化委員への愚痴？）
本関数は、基本的な URL の予約文字 : / ? # はそのまま残し、それ以外の（特殊な）予約文字は
% 文字を使った文字列にエスケープします。 URL の ?query の部分の = と & は、クエリー文字列
のため、エスケープしません。 それ以外の部分の = と & は、エスケープします。
次の文字（基本的な予約文字）は、区切り文字として、エスケープしません。
・: / ? # // RFC3986 の ABNF のトップの定義にある gen-delims
ただし、最初の # より後の # はエスケープします。
詳細
基本的な予約文字で区切られた、それぞれの部分文字列（ファイル名、フォルダー名、URL の後の
ほうにある ?query の各変数の値や #fragment の部分） は、基本的な予約文字も含めてすべて
エスケープする必要があるので、本関数とは別の関数を使うとよいでしょう。
IDN、国際化ドメイン名、日本語ドメイン名
→ 国際化ドメイン名 - Wikipedia (Web)
→ Punycode
→ Punycode - Wikipedia (Web)
ドメイン名の区切り（ピリオド）ごとに、Punycode 変換を行う。
→ URLエンコード （% 表記）
${ } 変数
空白は + ではなく %20 に置き換えます。 Google でも正常に動きます。 + は、Google の検索
キーワードに入れるため %2B に置き換えます。
→ 検索キーワードの空白は +
次の文字は、RFC 3986 では明確にされていないため、% にエスケープします。
・Ascii 以外の文字 （漢字、Unicode 文字）
・" ^ { | } // \ 以外の RFC3986 で定義されていない文字、空白と制御文字
は展開しません。 文字 $, {, } がエスケープされます。 ${> } 変数の定義は不要です。
次の文字（英語の一般の文字）は、URL でも使えるので、エスケープしません。
・アルファベット、数字
\ 文字は、URL のフォルダー区切り記号 / に変換します。 RFC 3986 では明確にされていません。
・\
エンコードの詳細
\ 文字は、URL のフォルダー区切り記号 / に変換します。 戻すときに \ か / のどちらであるか
→ CGIのパラーメータつきURL (?), query
参考
特殊な予約文字を返り値に含める（予約文字として使う）ときは、"${>" と "}" の間に埋め込んで
ください。 "${>" と、それに続く "}" は無くなります。
scheme, hier-part でエスケープ
上記の補足を踏まえて、文字ごとにまとめると、以下のようになります。
query の中にある sub-delims の文字は、クエリー文字列として有効にするため、エスケープしま
せん。 query の中の : / ? @ は、gen-delims ではありません。
fragment の中にある sub-delims の文字は、RFC 3986 では区切り文字ではないため、エスケープ
しません。 また、fragment の中の : / ? @ は、gen-delims ではありません。
GetPercentURL 関数 (vbsliib)
scheme, hier-part, query, fragment でエスケープ
→ 詳細
"${>" と "}" の間の文字は、どんな文字でもエスケープせず、"${>" とそれに続く "}" が
無くなります。 その後、$\ は $ に変換されます。 （最優先）
未対応
未対応
% 文字を使うようにエンコードした文字列は、% とそれに続く 2 文字（UTF-8 の16進数）を、
対応する 1 文字に変換するだけでデコードできます（戻ります）。 ただし、エンコード時に、
% も %25 に変換しておかなければ、デコードしても戻らなくなります。
% は１バイトしか変換できないので、文字コード セットの情報が別に無ければ、Ascii 以外の文字を
デコードしても戻らなくなります。 一般にUTF-8 が使われますが、Ascii 以外の文字に対して
UTF-16 より効率が悪い UTF-8 を使うのは、よく考えていないのでしょう。 2バイト文字は、
9バイト(UTF-8)、6バイト(UTF-16、Shift-JIS)になります。 つまり、4.5倍と3倍です。
(UNC)
は分からなくなります。 Windows のパス
に使うなどの状況で判断してください。
未対応
→ DecodePercentURL
→ Punycode
は、% と文字コードではなく、Punycode に変換します。
国際化ドメイン名
国際化ドメイン名（Punycode）
は、2〜3倍に収まります。（本関数ではこの変換はしません）
← ▼ ▲
DecodePercentURL
Function DecodePercentURL( in_URL as string ) as string
% 文字を使った URL から、Unicode 文字を使った URL にデコードします。
【引数】
in_URL
% 文字を使った URL
返り値
Unicode 文字を使った URL
→ GetPercentURL
関連
ソース
→ vbslib.vbs
テスト
→ T_Download.vbs
T_GetPercentURL
← ▼ ▲
LockByFileMutex
Function LockByFileMutex( UNC_FilePath as string, TimeOut_msec as integer ) as FileMutexClass
ファイル・サーバーに対する排他制御を開始します。
【引数】
UNC_FilePath
排他制御を管理するファイルのパス
TimeOut_msec
タイムアウト（ミリ秒）、または、c.Forever
Set c = g_VBS_Lib
Set mutex = LockByFileMutex( "\\PC01\Folder\_Mutex.txt", c.Forever ) '// ロック開始
...
mutex = Empty '// ロック終了
ソース
サンプル
FileMutexClass
LockByFileMutex 関数の返り値です。
FileMutexClass のオブジェクトが削除されると、ロック状態を解除します。
Close メソッド（引数なし）を呼び出しても解除できます。
UNC_FilePath に、ファイル・サーバー、または、ローカルのファイルのパスを指定
してください。
指定したファイルには、ロックしているユーザー名 %USERDOMAIN%\%USERNAME%
（例：PC01\User1）が上書きされ、書き込み禁止、読み込み許可状態になります。
ロック状態を解除したら、ファイルを削除します。
→ T_FileMutex_Manually.vbs
テスト
→ Network.vbs
→ FileMutexClass
ロック状態を保持しているオブジェクト
返り値
← ▼ ▲
CheckWSHNetwork
→ CheckWSHNetwork フォルダ
WSH (wscript.exe, cscript.exe) に、ファイアウォールがネットワークアクセスを許可しているか
どうかをチェックするスクリプトです。
cscript.exe または wscript.exe に、ネットワークアクセスを許可すると危険かもしれませんが、
Windows7 のファイアウォールは、WSH によるネットワークアクセスをブロックしないで
実行できます。 （ダウンロードサーバーのドメインで識別するのかもしれません？）
CheckWSHNetwork.vbs をダブルクリックすると起動します。
← ▼ ▲
vbs_inc, vbslib include （vbslib のコア・システム）
vbs_inc.vbs
vbs_inc_setting.vbs
scriptlib
main
sample_lib
sample
vbs_inc ライブラリ本体
設定フォルダ
インクルードするライブラリのサンプル
メイン・スクリプト （vbslib includeを含む）
は、インクルードの方向
scriptlib フォルダの中の vbs_inc.vbs ファイルの中にあり、内部的に使われます。
→ g_vbslib_path
→ g_fs
→ g_sh
g_sh = WScript.CreateObject("WScript.Shell")
g_fs = CreateObject( "Scripting.FileSystemObject" )
vbs_inc.vbs のフル・パス
→ グローバル変数の初期化、g_InitializeModule
→ g_debug
デバッガに接続しているかどうか（するかどうか）
→ g_IncludePathes
インクルードする VBS ファイルのパスの配列
→ g_CommandPrompt
コマンドプロンプトで実行するかどうか
→ g_vbslib_folder
scriptlib フォルダのフル・パス。末尾に \ が付く
setting
vbs_inc の設定
→ Setting_getIncludePathes
Setting_getIncludePathes 関数
に書かれた .vbs ファ
vbs_inc は、次のグローバル変数を定義しています。
→ ライブラリ.vbs のルール
[ テスト ]
→ g_admin
起動時に管理者へログインするのかしないのか
複数の VBScript ファイルをインクルードするライブラリです。
→ g_is_cscript_exe
コマンドライン(cscript.exe)で実行しているかどうか
→ g_cut_old
古い関数でブレークするようにします。
→ g_Vers
バージョン番号の集合です。
→ g_vbslib_ver_folder
vbs_inc.vbs があるフォルダのフル・パス。末尾に \ が付く
→ g_debug_params
デバッガに接続するときのコマンドライン・パラメータ
→ vbs_inc/setting の処理フロー、終了時の動作
参考
Main 関数
があるスクリプト・ファイルに、vbs_inc をインクルードするコード（vbslib include
Short Hand Prompt
を使って新規作成できるスクリプトなど
vbslib
→ Main 関数
）が必要です。 そのコードは、
に入っているので参考にしてください。
vbslib include は、scriptlib\setting フォルダーの中にある .vbs ファイル（通常、
vbs_inc_setting.vbs） に書かれた
イルをロードします。
→ vbs_inc.vbs
関連
→ WriteVBSLibFooter
← ▼ ▲
vbs_inc.vbs
vbs_inc.vbs には、インクルードする vbslib のバージョンや、vbslib が入っているフォルダーを
選択して、vbslib をインクルードするスクリプトが書かれています。
g_vbslib_folder = g_fs.GetParentFolderName( g_vbslib_folder )
g_vbslib_folder = g_vbslib_folder + "\src\samples\scriptlib\"
g_vbslib_path = g_vbslib_folder +"vbs_inc.vbs"
vbslib が入っているフォルダーを変更するときは、上記の変数の設定（再設定）だけでなく、
g_vbslib_path 変数
も再設定してください。
インクルードする前に、次の変数に値を代入しておいてください。
メイン.vbs
からインクルードされます。
vbs_inc.vbs は、
g_vbslib_path 変数
g_Vers.Item("vbslib")
vbs_inc.vbs の中で次の変数を設定（再設定）してください。
g_Vers.Item("vbslib")
g_vbslib_folder 変数
サンプル
← ▼ ▲
メイン.vbs のグローバル変数
メイン・スクリプトのグローバル変数は、start of lib include 〜 end of lib include
の間にある、設定値を格納する場所で Dim/New してください。
Dim g_Test
Function InitializeModule
Set g_Test = New TestScript
End Function
Dim g_InitializeModule
Set g_InitializeModule = GetRef( "InitializeModule" )
'--- start of vbslib include -----------------------------
：
'--- start of parameters for vbslib include -------
：
g_CommandPrompt = 1
Dim g_ObjectA : Set g_ObjectA = New ObjectA
'--- end of parameters for vbslib include --------------
：
'--- end of vbslib include -------------------------------
ライブラリ・スクリプトのグローバル変数は、グローバル領域で Dim して、
InitializeModule 関数の中で初期化します。
g_InitializeModule に InitializeModule 関数のリファレンスを設定します。
'--- start of vbslib include -----------------------------
：
'--- start of parameters for vbslib include -------
'--- end of parameters for vbslib include --------------
：
'--- end of vbslib include -------------------------------
→ グローバル変数の初期化、後始末、g_InitializeModule、g_FinalizeModule
← ▼ ▲
AppKey.SetWritableMode F_IgnoreIfWarn
SetWritableMode
[WARNING] Out of Writable の警告が大量に出るときは、main2 の最初に次を記述してください。
main 関数を
main2
に置き換える。 元の main 関数は、コメントアウトする。
vbslib_updater - vbslib をバージョンアップする
vbslib ヘッダ
にあるファイルをベースに vbslib フォルダを vbslib ヘッダに作成する。
g_IncludeType を、コメントアウトする。
vbslib_updater
下記の作業を自動的に行います。 ただし、手動で修正が必要な場合もあります。
一部の関数は、廃止されても移植性のために残してあるものがあります。
True に設定して、廃止される関数を呼び出すとブレークするので、見つけやすくなります。
バージョンアップを補助する
というツールを提供しています。
g_Vers
を追加し vbslib のバージョンを 3.0 に設定する。
vbslib ヘッダがある *.vbs ファイルに
g_cut_old
を
vbslib_updater ツール
アプリケーション・スクリプトの修正
scriptlib フォルダの ver2 と ver3 の共存
ver2 の scriptlib フォルダの vbs_inc.vbs を vbs_inc_200.vbs に改名し、
ver3 の scriptlib フォルダを ver2 の scriptlib フォルダにコピーすると、
上書きすることなく、ver2 と ver3 を共存できます。
← ▼ ▲
Main （メイン.vbs）
Sub Main( Opt as dictionary, AppKey as AppKeyClass )
vbslib を使うスクリプトは、Main から内容を記述します。
Sub Main()
echo "Hello, world!"
End Sub
'--- start of vbslib include ------------------------------
： （vbslib をインクルードして main を呼び出すコード）
： （既存のメイン・スクリプトを参照してください）
ユーザ定義関数です。
引数はあってもなくてもかまいませんが、ファイルに出力するスクリプトは、
Main 関数が呼ばれるときのカレント・フォルダーは、スクリプトがあるフォルダー
になります。 WSH を起動したときのカレント・フォルダー（作業フォルダー）は、
に入っています。
g_start_in_path
Sub Main()
テスト
→ T_NewMain1 フォルダ
→ T_NewMain2 フォルダ
vbslib_inc のみの環境
vbslib がある環境
NewWritable メソッド
を呼ぶ必要があります。
AppKey 引数を使った
Sub Main( Opt, AppKey )
Dim w_:Set w_=AppKey.NewWritable( "." ).Enable()
echo "Hello, world!"
End Sub
'--- start of vbslib include ------------------------------
： （vbslib をインクルードして main を呼び出すコード）
： （既存のメイン・スクリプトを参照してください）
NewWritable
にファイルを出力できるようにする
カレント・フォルダー
↓
サンプル
サンプル
main2 関数が定義されているときは呼ばれません。
vbslib include
vbslib include
Main 関数を定義しているスクリプト・ファイルの中に、
（vbslib をインクルードして Main を呼び出すコード）が必要です。
その内容は、既存のメイン・スクリプト（vbslib Prompt.vbs など）を参照してください。
vbslib include
のコード
関連
→ GetMainSetting 関数 (vbsool)
参考
→ 処理フロー （vbs_inc/setting）
Main 関数の外側の動き
<< vbs_inc
→ WriteVBSLibFooter
→ SetupVbslibParameters
←
↓