←
▼
▲
Function SetXmlAttribute( BaseXmlElement as IXMLDOMElement, XPathForXmlElement as string,
AttrName as string, AttrValue as string ) as boolean
XML 属性の値を変更します。
【引数】
BaseXmlElement
XPathForXmlElement
XPathForXmlElement の基準となる XML要素(タグ)
属性を変更する XML 要素(タグ) への XPath または Empty
返り値
変更後の XML 属性の値、""=値なし、Empty=属性を削除する
AttrValue
変化があったかどうか
(src)
サンプル:
→ setAttribute (IXMLDOMElement)
参考
Dim b, is_change
Dim root : Set root = LoadXML( "in.xml", Empty ) '// as IXMLDOMElement
b= SetXmlAttribute( root, "./Tag1", "attr1", "1234" )
is_change = is_change or b
If is_change Then root.ownerDocument.save "out.xml"
1234
attr1
Tag1
SetXmlAttribute
テスト
→ T_XML.vbs # T_SetXmlAttribute
XML 属性の名前
AttrName
XPathForXmlElement に該当する XML 要素が複数あったときは、すべての XML 要素の属性を変更
します。
XPathForXmlElement に該当する XML 要素が無かったときは、XML 要素を追加します。
廃止されました。
←
▼
▲
Function XmlRead( BaseXmlElement as IXMLDOMElement, XPath as string ) as string
XML のタグの間のテキスト、または XML の属性の値を変更します。
【引数】
BaseXmlElement
XPath
XPath の基準となる XML要素(タグ)
タグの間のテキスト、または XML の属性の位置を表す XPath
返り値
(src)
テキストまたは XML 属性の値。文字列型
タグの間のテキストは、厳密には XPath = "/Root/Elem/text()" ですが、XPath = "/Root/Elem"
を指定してください。
XPath に指定したタグ(XML要素)やXML属性が存在しないときは、Empty を返します。
参考
テスト
→ T_XML.vbs # [T_XmlRead]
→ getAttribute (IXMLDOMElement)
サンプル
Dim root : Set root = LoadXML( "in.xml", Empty ) '// as IXMLDOMElement
value = XmlRead( root, "./Tag1/@attr1" )
Tag1/@attr1
XmlRead
←
▼
▲
Function GetXmlAttribute( BaseXmlElement, XPathForXmlElement, AttrName )
XML 属性の値を返します。
【引数】
BaseXmlElement
XPathForXmlElement
XPathForXmlElement の基準となる XML要素(タグ)
属性を変更する XML 要素(タグ) への XPath または Empty
返り値
XML 属性の値、文字列型のみ、Empty=属性なし
XML 属性の名前
AttrName
(src)
サンプル:
参考
Dim root : Set root = LoadXML( "in.xml", Empty ) ' as IXMLDOMElement
value = GetXmlAttribute( root, "./Tag1", "attr1" )
attr1
Tag1
GetXmlAttribute
テスト
→ T_XML.vbs # [T_GetXmlAttribute]
→ getAttribute (IXMLDOMElement)
廃止されました。
←
▼
▲
書きかけ
テスト
→ T_XML.vbs # T_XmlSelect
Function XmlSelect( BaseXmlElement as IXMLDOMElement, XPath as string ) as IXMLDOMElement
XML のタグのハンドルを返します。 もし、該当する XML のタグが無ければ生成して返します。
【引数】
BaseXmlElement
XPath
XPathForXmlElement の基準となる XML要素(タグ)
XML 要素(タグ)の位置を表す XPath
返り値
XML 要素(タグ)
←
▼
▲
(src)
Sub XmlWriteEncoding( RootXmlElement as IXMLDOMElement, CharSet as string )
XML ファイルの文字コードを指定します。
【引数】
BaseXmlElement
CharSet
ルートの XML要素(タグ)
文字コード
テスト
→ T_XML.vbs # T_XmlWrite
←
▼
▲
Function XmlAttrDic( XmlElem as IXMLDOMElement ) as dictionary of string
XML 要素(タグ)の属性を、辞書にします。
【引数】
XmlElem
XML 要素
キーが属性名、アイテムが属性値の辞書
vbslib
モジュール・シンボル:
返り値
→ T_XML.vbs # [T_XmlAttrDic]
テスト
(src)
←
▼
▲
Function GetXPath( DOMObject as IXMLDOMElement, ShowAttrs as string ) as string
XML の DOM オブジェクトがある場所を表す XPath を返します。
【引数】
DOMObject
IXMLDOMElement または IXMLDOMAttribute
Empty、または、XPath に含める XML 属性、またはその配列
ShowAttrs
(src)
DOMObject が IXMLDOMAttribute のときは、ルート XML 要素からのパスは含まれません。
サンプル
Dim node
Dim root : Set root = LoadXML( "sample.xml", Empty ) ' as IXMLDOMElement
'// GetXPath( root, Empty ) = "/Root"
node = root.selectNodes( "/Root/Test1", Empty )
'// GetXPath( node(0) ) = "/Root/Test1"
node = root.selectNodes( "/Root/Test2/@id", Empty )
'// GetXPath( node(0) ) = "@id"
node = root.selectNodes( "/Root/Test2[@id='1']/Sub", Array("id","attr") )
'// GetXPath( node(0) ) = "/Root/Test2[@id='1' and @attr='a']/Sub"
テスト
→ T_XML.vbs # [T_XPath]
XPath
返り値
参考
→ XPath
←
▼
▲
Function ChangeToXml( XML as string or object ) as IXMLDOMElement
XML 文字列などを、XML 要素オブジェクトに変換します。
IXMLDOMElement
参考
(src)
・XML が記述された文字列
などで取得した
IXMLDOMElement
引数に指定できるものは、次のものがあります。
・
・ParentProcess や ChildProcess
XML ファイルをロードする
←
▼
▲
Dim base, x
Set base = GetHRefBase( "sample.xml", Array("X") )
Set x = base.href( "target.xml#name1" )
Assert x.getAttribute( "name" ) = "name1"
sample.xml
<Root>
<A href="target.xml#name1">Link</A>
</Root>
target.xml
<Root>
<X name="name1"/>
</Root>
Function GetHRefBase( BasePath as string, TargetTagNames as array of string ) as HRefBase
HTML の A href のようなリンクを取得するためのオブジェクトを返します。
【引数】
BasePath
基準となる XML ファイルのパス
TargetTagNames
リンク先となる id, name 属性を持つタグの名前の配列
リンクを取得するためのオブジェクト
返り値
サンプル
関連
"sample.xml"
"target.xml#name1"
"target.xml#name1"
循環参照検出あり
テスト
→ T_XML.vbs # [T_HRefBase]
(src)
"X"
←
▼
▲
Function HRefBase::href( URL as string ) as IXMLDOMElement
HTML の A href のようなリンクのリンク先となる XML タグを取得します。
【引数】
URL
リンク先のURL
リンク先の XML タグ
返り値
参考
他の XML ファイルへのリンクがあるときは、内部で自動的に LoadXML が呼ばれます。
(src)
HRefBase オブジェクトの取得
こともできます。
リンク先が見つからないときはエラーになります。
IXMLDOMElement
関連
→ getElementById (HTMLDocument)
←
▼
▲
データ構造
.SourceXmlPath as string
.SourceXmlRootElem as IXMLDOMElement
.TargetXmlPath as string
.TargetXmlRootElem as IXMLDOMElement
リンク元の XML ファイルのパス
SourceXmlPath のルート XML タグ
リンク先の XML ファイルのパス
TargetXmlPath のルート XML タグ
リンク先になれるタグ名の配列
HTML の A href のようなリンクのリンク先となる XML タグを取得します。
他の XML ファイルへのリンクがあるときは、内部で自動的に LoadXML が呼ばれます。
リンク先のリンク先が、循環参照しているかどうかを検出することもできます。
Dim root, a, x
Set root = LoadXML( "sample.xml", Empty )
Set a = root.selectSingleNode( "./A" ) '// A タグ
Dim linker : Set linker = new LinkedXMLs
linker.XmlTagNamesHavingIdName = Array( "X" )
linker.StartNavigation "sample.xml", root
Set x = linker.GetLinkTargetNode( "target.xml#name1" ) '// X タグ
linker.EndNavigation
sample.xml
スクリプト
<Root>
<A href="target.xml#name1">Link</A>
</Root>
target.xml
<Root>
<X name="name1"/>
</Root>
"sample.xml"
"X"
"target.xml#name1"
"sample.xml"
他の XML ファイルへのリンクがあるときは、内部で LoadXML が呼ばれ、返される XML
ルートタグは、内部にキャッシュされます。 最新の情報に更新するとき(キャッシュを
クリアするとき)は、LinkedXMLs オブジェクトを再生成してください。
(src)
←
▼
▲
getLinkTargetNode メソッドでリンク先にできる XML のid 属性や name 属性を持つ XML タグ名の配列。
Set linker = new LinkedXMLs
linker.XmlTagNamesHavingIdName = Array( "TestCases", "TestCase", "SubCase" )
サンプル
<A href="#name1">1</A> <A href="#name2">2</A> <A href="#name3">3</A>
<TestCases id="name1"/> <TestCase name="name2"/> <Others id="name3"/>
XmlTagNamesHavingIdName に指定した名前を持つタグにリンクすることができます。
下記の A href のうち、name1, name2 はリンク先が見つかりますが、name3 は見つかりません。
Dim LinkedXMLs::XmlTagNamesHavingIdName as string
"TestCases", "TestCase", "SubCase"
←
▼
▲
Sub LinkedXMLs::StartNavigation( SourceXmlPath as string, SourceXmlRootElem as IXMLDOMElement )
(src)
現在の XML ファイルの情報を指定します。
【引数】
SourceXmlPath
SourceXmlRootElem
現在の XML ファイルのパス。相対パスでも可能
SourceXmlPath のファイルのルート XML タグ (下記)
SourceXmlRootElem 引数
初めてリンク先を探すときは、LoadXML の返り値を指定します。
リンク先の更にリンク先を探すときは、LinkedXMLs::TargetXmlRootElem を指定します。
←
▼
▲
(src)
Sub LinkedXMLs::EndNavigation()
で指定した現在の XML ファイルの終了を指定します。
←
▼
▲
(src)
Function LinkedXMLs::GetLinkTargetNode( TargetLocation as string ) as IXMLDOMElement
リンク先となる XML タグを取得します。
【引数】
TargetLocation
返り値
リンク先のパス。 target.xml#name 形式
リンク先のタグ
本関数が成功すると、Me.TargetXmlPath(リンク先の XML ファイルのパス)と、
Me.TargetXmlRootElem (TargetXmlPath のルート XML タグ)も更新されます。
StartNavigation をネストしていくと、GetLinkTargetNode で、循環参照エラーを検出できます。
linker.StartNavigation "sample.xml", root
Set a = linker.GetLinkTargetNode( "#a" )
linker.StartNavigation linker.TargetXmlPath, linker.TargetXmlRootElem
Set b = linker.GetLinkTargetNode( "#b" )
linker.StartNavigation linker.TargetXmlPath, linker.TargetXmlRootElem
Set a2 = linker.GetLinkTargetNode( "#a" ) '// 循環参照エラー
linker.EndNavigation
linker.EndNavigation
linker.EndNavigation
linker.StartNavigation "sample.xml", root
Set b = linker.GetLinkTargetNode( "#b" ) '// 循環参照エラーにならない
linker.EndNavigation
循環参照エラーの検出
linker.StartNavigation "sample.xml", root
Set x = linker.GetLinkTargetNode( "target.xml#name1" )
linker.EndNavigation
サンプル
"target.xml#name1"
参考
IXMLDOMElement
←
▼
▲
関連
バイナリ・ファイル
レジストリ・ファイル
文字列 TextStream
←
▼
▲
指定した VBScript ファイルの中の関数を呼び出し、終了するまで待ちます。
クラス定義や関数定義が入った VBSファイルをインクルードします。
指定したシンボルの関数が定義されているかどうかを返します。
現在のプロセスのまま
コマンドライン・オプションが指定されているかどうかを返す
環境変数を展開します
指定したコマンドラインを新プロセスで実行します。 終了を待ちません。
指定したコマンドラインを新プロセスで実行します。 終了を待ちます。
指定した時間だけ待ちます。
指定したファイルが作られるまで待ちます。
新プロセス
待ち
[ テスト ]
関連
管理者権限を持った新プロセスで実行します。 終了を待ちます。
←
▼
▲
Sub start( cmdline as string )
指定したコマンドラインを新プロセスで実行します。 終了を待ちません。
cmdline に環境変数を含めることができます。 (%var% 形式)
start """%ProgramFiles%\Movie Maker\moviemk.exe"""
サンプル:
(src)
cmdline にフォルダやデータファイルのパスを指定すると、そのフォルダやファイルを
ダブルクリックしたときと同じように開きます。
コマンドラインではパスをダブルクォーテーションで囲むこと
ファイルが見つからないと、E_WIN32_FILE_NOT_FOUND エラーになります
関連
Dim cmd
cmd = Setting_getEditorCmdLine( 1 )
cmd = Replace( cmd, "%1", "C:\file.txt" )
start cmd
サンプル:
CPU がマルチコアであれば、複数のプロセスによる並列処理になり高速になります。
→ T_Start_Manual.vbs # [T_StartErr]
テスト
start "cmd.exe /C cscript //nologo sample.vbs | "+ g_vbslib_ver_folder +_
"safetee\safetee.exe -o Sample_out.txt & exit"
safetee
cmd.exe /C を経由して実行してください。 > でリダイレクトすると内容が表示されない
ので、パイプを経由して safetee(または tee)を実行してください。 また、パイプを
使う場合、実行後にウィンドウが残らないように、exit してください。
←
▼
▲
Function RunProg( cmdline as string, stdout_stderr_redirect as string ) as integer
指定したコマンドラインを新プロセスで実行します。 終了を待ちます。
【引数】
cmdline
stdout_stderr_redirect
コマンドライン(実行ファイルパス+パラメータ)
出力先のファイルパス(下記)
返り値
エラーレベル(main 関数の返り値)
Empty や "" のときは、標準出力へ出力します。(コマンドプロンプト・ウィンドウが開きます)
"_debug" のときは、標準出力へ出力し、ウィンドウを閉じません。
"nul" のときは、出力内容を破棄します。
一般的なシェルと異なり、リダイレクトしても標準出力へも出力されます。
g_VBS_Lib.NotEchoStartCommand を指定したときは、RunProg 自体の echo 出力は
しなくなりますが、RunProg から実行するプログラムは、echo 出力されます。
stdout_stderr_redirect 引数
コマンド・プロンプトで使えるコマンドを実行するときは、次のようにしてください。
RunProg "cmd /c (dir > files.txt)", ""
RunProg "cmd /c (cd sub & dir > ..\files.txt)", ""
複数のコマンドを実行するときは、& をつけてください。
(src)
プロセスが終了するまで、関数内部で待ちます。
VBScript を実行するときは、cscript を経由してください。
vbslib の input などを使っているときは、/GUI_input:1 または /set_input を指定してください。
RunProg "cscript //nologo sample.vbs /GUI_input:1", ""
新プロセスのカレントフォルダは、RunProg を呼び出す直前のカレントフォルダになります。
コマンドプロンプトから標準入力するプログラムは、停止してしまいます。
対策
RunProg "batch1.bat", ""
バッチファイルを実行するときは、次のようにしてください。
(pause など、標準入力するコマンドを使わないようにしてください)
→ T_Call\TryExec.vbs
実証コード
RunProg "batch1.bat /close", ""
閉じないバッチファイルは、閉じるようにする
参考
→ call_vbs や include を相対パスで指定するときの注意
Dim g_ChildHead as string
新プロセスが標準出力へ出力する内容を表示するときに、行頭に追加する文字列。
デフォルトは、何も追加しません。
グローバル変数です。
VBScript をデバッガに接続するときは、下記のように //x を付けてください。
RunProg "cscript //x sample.vbs", ""
関連
→ RunProg (clib)
→ T_Call_Target.vbs
テスト
→ T_DebugVBS_Manual.vbs
関連
複数のコマンドをバッチファイルのように記述するときは
RunProg したプロセスAが、子プロセスBを生成したとき、プロセスAが終了しても、プロセスB
が終了していなければ、RunProg から戻りません。
←
▼
▲
Function RunBat( cmdlines as string, stdout_stderr_redirect as string ) as integer
指定したバッチを新プロセスで実行します。 終了を待ちます。
【引数】
cmdlines
バッチファイルに記述する内容
出力先のファイルパス, "" または Empty で標準出力のみ
返り値
エラーレベル
(src)
stdout_stderr_redirect
サンプル:
r= RunBat( _
"nmake -f makefile" +vbCRLF+_
"@if errorlevel 1 goto fin" +vbCRLF+_
"del *.obj" +vbCRLF+_
":fin", _
Empty )
If r <> 0 Then Raise 1, "<ERROR msg='バッチ処理でエラーが発生しました'/>"
If not exist( "sample.dll" ) Then Fail
←
▼
▲
Function sudo( OperationName as string, CmdLine as string,
StdoutStderrRedirect as string ) as integer
指定したコマンドラインを管理者権限を持った新プロセスで実行します。 終了を待ちます。
【引数】
CmdLine
StdoutStderrRedirect
コマンドライン(実行ファイルパス+パラメータ)
出力先のファイルパス
返り値
エラーレベル(main 関数の返り値)
関連
Windows XP では、管理者へログインする設定にすると、起動時に管理者のパスワードを
入力するようになります。 自分が管理者であるときは、入力を求められません。
Windows Vista/7 では、起動する直前に、下記のメッセージを出力します。 更にユーザー
アクセス制御(UAC)による管理者への昇格の許可も求められます。 ユーザーが心配
しないよう、OperationName 引数に、行おうとする処理の名前を的確に指定してください。
-------------------------------------------------------------------------------
[ UAC(ユーザーアカウント制御)予告(詳細) ]
詳細情報1:
"C:\home\InstallSample.vbs"
詳細情報2:
C:\home>
cscript CopyProgram.vbs
-------------------------------------------------------------------------------
[ UAC(ユーザーアカウント制御)予告 ]
『Sample アプリケーションのインストール』という処理の続きを "管理者権限ランチャー
(sudo.exe)"から実行します。
これが、あなたがしようとしている処理と異なるときや、あいまいな処理名のときは、
終了してください。
続行するには Enter キーを押してください . . .
↓
→ T_sudo フォルダ
テスト
If GetOSVersion() >= 6.0 Then
未対応
(src)
未対応
Enter キーを押すと
sudo が出すメッセージ (実行前)
sudo "Sample アプリケーションのインストール", _
"cscript CopyProgram.vbs", ""
未対応
sudo が出すメッセージ (実行後)
↓
「はい」 をクリックすると
管理者権限で行う処理が完了し、管理者権限は失効しました。
sudo に指定したプログラム、cscript CopyProgram.vbs を、新規プロセスで起動
↓
プログラムが終了したら
サンプルコード:
内部コールツリー
sudo (vbs)
sudo.exe
"cscript T_sudo_c_target.vbs"
T_sudo_c_Manual.vbs
cmd /C
T_sudo_c_target.vbs
if not ""%errorlevel%""==""21"" pause
親プロセス、一般ユーザー
cmd /C "temporary.bat"
"temporary.bat"
子プロセス、管理者
孫プロセス、管理者
ひ孫プロセス、管理者
echo %errorlevel% > errorlevel.txt
エラー時に pause する
T_sudo_c_target.vbs
wscript
cscript
玄孫プロセス、管理者
OperationName
ユーザーが行おうとしている処理の名前
2秒間表示されます。
通常時
デバッガ使用時
親プロセス、一般ユーザー
"cscript //x T_sudo_c_target.vbs"
sudo (vbs)
T_sudo_c_Manual.vbs
sudo.exe
cmd /C "cscript //x ***.vbs" /debug:1
子プロセス、管理者
***.vbs
cscript
孫プロセス、管理者、デバッガ接続
sudo で起動する .vbs スクリプトのプロセスをデバッグするときは、CmdLine 引数に、
cscript のオプション //x を付けてください。
Windows XP の場合
Windows Vista/7 の場合
デバッガに接続するには
sudo "Sample アプリケーションのインストール", _
"cscript //x CopyProgram.vbs", ""