--.--.--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2009.12.26

第354夜

vbs(wsh)のお勉強2日目・・・。

まだまだ触りぐらいしか進んでない。
4日も経つのに・・・(/ω\)
この記事へのトラックバックURL
http://hexagram.blog41.fc2.com/tb.php/376-ac3f393b
この記事へのトラックバック
この記事へのコメント
Q.オブジェクトをGetObjectで取得する際、ProgIDは必要じゃない?

A.ProgIDを明記しなくても、レジストリでの対応関係が自動的に走査される。

"D:WSHtest.xls"などと指定した場合、レジストリを参照し、".xls"がExcelに関連づけられていることを認識してProgIDが“Excel.Sheet”であるオブジェクトを返してくれるらしい。

但し複数に関連づけられている場合もあるので、第二引数でProgIDを指定可能。
Posted by hexagram at 2009.12.26 02:01 | 編集
Q.WScript.Argumentsから名前ありのパラメータと名前なしのパラメータ(全てのパラメータもあるが)が取得できるが、どのように使い分けるのか?

A.パラメータの順番に左右されないように処理をしたい場合に名前ありのパラメータが便利らしい。

名前なしの場合、パラメータの順番を決めておく必要があり、ユーザはその順番を覚える必要があるっていう説明だったが、やろうと思えば名前なしのパラメータでもパラメータの値を判定しながら処理をすれば、ユーザは順番を意識しなくてもいい気もするけど・・・。

まぁ、この辺りは深く追求しても仕方ないけどね。
言わんとすることも何となく分かる。
でもな~、順番は覚えなくてもいいかもしれないけど、名前のスペルを今度は覚えないといけないから結局なんだかな~って感じはする。
Posted by hexagram at 2009.12.26 03:05 | 編集
Q.RunメソッドとExecメソッドの違いは?

A.プログラムの実行方法に違いがあるらしい。

Run
・完全に別プロセスとしてプログラムを起動する。
・CScriptでスクリプトを実行した場合、現在とは別の新しいコマンド・プロンプトが作成される。
・起動の際に最小化・最大化などの表示方法を指定できる。
・プログラムの終了を待つ場合に終了コードを取得することができる。

Exec
・CScriptでスクリプトを実行した場合、現在と同じコマンド・プロンプトが使用される。
・標準入力/標準出力/標準エラー出力を利用できる。

RunメソッドとExecメソッドの違い(左がRun)
終了コードの取得 ○ ○
プロセスIDの取得 × ○
WSH5.6以前の実行 ○ ×
最大小化の実行 ○ ×
標準入出力の利用 × ○
ウィンドウ 異 同(CScriptであれば)
Posted by hexagram at 2009.12.26 14:41 | 編集
Q.関数呼出の括弧の有無はどうすればいい?

A.なにやら面倒くさい仕様らしい。

・Subプロシージャは基本的に引数を括弧で括らない。
・引数が一つの時はSubもFunctionも括弧の有無でエラーにならない。
・引数が二つ以上になった場合、括弧のありなしが問題になる。
・戻り値を受けるようになってれば Functionとみなすため括弧があっても問題なし。
・戻り値を受けるようになっているSubだった場合は型が違うエラーになる。
・戻り値を受けるようになってない場合は Subとみなすため括弧付けたらエラーになる。
Posted by hexagram at 2009.12.26 15:11 | 編集
Q.スクリプトから起動したプログラムの標準出力を処理したい場合は?

A.一例を挙げる。

StdOutストリームの終端までを処理すればStatusプロパティ(完了したかどうか)を意識することなく、実行が終了するまでの結果を読み込むことができる。

ReadLineはストリームにデータがなければデータが追加されるまで待つので、Sleepで明示的に待つ必要はない。

例)
Option Explicit

Dim objShell
Dim objExec

Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ipconfig.exe")

'標準出力が終了する(起動プログラム終了)までループ
Do Until objExec.StdOut.AtEndOfStream
Dim strLine
Dim iColon
Dim strAddress

strLine = objExec.StdOut.ReadLine

If InStr(strLine, "IP Address") <> 0 Then
iColon = Instr(strLine, ":")
strAddress = Mid(strLine, iColon + 2)
WScript.Echo strAddress
End If
Loop
Posted by hexagram at 2009.12.26 16:37 | 編集
Q.SendKeysで送る特殊の記述方法は?

A.下記を参照。

ttp://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_04.html
Posted by hexagram at 2009.12.26 16:57 | 編集
Q.closeが必要なオブジェクトは?

A.未調査。
Posted by hexagram at 2009.12.26 17:12 | 編集
Q.SendKeysで3つ同時に押下する方法は?

A.未調査。

2つならobjShell.SendKeys "^%"とかだけど、"^%{DEL}"だとALTを押しながらCTRLを押して、ALTを離してDELみたいだし・・・。
"^(%{DEL})"とかだとALTを押しながらCTRLとDELを連続で押すみたいだけど、連続じゃなくて同時に押したいのだ。
Posted by hexagram at 2009.12.26 17:24 | 編集
Q.AppActivateでアクティブにするウィンドウの指定方法は?

A.ウィンドウ・タイトルの文字列 または プロセスIDを指定する。

タイトルの場合は完全に一致するもの→先頭が一致するもの→末尾が一致するものの順に検索されるらしい。
また同じ名前のウィンドウがある場合、どれがアクティブになるかはきまっていないらしい。

プロセスIDならば一意に特定できるので、可能ならばこちらの方がいいと思う。

例)
'AppActivateの動作確認
Option Explicit

Dim objShell
Dim objExec

Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec("notepad.exe test.txt")

' 起動を待つ
Do Until objShell.AppActivate(objExec.ProcessID)
WScript.Sleep 1000
Loop

objShell.SendKeys "^f"

' ダイアログの表示を待つ
Do Until objShell.AppActivate("検索")
WScript.Sleep 100
Loop

objShell.SendKeys "WSH~"
objShell.SendKeys "{ESC}"

Do Until objShell.AppActivate(objExec.ProcessID)
WScript.Sleep 1000
Loop

objShell.SendKeys "{HOME}"
objShell.SendKeys "+{END}"
objShell.SendKeys "^c"
objShell.SendKeys "%{F4}"
Posted by hexagram at 2009.12.26 17:31 | 編集
Q.特別なフォルダのパスを取得する方法は?

A.未調査。

SpecialFoldersを利用する。

ただしWindowsのシステムフォルダや一時フォルダはExpandEnvironmentStringsやEnvironmentを利用して環境変数を利用して取得する。

ExpandEnvironmentStringsは環境変数の中に環境変数がある場合も全て展開してくれるが、Environmentの場合は展開してくれないという違いがある。

Environmentを利用する場合で全て展開する方法は未調査(できないと使いづらくない?)。

参考サイト
ttp://www.atmarkit.co.jp/fwin2k/operation/wsh06/wsh06_02.html
Posted by hexagram at 2009.12.26 18:00 | 編集
Q.イベントログを記述したい場合は?

A.LogEventを利用する。

例)
Option Explicit

Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.LogEvent 0, "成功テスト"
objShell.LogEvent 1, "エラーテスト"
objShell.LogEvent 2, "警告テスト"
objShell.LogEvent 4, "情報テスト"
objShell.LogEvent 8, "成功監査テスト"
objShell.LogEvent 16, "失敗監査テスト"
Posted by hexagram at 2009.12.26 18:39 | 編集
Q.スクリプトが置いてあるフォルダではなく、作業フォルダ(カレント)を取得したい場合

A.CurrentDirectoryを利用する。

例)
Option Explicit

Dim objShell

Set objShell = WScript.CreateObject("WScript.Shell")
Wscript.Echo objShell.CurrentDirectory
Posted by hexagram at 2009.12.26 19:10 | 編集
Q.作業フォルダを移動したい場合

A.CurrentDirectoryを利用する。

カレントディレクトリの移動はWSHのプロセス内のみで行われているため、コマンドプロンプトのカレントディレクトリ自体は変わらない。

例)
Option Explicit

Dim objShell

Set objShell = WScript.CreateObject("WScript.Shell")
Wscript.Echo objShell.CurrentDirectory

objShell.CurrentDirectory = "C:developmentvbsprojectpractice新しいフォルダ"

Wscript.Echo objShell.CurrentDirectory
Posted by hexagram at 2009.12.26 19:13 | 編集
Q.ポップアップを表示する場合

A.Popupを利用する。

cscriptで実行してもコンソールではなく、ポップアップが表示される。

ESCを押した場合は私の環境だとキャンセルになるようだった(仕様かは未調査)。

例)
Option Explicit

Dim objShell
Dim iBtn

Set objShell = WScript.CreateObject("WScript.Shell")
iBtn = objShell.Popup("中止する場合は「キャンセル」を押してください。", 5, "処理を実行しますか?", vbOKCancel+vbQuestion)

Select Case iBtn
Case vbOK
objShell.Popup "実行しました。", 5,, vbInformation
Case vbCancel
objShell.Popup "キャンセルしました。", 5,, vbInformation
Case -1
objShell.Popup "自動的に実行しました。", 5,, vbInformation
End Select
Posted by hexagram at 2009.12.26 19:25 | 編集
Q.ネットワークドライブの一覧を表示する場合

A.EnumNetworkDrivesを利用する。

例)
Option Explicit

Dim objNetwork
Dim colDrives

Set objNetwork = WScript.CreateObject("WScript.Network")
Set colDrives = objNetwork.EnumNetworkDrives

WScript.Echo "ネットワーク・ドライブは" & (colDrives.Count / 2) & "個あります。"
WScript.Echo "ネットワーク・ドライブの一覧を表示します。"

Dim i

For i = 0 to colDrives.Count - 1 Step 2
WScript.Echo colDrives.Item(i) & " : " & colDrives.Item (i + 1)
Next
Posted by hexagram at 2009.12.26 20:20 | 編集
Q.ネットワークプリンタ(ドライバ含め?)に接続したい場合

A.未調査。

ネットワークプリンタに接続方法はいくつかのサイトに書かれているけど、これドライバはどう考えているんだろう?

ドライバがOSに入っている前提なのだろうか。

プリンタドライバのインストールで検索すると、なかなかこれはといったものがない。
あるにはあるんだけど、よく意味が分からない。
Posted by hexagram at 2009.12.26 20:56 | 編集
Q.リモートでスクリプトを起動したい場合

A.WshControllerを利用する。

注意点はリモートではスクリプトがバックグラウンドで実行される。
そのため入力をもとめるようなスクリプトは行えないので終了することがない無限ループになる(リモートでは入力待ちのままデットロックになる)。

リモートで動かすスクリプトで入力を求めるような処理はダメ。

例)環境がないので動作は未確認
Option Explicit

Dim strComputer
Dim strScript
Dim objController
Dim objRemote

strComputer = "PC01"
strScript = " test.vbs"
Set objController = WScript.CreateObject("WshController")
set objRemote = objController.CreateScript(strScript, strComputer)

WScript.Echo "リモートでスクリプトを実行します。"
objRemote.Execute

Do Until objRemote.Status = 2
WScript.Sleep 100
Loop

WScript.Echo "リモートでの実行は終了しました。"

test.vbs
Option Explicit

Dim objFSO
Dim objFile

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("D:WSHtest.txt", 8, True)
objFile.WriteLine Now

objFile.Close
Posted by hexagram at 2009.12.26 22:12 | 編集
Q.あるフォルダの上位フォルダをルートまで表示したい場合

A.1例を挙げる。

例)
Option Explicit

Dim objFSO
Dim objFolder

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:developmentvbsprojectpractice")

Do Until objFolder.IsRootFolder
WScript.Echo objFolder.Name
Set objFolder = objFolder.ParentFolder
Loop

WScript.Echo objFolder.Path & "(ルートフォルダ)"
Posted by hexagram at 2009.12.26 23:17 | 編集
Q.WMIを利用したい場合

A.まだよく分からないけど、WMIを利用して物理メモリを表示する例を書いておく。

例)
Option Explicit

Dim strComputer
Dim wbemServices
Dim wbemObjectSet
Dim wbemObject

strComputer = "primary"
Set wbemServices = GetObject("winmgmts:\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration")

For Each wbemObject In wbemObjectSet
WScript.Echo "物理メモリの合計 (kb): " & wbemObject.TotalPhysicalMemory
Next
Posted by hexagram at 2009.12.26 23:41 | 編集
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。