om さん 2003年 06月 19日 20時 59分 13秒

はじめまして、WSH初心者のTom

ヒカリブシ さん 2003年 06月 19日 15時 52分 53秒

真琴さん、以下のコードをvbsファイルにコピーして実行して下さい。
ご使用のWSHのバージョンが分ります。

'===========================================================

version=ScriptEngineMajorVersion &"."&ScriptEngineMinorVersion
if version >= 5.1 then
MsgBox "WSH 2.0を使用してるで。"
else
MsgBox "エンジンが古すぎるで。"
end if

'===========================================================

真琴 さん 2003年 06月 19日 15時 13分 19秒

皆さん、はじめまして、よろしくお願いします。

既出の質問であれば、ごめんなさい。
で、早速、質問なんですが、WSHで「共通関数などの他のファイルをインクルード」
したいのですが、その方法を教えて下さいませんでしょうか?
HPとかで、色々と調べてはみたのですが、結局、解決できませんでした。
XMLとかいうのを、勉強しなきゃいけないんでしょうか・・・?

また、調べている最中に、色んなページに、「インクルードは、WSH2.0 から
出来るようになった」と書いてあったのですが、現在使っているWSHのバージョン
がいくつなのかを知る為には、どういう操作をすればいいのでしょうか?
合わせて、教えてください。

では、よろしくお願いします。


CORNELIUS さん (qlw_wlp@teamgear.net) 2003年 06月 19日 09時 57分 25秒

レジストリキーを削除したいのですが、
サブキーがあるとRegDeleteではエラーと
なってしまいます。サブキーも一括して削除したい
のですが、何か方法をしっている方
アドバイスお願いします。

ヒカリブシ さん 2003年 06月 19日 01時 28分 16秒

はじめて投稿させて頂きます。はじめまして。
このページでVbsを勉強させて頂きました。
管理人さんありがとうございます。
この後はリファレンスを見ながらすこしづづ知識を
強化していきたいと思います。

さて、Vbsを学んだ後にJscriptも出来れば学びたいなと思っています。
JavaScript勉強用のページはあまたにありますが、
htmlファイル外から使用しているJScriptのサンプルや
お勉強用のページは色々探しましたがほとんど見つけられません。

みなさんの中でJScriptの勉強に有益なページをお知りでしたら
お教え願えないでしょうか。英語のページでも頑張って勉強しますので
お知りでしたらどうかお教え下さい(もちろん日本語の方がベターですが)。

書き込み初でいきなり頼み事と言うのもぶしつけですが、
どうかよろしくお願いします。

yoka さん 2003年 06月 17日 19時 01分 24秒

あさ さん こんにちは


>■VB Net(ディスク、ドライブ関係)
>http://www.mvps.org/vbnet/code/disk/index.html

サイトの紹介ありがとうございます

チラッとしか見ていませんが、
色々な情報がありそうですね

英語でなければ、良かったのですが・・・

何とか頑張って見たいと思います


あさ さん 2003年 06月 17日 14時 42分 47秒

うぅ。
結局・・・・つくっちゃったよねぇえぇぇぇぇぇ〜(笑)
むたぐちさんのクラスの紹介に合わせて、clsPingクラスを作りマスタ。
というわけで、お披露目。
AAさん・・・これで頑張って下さい。^^;;;

■制限、機能等
1.Time、Bytes、TTLは記号と単位付き。FromでIPアドレス取れたり。
2.失敗時の失敗理由は取得できません。
3.HostNameには、IPアドレスを指定してもホスト名を指定してもOK(Ping.exe任せ)
4.出来ればExecutePing実行する前にInitObjectを呼ぶ。多分いらないけど念のため。
5.ResultStringでPing.exeの結果を全て文字列で取得可能。
6.ResultLineStringで結果文字列の一行だけ取得可能。
7.ExecutePingが成功したかどうかは、戻り値、もしくはStatusで取得可能。

使い方はクラス宣言の前にある「for Test」を参照のこと。
ってとこでしょか。じゃ長いけど貼り付け(笑)


'for test
'++++++++++++++++++++++++++++++++++++++++++++++++++
Set objPing = new clsPing
objPing.InitObject()
objPing.HostName = "localhost"
objPing.ExecutePing()

msgbox objPing.Status
msgbox objPing.ResultString
msgbox objPing.ResultLineString
msgbox "[" & objPing.From & "][" & objPing.Bytes & "][" & objPing.Time & "][" & objPing.TTL & "]"

Set objPing = Nothing
'++++++++++++++++++++++++++++++++++++++++++++++++++


'**************************************************
'Ping Class
'**************************************************
Class clsPing
'----------------------------------------
'ローカル変数
'----------------------------------------
Private l_intClassStatus '0:初期 1:宛先設定済み 2:Ping実行済み
Private l_strRetBuffer
Private l_strRetLineBuffer

Private l_strHostName
Private l_blnResultStatus
Private l_strFrom
Private l_strBytes
Private l_strTime
Private l_strTTL

'----------------------------------------
'プロパティ定義
'----------------------------------------
Public Property Get ResultString
ResultString = l_strRetBuffer
End Property

Public Property Get ResultLineString
ResultLineString = l_strRetLineBuffer
End Property

Public Property Get From
From = l_strFrom
End Property

Public Property Get Bytes
Bytes = l_strBytes
End Property

Public Property Get Time
Time = l_strTime
End Property

Public Property Get TTL
TTL = l_strTTL
End Property

Public Property Let HostName(ByVal varHostName)
If Len(varHostName) > 0 Then
l_intClassStatus = 1
Call InitResult()
l_strHostName = CStr(varHostName)
End If
End Property

Public Default Property Get HostName()
HostName = l_strHostName
End Property

Public Property Get Status
Status = l_blnResultStatus
End Property

'----------------------------------------
'クラス初期化
'----------------------------------------
Private Sub Class_Initialize
Call InitObject()
End Sub

'----------------------------------------
'クラスオブジェクトの初期化処理
'----------------------------------------
Public Sub InitObject()
l_intClassStatus = 0
l_strHostName = ""
l_strRetBuffer = ""
Call InitResult()
End Sub

'----------------------------------------
'結果格納先 初期化処理
'----------------------------------------
Private Sub InitResult()
'l_strRetBuffer = "" '失敗時も結果は保存
l_strRetLineBuffer = ""
l_strFrom = ""
l_strBytes = ""
l_strTime = ""
l_strTTL = ""
l_blnResultStatus = False
End Sub

'----------------------------------------
'Ping実行メソッド
'----------------------------------------
Public Function ExecutePing()
Dim objWshShell
Dim objExec
Dim objRegExp
Dim objColMatches
Dim objMatch
Dim strCommand

l_blnResultStatus = False

If l_intClassStatus = 1 Then
l_intClassStatus = 2

Set objWshShell = WScript.CreateObject("WScript.Shell")

strCommand = "%comspec% /c ping.exe -n 1 -w 1000 " & l_strHostName
Set objExec = objWshShell.Exec(strCommand)
Do While objExec.Status = 0
WScript.Sleep 100
Loop

l_strRetBuffer = ""
If Not objExec.StdOut.AtEndOfStream Then
'Pingの実行成功
l_strRetBuffer = objExec.StdOut.ReadAll()

'正規表現にて成功メッセージの検索
Set objRegExp = New RegExp
With objRegExp
.IgnoreCase = True
.Global = True
.Pattern = "Reply from (.+): bytes(.+) time(.+) TTL(.+)"
Set objColMatches = .Execute(l_strRetBuffer)
End With

'とりあえず一個しかないはずだが、回数変更してもいけるはず。はずぅ・・
For Each objMatch in objColMatches
'見つかれば成功とみなす。
l_blnResultStatus = True

'最後の結果を最新として取得することにする。
l_strRetLineBuffer = objMatch.Value
l_strFrom = objMatch.SubMatches(0)
l_strBytes = objMatch.SubMatches(1)
l_strTime = objMatch.SubMatches(2)
l_strTTL = objMatch.SubMatches(3)

'TTLの最後に改行コードが含まれていたら削る。
l_strTTL = Replace(Replace(l_strTTL,chr(10),""),chr(13),"")

' WScript.Echo objMatch.FirstIndex & ":" & objMatch.Length & ":" & objMatch.Value
Next
Else
'Pingの実行失敗
' WScript.Echo "Pingの実行失敗"
End If
End If

If l_blnResultStatus = False Then
'失敗なら結果格納用変数初期化
Call InitResult()
End If

'お片付け
Set objMatch = Nothing
Set objColMatches = Nothing
Set objExec = Nothing
Set objWshShell = Nothing

'戻り値でも結果を返す
ExecutePing = l_blnResultStatus
End Function
End Class

あさ さん 2003年 06月 17日 12時 04分 55秒

VBでEXE作るなら、こちらが参考になるかと。
とりあえず、サイト紹介しておきます。

■VB Net(ネットワーク関係。PingとかTracrtあります。)
http://www.mvps.org/vbnet/code/network/index.html

■VB Net(ディスク、ドライブ関係)
http://www.mvps.org/vbnet/code/disk/index.html

あさ さん 2003年 06月 17日 11時 51分 06秒

>むたぐちさんへ
有用な情報ありがとうございます^^
でも、クラスってVBSでは、確かに使い道ないですねぇ・・・
私も多分、クラス使うぐらいなら、WSC作ると思います。
まぁ、まず、そこまでのことをVBSでやろうとは思いませんが・・・

やっぱりVBSはバッチファイルのように順次処理をする為のスクリプト言語だと思います。


>yokaさん、AAさんへ
ですから、yokaさんのようにドライブの情報が取得したければ、私なら、VBでAPI呼び出しするでしょうし、Ping打つのも、詳細が知りたければVBでEXE作ってしまいます(汗)
(どっかのサイトでVBの(Ping.exe使わず)Pingするコード見たことあります)
#あ。ていうか手元にコードだけあるや・・・勝手に改変してるけど。

やっぱり、「向き不向き、用途」が言語にはあると思いますので、そこまでやるならちゃんとした言語でプログラムを書くべきだと思います。
(と。答えれないので、そういう事にしときます。汗)
#で。そのプログラムをVBSから呼び出すとか(笑)

>yokaさんへ
私もそれ以上はわかりません(汗)
やるのであれば、上記のようにVBでEXE作ったほうが良いと思います。
API呼べるだけで、出来る範囲が全然違いますので。。

>AAさんへ
私の書き込みで書いたように、正規表現をうまく使えば出来ると思います。
Pingの出力結果から「time=10ms」とかの値を取得できるように改造して下さい。
それ以上の精度が必要ならPing.exeでは無理だという事になります。
Pingで表示される文字から取得するしかないので、当然、表示されない値は取得できません。
後、頑張って自分で作って下さいね。誰も作ってくれませんよ^^

でわでわ。
#最近説教多くなってきたな(汗)

管理人むたぐち さん 2003年 06月 16日 21時 07分 10秒

●VBSでクラスを作成する - Class ステートメント

VBS5.0から、VBSでもClassステートメントを用いてクラスが作成できることは、
皆さんもご存知だと思います。
今回、このClassステートメントを用いて、クラスを作成する方法をまとめてみよう
…と思ったんですが、VBSのClassステートメントは、ほとんどVBのクラスモジュールと
同じなので、クラス自体の説明は他サイトに譲って、ここではその差異を述べるに
とどめることにします。

前提知識となるVBのクラスについては、
クラスモジュール講座 http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/index.html
NCF Magazine : VBでクラスを使ってみる http://www.ncfreak.com/magazine/No.003/vb_class.html
あたりがよく纏まっていて参考になるんじゃないでしょうか。

基本的には、VBのクラスモジュールに記述する内容を、そのままスクリプト中の
Class classname...End Class内に記述してやれば、クラスを宣言できます。
HTML/HTA/WSF etcの場合は、インクルードしたファイル内で宣言することも可能です。

そして、作成したクラスのインスタンスは、

Dim x
Set x = New classname

のようにして作成できます。
ちなみにVBSのオブジェクト変数はすべて実行時(レイト)バインディングなので、
Dim x As classnameのような宣言はできません。

さて、VBSのClassステートメントの、VB6のクラスモジュールとの違いは次の3点に集約できます。

1.プロパティやメソッドの引数に型が指定できない
Property Get/Let/Set, Function/Subで、Asキーワードによる型宣言ができないためです。
これはVBSだから当たり前ですけどね。

2.インターフェイス実装ができない
Classステートメント内で、Implementsキーワードが使えないという制限によるものです。
ここからも分かりますが、VBSはオブジェクト指向言語とは言えません。

ちなみにJavaScriptでは文法として用意されているわけではないですが、prototypeプロパティを
用いれば継承もできます。以下、参考ページです。
Virgo - JavaScript Diary http://www.skipup.com/~peace/javascript/d020525.html
オブジェクト指向プログラム言語としてのJavaScript http://www.tokumaru.org/JavaScript/index.htm

さらに余談ですが、VB6にも継承の機能はありませんが、VB.NETではサポートされ、
ついに完全なオブジェクト指向言語に生まれ変わりました。
VB6からVB.NETへの移行に関しては、
@IT: 連載 VB.NETプログラミング http://www.atmarkit.co.jp/fdotnet/vb6tonet/index/index.html
ここが詳しいです。

3.イベントが使えない
Event、RaiseEvent、WithEventsが使えないことによるものです。


以上が、VB6のクラスモジュールではできるが、VBSのClassステートメントではできないことのリストです。
(他にもあったら補足お願いします)
逆に言うと、これ以外のことはVBSのClassステートメントでも可能ということです。

たとえば、コンストラクタ(インスタンスが生成した時、すなわちSet x = New classname
したときに呼ばれる関数)は、
Private Sub Class_Initialize()...End Sub内に記述できますし、
デストラクタ(インスタンスが破棄された時、すなわちSet x = Nothingした時に呼ばれる関数)は、
Private Sub Class_Terminate()...End Sub内に記述できます。

で、VBSのクラスをWSHで使う利点ですが、インクルードが可能なwsfファイルならともかく、
それができないvbsファイルではクラスの共有ができないですし、しかもVBSのクラスは、
VBSでしか使えない(JScriptでインスタンスを作成することはできない。ただし、クラスの
インスタンスが代入されたVBSのオブジェクト変数を、JSで利用することは可能(*注))ので、
あまり使いどころはないかなあという気がします。

むしろ、WSC(Windowsスクリプトコンポーネント)を使って、コンポーネント化した方が
色々な系から呼び出せる分便利だと思います。


(注)
下記のようなことはできるってことです。

<job>
<script language="VBScript">
Class Person
Private person_age

Private Sub Class_Initialize()
'コンストラクタ
person_age=18 'デフォルトは18歳
End Sub

Public Property Get Age()
Age = person_age 'プロパティの取得
End Property

Public Property Let Age(NewValue)
person_age = NewValue 'プロパティの代入
End Property
End Class
'ちなみにここの内容を、<script language="VBScript" src="hoge.vbs" />のようにして別ファイル化しても動作する。

</script>

<script language="VBScript">
Dim oPerson '変数の宣言
Set oPerson = New Person 'インスタンス作成
WScript.Echo oPerson.Age,"(VBS)"
</script>

<script language="JScript">
oPerson.Age = 20; //プロパティの変更
WScript.Echo(oPerson.Age,"(JS)");
</script>
</job>


この例で、二つ目のvbsを省いて、
<script language="JScript">
oPerson = new Person;
oPerson.Age = 20; //プロパティの変更
WScript.Echo(oPerson.Age,"(JS)");
</script>
ということはできないということです。
JSのnew演算子で指定するのはクラス名ではなく、あくまでコンストラクタなので。

AA さん 2003年 06月 16日 17時 48分 14秒

アドバイス頂いた内容が、pingの成功か失敗しか取得できません。
2000を使用しているのですが、時間取得方法あれば教えてください。
XPは.ResponseTimeで取得できました。ありがとう御座います。

>WSHでネットワークの接続速度を取得したいのですが
>プログラムがわかりません。
> DOSコマンドなら、ping、tracert等在るのですが
>誰かご存知の方教えてください。

yoka さん 2003年 06月 16日 17時 30分 28秒

>あさ さん へ

早速、ありがとうございます

>WSHでは難しいと思います。
>ここの過去記事(比較的最近)でも、似たような話をしていたりします。
>やるならWMI使ってやるような形になるかも知れません。

WMIは、見かけたことがあるような気もしますがほとんど気にとめた
ことはありませんでした

素敵なHPの紹介ありがとうございます

上記で多少かじったあとgoogleで

ShowG/しょーぢ(ShowG/ぢ) さんのHPで
http://hp.vector.co.jp/authors/VA016525/wmi/wmi02.htm

参照設定で「Microsoft WMI Scripting V1.2 Library」要

--------------------------------------

Public Sub TEST()

Dim strWork As String
Dim swObjectSet As WbemScripting.SWbemObjectSet
Dim swObject As WbemScripting.SWbemObject
Dim swProperty As WbemScripting.SWbemProperty

Set swObjectSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_LogicalDisk")
For Each swObject In swObjectSet
strWork = strWork & "■" & swObject.Description & vbNewLine
For Each swProperty In swObject.Properties_
With swProperty
strWork = strWork & .Name & "=" & .Value & vbNewLine
End With
Next
Next
Text1.Text = strWork
Set swProperty = Nothing
Set swObject = Nothing
Set swObjectSet = Nothing

End Sub

--------------------------------

を見つけました

取得結果は

■ローカル固定ディスク

Access=
Availability=
BlockSize=
Caption=C:
Compressed=False
ConfigManagerErrorCode=
ConfigManagerUserConfig=
CreationClassName=Win32_LogicalDisk
Description=ローカル固定ディスク
DeviceID=C:
DriveType=3
ErrorCleared=
ErrorDescription=
ErrorMethodology=
FileSystem=NTFS
FreeSpace=142870016
InstallDate=
LastErrorCode=
MaximumComponentLength=255
MediaType=12
Name=C:
NumberOfBlocks=
PNPDeviceID=
PowerManagementCapabilities=
PowerManagementSupported=
ProviderName=
Purpose=
Size=4293563392
Status=
StatusInfo=
SupportsFileBasedCompression=True
SystemCreationClassName=Win32_ComputerSystem
SystemName=XXXXXXXX
VolumeName=ローカル ディスク
VolumeSerialNumber=AXXXXXX

が取得できました

実は、自宅のPCの調子がおかしくなってしまいました

そこで前回の

ディスク ボリューム 種別 サイズ 状況 基本/論理
HD1 c:win98 FAT32 4000 アクティブ 基本
HD1 d:win2k FTFS 4000 なし 基本
HD1 e:data1 FTFS 4000 なし 拡張
HD2 (linux) linux 4000 なし 基本
HD2 f:data2 FTFS 4000 なし 拡張

を取得したいと思っているのですが

ShowG/しょーぢ(ShowG/ぢ) さんのHPでは
技術的な掲示板は無かったようなので、

ディスク 状況 基本/論理
の取得が無いようなのですが、これらの取得はどうすれば可能でしょうか?

こちらの掲示板に質疑してよいかちょっと迷いますが
よろしくお願い致します


あさ さん 2003年 06月 16日 14時 32分 29秒

>syuさんへ
お力になれなくて残念です(><
頑張って下さい(汗)

>じゅんさん、オックンさんへ
期待した通り動いたようで、よかったです。^^
お答えしたかいがあります。^^

>AAさんへ
WindowsXP限定であれば、WMI使った以下の過去記事を参照して下さい。
「あさ さん 2003年 05月 15日 17時 04分 47秒」
動作確認は、その後、むたぐちさんにより行われています^^

WindowsXP以外もあるのでしたら、以下の過去記事を参照して下さい。
「あさ さん 2003年 05月 10日 16時 53分 31秒」
Windows2000で動作確認しております。

あとは、正規表現をうまく使い、速度を取得できるように作ればOKかと。
正規表現については、Script56.CHMで「正規表現の概説」より読んでもらうか、以下のサイトがわかりやすくて良いと思います。
■Regular Expression
http://www.sixnine.net/regexp/index.html

>yokaさんへ
WSHでは難しいと思います。
ここの過去記事(比較的最近)でも、似たような話をしていたりします。
やるならWMI使ってやるような形になるかも知れません。
・・・という話になると、私の力量を超えてしまう(笑)ので、以下のサイトをご紹介します。(受け売りですが。笑)
■WMI Fun !!
http://homepage2.nifty.com/tcubic/wmifun/

>ぐちやまさん
初めまして^^;;
え〜と・・・すみません。質問の意味が良く分かりません。^^;;;
もうちょっと具体的に書いてもらえると、ほかの方も答えようがあるかと思います。

まず、「何がしたい」のかと「何がわからない」のかは、最低限、他の方が読んで分かるように書いてください。
で、もし作りかけのスクリプトなどがあれば、それも貼り付けてください。

後、せっかくなので、「使う」だけでなく「理解」して下さいね。
分かっていると思いますが、ぐちやまさんのやりたい事をここでお願いして、誰かがそれを作ってくれることを期待はしないで下さいね。
多分。誰も作ってくれませんよ(^^;;;

オックン さん 2003年 06月 16日 13時 43分 36秒

>あさ さんへ

期待どおりの動作をしています。
ありがとうございます。

他サイトの掲示板よりレスが早くビックリです。

今後ともよろしくお願いします。

オックン さん 2003年 06月 16日 13時 43分 31秒

>あさ さんへ

期待どおりの動作をしています。
ありがとうございます。

他サイトの掲示板よりレスが早くビックリです。

今後ともよろしくお願いします。

AA さん 2003年 06月 16日 12時 33分 18秒

WSHでネットワークの接続速度を取得したいのですが
プログラムがわかりません。
 DOSコマンドなら、ping、tracert等在るのですが
誰かご存知の方教えてください。

yoka さん 2003年 06月 16日 12時 32分 41秒

いつもお世話になっています

ROM専門とたまに質疑をさせて頂いています


早速の質疑ですが

Fso = CreateObject("Scripting.FileSystemObject")

Drivesコレクション内の各ドライブの情報を列挙する
ようなコードは時折見かけることはあるのですが

ディスク ボリューム 種別 サイズ 状況 基本/論理
HD1 c:win98 FAT32 4000 アクティブ 基本
HD1 d:win2k FTFS 4000 なし 基本
HD1 e:data1 FTFS 4000 なし 拡張
HD2 (linux) linux 4000 なし 基本
HD2 f:data2 FTFS 4000 なし 拡張

このような、情報を取得することは出来るのでしょうか

Fso以前の情報のような気もするのでFSOでは無理そうですし
全くわかりません

きっと、変な質問をしていると思いますがよろしくお願い致します


ぐちやま さん 2003年 06月 14日 22時 07分 21秒

始めまして。だれか教えて下さい。

アクティブなフォルダウィンドウに、フォルダまたはテキストファイルを新規作成するにはどうすればいいんですか?テキストファイルは作成したら開いた状態にしたいです。アクティブウィンドウのパスを取得してそこに作らせればいいかもと思いましたが、チンプンカンプンでそんなこと可能なのかすらわかりません。なにとぞご教示ください。

このサイトの実用スクリプトを使ってみて初めてwshなるものを知りました。すごい便利ですね。

じゅん さん 2003年 06月 13日 15時 05分 51秒

Nomuさん、あささん、むたぐちさん

いろいろためになる情報ありがとうございます。
やはり、バイト配列を作るのは簡単ではないのですね。

たるさん作のCByteArray関数でうまく書き込むことができました。
BASP21もいろいろなことができそうなので研究してみます。

どうもありがとうございました。

syu さん 2003年 06月 13日 14時 03分 13秒

>むたぐちさん&みなさん

>MsgBox location.pathname とすると何と表示されます?

/D:\My%20Documents\WORKS\iso\ISO\様式集\after.htm になります。
>ついでに location.href も試していただけるとありがたいです。

file:///D:/My%20Documents/WORKS/iso/ISO/様式集/after.htm になります。

>Runメソッドに関しては、当たり前ですが引数がちゃんとしてないとエラーになりますよ。
>実行するファイルをそのまま直に記述してRunしてやってもエラーがでるんでしょうか?

---省略---
<HEAD><SCRIPT type="text/vbscript" LANGUAGE="VBScript">
Sub Noteb_OnClick
Set Shell = CreateObject("WScript.Shell")
Shell.Run """D:/My Documents/WORKS/社内/iso\ISO_CD_02/様式集/測定結果表.xls"""
End Sub
---省略---
<body>
<input type="button" value="測定結果表" id="Noteb">
---省略---
で 測定結果表.xls が立上がります。

>あと、WScript.Shellは通常のHTML内ではセキュリティ関係で動作しないか、警告が出るんですが、
>そのあたりはクリアーされてるんでしょうか?
>ちなみにセキュリティの問題は、単に拡張子をhtaに変えるだけでスルーされます。

警告は出ますがフレーム構造のhtmlでメニューフレームからメインフレームにafter.htm等々を表示して
処理しますのでhtaファイルに出来なかったんです。htaに出来れば警告も出ずにスマートになるため
トライはしたんですが断念しました。いずれは何とかしたいですけど。


あさ さん 2003年 06月 13日 13時 49分 12秒

>オックンさんへ

すっかり、忘れていました(汗)
と、いうことは、こんな感じでいいのかな?
さくっと簡単に作って見ました。

Dim objFSO
Dim strVBScript

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

strVBScript = ""

strVBScript = strVBScript & "D = Day(Date)" & chr(13) & chr(10)
strVBScript = strVBScript & "FileName = ""D:\DayFolder\"" & D & "".txt""" & chr(13) & chr(10)
strVBScript = strVBScript & "Set Fs = WScript.CreateObject(""Scripting.FileSystemObject"")" & chr(13) & chr(10)
strVBScript = strVBScript & "If Fs.FileExists(FileName) Then" & chr(13) & chr(10)
strVBScript = strVBScript & "msgBox ""すでに同名のファイルが存在しています。""" & chr(13) & chr(10)
strVBScript = strVBScript & "WScript.Quit" & chr(13) & chr(10)
strVBScript = strVBScript & "End If" & chr(13) & chr(10)
strVBScript = strVBScript & "Fs.CreateTextFile FileName" & chr(13) & chr(10)
strVBScript = strVBScript & "msgBox FileName & ""を作成しました。""" & chr(13) & chr(10)

Set objFile = objFSO.CreateTextFile("smpl.vbs",True)
objFile.Write strVBScript
objFile.Close

とりあえず、「書き込みにあったスクリプトをそのまま吐き出すスクリプト」として作りました。

ポイントはこんなところでしょうか。
・文字列に入れておいて、Writeで一発で書き込んでます。
・chr(13) & chr(10)は改行です。
・「"」は「""」と重ねて表現するか、Chr(34)で表現できます。

オックン さん 2003年 06月 13日 13時 28分 00秒

大変レスが遅くなりすいませんそして、
つたない文章力なのに、
ご親切な忠告とアドバイスありがとうございました。

>そのコードそのものをファイルに吐き出したい(VBSファイルを生成する?)ということなのかな(汗)
予想されている通りです。
掲示板に書き込んだコードを、作成されるテキストファイルに吐き出したいのです。

あさ さん 2003年 06月 13日 13時 16分 40秒

>SIGNAL9さんへ
私も紹介サイト見せていただきました^^;;

私は、Self modifying scriptに驚きました。
こんなこと、考えたこともなかったので、脳みそひっくりかえる感じです(笑)

>むたぐちさん
コンポーネントは探せばいろいろありますよね^^;;
でも、BASP21とかは使わずに、標準機能だけで済ませたいと思うのは私だけでしょうか(笑)

SelectはIsも使えませんよね。あんまり使いませんが(笑)

あと、私は「On Error GoTo **」が使えないのが痛いです。
VBでNextよりもよく使ってたので。。

まぁ、言い出すときりがないですね(笑)

管理人むたぐち さん 2003年 06月 13日 12時 51分 51秒

ちなみに、VBSにはVBのStrConv関数はないですが、
BASP21にはStrConvメソッドが用意されてます。

こういうイヤらしい機能縮小は勘弁してもらいたいですよね。
Select Case内でToが使えなかったり…。

あさ さん 2003年 06月 13日 12時 50分 52秒

ぬは、やはりそうですか(泣
しかし、CByteArrayすごいですね。(^^;;;
ASCIIテーブルも自前、SJIS=>EUC変換も自前で作ってあるし(驚)

BASP21は有名ですね^^;;
使ったことないので、そんな機能があるとは知りませんでした^^;;

MS Agent・・・はやってないので、私はあまり興味を持っていなかったりします(笑)
だので、質問にも答えれなかったり(汗)

しっかし、むたぐちさん幅広くご存知で・・・(汗)
いろいろWSHで検索していたら、11の発言見つけてしまいました(笑)

管理人むたぐち さん 2003年 06月 13日 12時 44分 27秒

To: syu さん

/ がつく原因は私にもちょっとわかりません。
MsgBox location.pathname とすると何と表示されます?
ついでに location.href も試していただけるとありがたいです。

Runメソッドに関しては、当たり前ですが引数がちゃんとしてないとエラーになりますよ。
実行するファイルをそのまま直に記述してRunしてやってもエラーがでるんでしょうか?
あと、WScript.Shellは通常のHTML内ではセキュリティ関係で動作しないか、警告が出るんですが、
そのあたりはクリアーされてるんでしょうか?
ちなみにセキュリティの問題は、単に拡張子をhtaに変えるだけでスルーされます。
(Windows版IE5以上の環境に限る)


To: SIGNAL9 さん

ページ紹介ありがとうございます。
また読ませていただきますね。

しかし、Graphical Classか…。doodle2はどうなってしまうんですか?(w

管理人むたぐち さん 2003年 06月 13日 12時 29分 38秒

To: Nomu さん

> ただ、Myマシン(WinXP)では、Microsoftの
> サイトの実例でも、読み上げ(Text-To-Speech)
> 部分はうまく動作しませんでした。

Microsoft Agent downloads for end-users
http://www.microsoft.com/msagent/downloads/user.asp

ここで、SAPI 4.0 runtimeってのをダウンロードすればOKだと思います。
日本語用のスピーチエンジンもダウンロードしておけば、日本語もしゃべれますよ。
Lernout & HauspieR TTS3000 TTS engine - Japanese (3 MB exe)って奴です。

最近、各種FlashでText To Speechは大活躍してますね。
2chで有名なあの「さいたまさいたまさいたま」は、Adult Female #1 Japanese (L&H)で、
高さ210Hz、速さ270語/分くらいで再生すると再現できます(w
Clipboard Speaker(http://www.vector.co.jp/soft/win95/util/se099979.html)
を使うと簡単にテストできますし、waveファイルにも落とせます。

HTAからSpeech APIを使うこともできます。
これは以前作った奴です。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/src/tts.lzh
スクリプトから利用できるSpeech APIは二種類あって、
TextToSpeech(Microsoft Voice Text)とDirectSS(Direct Speech Synthesis)があります。
このスクリプトで使ってるのは前者の奴ですが、これにはピッチ指定のメソッド/
プロパティが無かったりします(速度は変更可能)。

後者の使い方はいまだに良く分からない…。
それと、WSHから使える方法もあると思うんですが、やはりよくわからない…。

MS Agentは結構昔からあるんですが(WSHよりも若干古いくらいか)、イマイチ有効に
使われてない気がしてなりません。
ていうかWinXPの検索コンパニオンで申し訳程度に使われているくらいじゃ
ないでしょうか。(そもそもあれはMS Agentなのだろうか?)

思うに、デフォルトで入ってるキャラに魅力が無さ過ぎなんじゃないでしょうか。
「伺か」路線だったら大ブレイクしたかも(w


To: Nomu さん

HTAに関するMSDNの日本語ドキュメントは、この辺りでしょうか。
http://www.microsoft.com/japan/msdn/web/ie/ie50/ie5hta.asp
http://www.microsoft.com/japan/msdn/workshop/author/hta/overview/htaoverview.asp

リファレンスは、多分英語のしかないです。
http://msdn.microsoft.com/workshop/author/hta/hta_node_entry.asp

が、HTAと言っても、基本はDHTMLなので、HTA固有の要素はそんなに多くないですから
大したことはないんじゃないでしょうか。
(肝心のDHTMLのドキュメントが、IE4までの奴しか日本語化されてなかったりするんですが)


To: じゅん さん&Nomu さん&あさ さん

実は、VBS単独では、任意のバイト配列が作成できないんです。
(しかもバイト配列の任意の要素を取り出したりすることができない)
そこで、BASP21等の外部コンポーネントに頼るのが一つの解決策となります。

BASP21だと、ByteArrayメソッドでバイト配列を作って、
BinaryWriteメソッドでファイルに書き込みするって感じになると思います。
BinaryConcat(バイト配列結合)やBinaryRead(バイナリファイル読み込み)なども
ありますので、Adodb.Streamを使う必要はありません。

また、Windowsの標準機能だけで済ませるなら、
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list50.shtml
たる さん 2001年 10月 30日 01時 06分 59秒 が投稿された、
ADO2.5を使った、バリアント配列からバイト配列を返す関数CByteArrayを使うと
良いでしょう。
ちなみにバリアント配列なら、Array(12,34,56)って感じで作れます。

Nomu さん 2003年 06月 13日 12時 12分 08秒

バイナリ列について、
VBならStrConv(str,vbFromUnicode)でできるのですが・・

もとのデータをつなげて文字列として、
MidBで1バイト単位で取り出し、
そのAscBを取得して、
バイト配列をRedim Preserveして・・・
ってやっていったらうまくいきませんかね?

相変わらず試していない(汗)

あさ さん 2003年 06月 13日 12時 04分 50秒

>syuさんへ
うぅ〜ん。
その辺になると、HTAやったこと無いので、私もわかりません(汗)
誰かフォローお願いします(笑)
「/」がついてしまうのは謎ですが、消すならReplaceとかで出来ると思います。


>じゅんさんへ
バイナリ列を作る方法、私も探して見ましたが、難しいですね。
StrConvでも使えれば、いけそうな気がするのですが・・・
WSHではStrConvなくなってるし・・・

> Buffer = "&H01,&H02,&H03"
は、さすがに間違ってると思いますね^^;;
やるなら、
Buffer(0) = &H01
Buffer(1) = &H02
Buffer(2) = &H03
な感じでしょうか。でも動きませんでした。
WSHは全てVariant型なので厄介です。

ちなみに、じゅんさんが見ているページはここかな?
http://www.pstruh.cz/tips/detpg_binarytostring.htm
http://www.pstruh.cz/tips/detpg_read-write-binary-files.htm

ほかにもCByte、Asc、AscB、Chr等をうまく使えばいけそうな気もしますが・・・
むぅ・・・
私もわからん(笑)

じゅん さん 2003年 06月 13日 10時 28分 51秒

>Nomuさん

レスどうもありがとうございます。少し説明が足りませんでした。
WriteやSaveToFileはわかっていたですが、16進ダンプデータのバイト配列
をどう書いたらいいのかがわかりません。
下記のようにやってみたのですが、
objADOStream.Write Buffer のところで
引数が間違った型、許容範囲外、または競合しています。
となってエラーになります。

Set objADOStream = WScript.CreateObject("Adodb.Stream")
Buffer = "&H01,&H02,&H03"
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
objADOStream.Type = adTypeBinary
objADOStream.Open
objADOStream.Write Buffer
objADOStream.SaveToFile "test.bin", adSaveCreateOverWrite
objADOStream.Close

2行目のBufferのところはどう記述すればいいのでしょうか?
よろしくお願いします。

SIGNAL9 さん 2003年 06月 13日 09時 43分 29秒

もしかしたら既出かも知れませんが、WSHサイトをひとつご紹介。
http://www.interclasse.com/

ページの右側にサンプルの目次が並んでるので見てみてください。
中々に力技のスクリプトが投稿されています(ちょっと無理やり
過ぎないか?と思うものもありますが^^;)

個人的には、Graphical Classはやられたって感じ。あとHTANoid
は「お前ここまで組んだんなら完成させろよ」って感じです(笑)

syu さん 2003年 06月 13日 09時 31分 06秒

>むたぐちさん、あささん&みなさま
いろいろやってみたんですが 
Sub Note_OnClick
 Set Shell = CreateObject("WScript.Shell")
 fmame = Left(location.pathname,2) & "\folder\foler\file.ext"
MsgBox fmame
EndSub
とすると /d:\folder\foler\file.txt と最初に / が付くんですが
 / はとれないんでしょうか?

また、ShellRun につなげようと以下のようにしたんですが

Sub Notea_OnClick
  Set Shell = CreateObject("WScript.Shell")
  fmame = Left(location.pathname,2) & "\folder\foler\file.ext"
Shell.Run fmame

思いっきり的はずれなことやってるんでしょうか?
いろんなサンプルみると
---省略---
Sub SelectMenu_OnChange
If SelectMenu.selectedIndex = 0 Then Exit Sub
str = SelectMenu.value
WSH.Run str
End Sub
---省略---
なんてのもあるんでいけるかなと勝手に思ったんですが依然エラーになります。


Nomu さん 2003年 06月 13日 09時 01分 44秒

追記です。書いた後、気がつきました。
よく読むと、じゅんさんは Streamに書き出しまでは成功している
ように読めますね。
ファイルに保存できない!というステップが問題であるということでしょうか。
SaveToFileメソッドで如何ざんしょ。
(これまた試していない)

Nomu さん 2003年 06月 13日 08時 59分 16秒

試してはいませんが、(汗)先頭から単純に記述すればよいなら
objADOStream.Write Buffer
★Bufferはバイト配列を意味する
でダメでしょうか?書き込み位置を制御するなら、position プロパティとか
EOSプロパティなどが関係してくるはずです。
>WSHでバイナリファイルを扱うにはどうしたらよいか調べたら
>Adodb.Streamを使えばできることがわかりましたが、バイナリ
>の16進ダンプの値(00とかFFとかいった数字)を記述しておいて
>それをバイナリファイルとして書き出すことは可能でしょうか?

じゅん さん 2003年 06月 13日 01時 04分 35秒

WSHでバイナリファイルを扱うにはどうしたらよいか調べたら
Adodb.Streamを使えばできることがわかりましたが、バイナリ
の16進ダンプの値(00とかFFとかいった数字)を記述しておいて
それをバイナリファイルとして書き出すことは可能でしょうか?

もし可能ならどういうコードになるかご教授願えないでしょうか。

Nomu さん 2003年 06月 12日 23時 45分 02秒

達人の皆様へ質問です。
HTAがちょくちょく話題になりますが、
HTAのヘルプ(ドキュメント)って、どこにあるのでしょうか。
サンプルスクリプトを掲示しているサイトもありますが、
メソッドや開発上の注意点など、どこで情報入手しているんでしょう?
やっぱり英語サイト?
MSDNを保有しているのですが、キーワードでHTAってやっても
出てこないっす。。。

あさ さん 2003年 06月 12日 11時 09分 04秒

>むたぐちさんへ
むたぐちさん、お久しぶりです。
ご迷惑をおかけ致しました(><
とりあえず、お詫びを(汗)

で、うん。いらないと思いつつ、If文つけました(笑)
「location.pathname」・・知りませんでした(汗)
違うんですね・・・.vbsと一緒だと思ってました(^^;;;

ScriptFullNameで取得したパス以外に、普通の文字列パスから取る場合もあるかと思って・・・・・
その方が応用範囲ひろいかなぁ〜・・・と。。
とか、言い訳してみる(汗)

で、正規表現・・・必要ないですね・・・
作ってたらパスの文字列分解になってしまいました(汗)
方向を間違ったようです(笑)
でも、せっかく作ったので、お披露目(汗)

strFilePath = WScript.ScriptFullName
msgbox strFilePath

Set objRegExp = New RegExp
With objRegExp
.IgnoreCase = True
.Global = True
.Pattern = "^[A-Za-z]:[\\]?|[^\\]+\\|[^\\]+$"
Set objColMatches = .Execute(strFilePath)
End With
For Each objMatch in objColMatches
' strFolder = Replace(objMatch.Value,"\","") 'フォルダの\を消すなら
WScript.Echo objMatch.FirstIndex & chr(13) & objMatch.Length & chr(13) & objMatch.Value
Next

管理人むたぐち@ちょっとだけ さん 2003年 06月 12日 10時 49分 44秒

To: syu さん

Left(location.pathname,2) & "\folder\foler\file.ext"

見たいな感じで問題ないんじゃないでしょうか?
HTML/HTAで動作させることが前提のようなので、WScript.ScriptFullNameではなく
location.pathnameを使うことになると思います。
あささんのやり方のように、If文でパスを厳密に調べる必要はないんじゃないかと
思ったり。

> 一つ一つのSub Note_OnClick〜End Sub内に記述するようになるんでしょうか。

このくらいのコードならそれでもいいんじゃないかという気がします。
本来なら関数化すべきなんでしょうけど。

syu さん 2003年 06月 12日 10時 36分 35秒

>つちやさん & あささん

アドバイスありがとうございます。
htmlファイルは目的ファイルと同フォルダにおくことは出来ます。
で、何から何からすみませんが
ご提供頂いたアドバイスをhtmlファイルに組込む場合どうなるんでしょうか。
一つ一つのSub Note_OnClick〜End Sub内に記述するようになるんでしょうか。

管理人むたぐち@ちょっとだけ さん 2003年 06月 12日 10時 36分 16秒

つちやさんのと同じような動作をするものは、普通ならこんな感じでしょうか。

sScriptPath = WScript.ScriptFullName
sFilePath = Left(sScriptPath,InStrRev(sScriptPath,"\")) & "Readme.txt"

あさ さん 2003年 06月 12日 09時 28分 33秒

>つちやさんへ
フォローありがとうございます(汗)
「スクリプトが動いているフルパスを取得して、そのドライブを調べる」というのは、まさに、つちやさんの手そのもののつもりだったのですが、分かりにくかったですね(笑)
しかし、Replaceするという方法は思いつきませんでした。(^^;;

私は「正規表現」とか「left、mid、right」とか使って力技のつもりでした(汗)
でも、Replace使うのが一番簡単そうですね^^

・・・で、syuさんひょっとしてスクリプトの場所、同一フォルダでない?(笑)

う〜ん。
ちょっと正規表現版と文字列加工版作ってみよっかな(^^;;;

とりあえず、簡単なほうから・・・
■文字列加工版
If Mid(WScript.ScriptFullName,2,1) = ":" Then
strFilePath = left(WScript.ScriptFullName,2) & "\Folder\subFolder\" & "FileName.exe"
End If
こんなんでいいかなぁ・・・汗(動作未確認)

つちや さん 2003年 06月 12日 09時 06分 57秒

Dear syuさん、あささん

参考までに、最近個人的に使っている手ですが、
スクリプトと同じフォルダにある、たとえばReadme.txtのフルパスは、

strFilePath = Replace(WScript.ScriptFullName, WScript.ScriptName, "Readme.txt")

で求められます。そのフォルダは、

strFolderPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")

です。xxx.vbsなんて名前のフォルダ名をつけてなければいけます。
FileSystemObjectを使うよりは簡単かも。

syu さん 2003年 06月 11日 17時 07分 09秒

>あささん

そうなんですよ。相対パスで書いてみたんですがエラーになるんですね〜。
それで困ってるんです。
うまい対処法が簡単にあるような気がするんですが・・・・
見つけれません。
サンプル改造・発展系なもんで一から考えるのが大変です。

あさ さん 2003年 06月 11日 16時 40分 38秒

>syuさんへ
こんにちは、最近ここにたむろってるあさと言います。^^

とりあえず、コスイ手を一つ(笑)

WScript.ScriptFullName
とかで、スクリプトが動いているフルパスを取得して、そのドライブを調べるというのを、一番最初に思い浮かべたのですがどうでしょう。^^;;;

スクリプトの場所はCDに焼かれた所ですよね?
多分、この方法でいけると思います。
#もっとスマートな方法ないかなぁ・・・


で。ここまで書いてふと思う。(汗)
Runメソッドってフルパス指定じゃないと動かないんでしたっけ?
相対パスで指定したらどうでしょう??ダメかな?(汗)

syu さん 2003年 06月 11日 15時 59分 22秒

1年以上ぶりに投稿(質問します)佐藤と申します。
実は、以下の内容のhtmlファイルを作成しCDに焼いて配布するんですがみんながみんなCDROMドライブがE:/とは限らないですよね。そこでどのPCにも通用するにはどうすればいいんでしょうか?いろいろやってみたのですがうまくいきません。
---------------ここから---------------

<HEAD><SCRIPT type="text/vbscript" LANGUAGE="VBScript">
Sub Note_OnClick
Set Shell = CreateObject("WScript.Shell")
Shell.Run """E:/ISO_CD_02/様式集/品質・出来形管理図表/管理図.jtd"""
End Sub
</HEAD>
<BODY bgcolor="#d1d1d1">
<input type="button" value="管理図     " id="Note"><br>
</BODY>

---------------ここまで----------------
上の内容が10〜20ファイル分列記してあります。

SIGNAL9 さん 2003年 06月 11日 10時 48分 04秒

通りすがりのSIGNAL9です。
#ごぶさたしてますが、ROMってました(笑

>神さん
http://www.users.gr.jp/ml/archive/wsh/150.asp
この河端さんの記事が参考になるかもしれません。
ただ個人的には神さんの用途には多分、スクリプトよりネイティブのEXEで
実装した方がいいような気はしますが。


あさ さん 2003年 06月 11日 10時 39分 44秒

>オックンさんへ
こんにちは〜^^
せっかくここまでたどり着いたなら、このサイトの説明に全部目を通してからにしましょうね(笑)
Lesson15が参考になると思います。

で、質問の意味も良くわからないのですが、ファイルに書き込みしたいということですよね?(汗)

具体的には、
--------------------------------------------------
Set oTs2 = Fs.CreateTextFile(FileName,True)
oTs2.WriteLine "テスト"
oTs2.Close
--------------------------------------------------
な、感じでしょうか。

まず、CreateTextFileするときにファイルへのオブジェクトを取得します。
で、そのファイルに対して何かするときは、そのオブジェクトを使うわけです。

WriteLineは一行書き込むメソッドですが、それ以外にも書き込むメソッドはありますので、Helpを参照して見ましょう。

6.5用の日本語ヘルプで「Script56.CHM」というのがマイクロソフトのページからダウンロードできますので、FileSystemObjectを調べるといろいろ載ってますよ^^
たぶんこれだったと思います。
http://download.microsoft.com/download/winscript56/Install/5.6/W98NT42KMe/JA/scd56jp.exe

ヘルプの中にいっぱいサンプルもありますので、ものすごく便利です。
それでは、頑張ってくださいね^^

・・・ってひょっとして、そのコードそのものをファイルに吐き出したい(VBSファイルを生成する?)ということなのかな(汗)

オックン さん 2003年 06月 10日 15時 25分 53秒

WHSを調べていましたら辿り着くことができました。

みなさんの投稿内容から、システム日付のDayを参照して、
参照した日にちのファイル名でテキストファイルを作成するまではできました。
(参考までに書き込んでおきます)

D = Day(Date)

FileName = "D:\DayFolder\" & D & ".txt"

Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

If Fs.FileExists(FileName) Then

msgBox "すでに同名のファイルが存在しています。"
WScript.Quit
End If

Fs.CreateTextFile FileName

msgBox FileName & "を作成しました。"

そこで質問なのですが、新規ファイル作成時に、
上記スクリプトを書き込みたい(出力したい)のですが、
方法がまったくわかりません。

ご存知の方または、アイデアをお持ちの方は、
ぜひご教授願います。
(恐縮なのですが、WHS歴は2日なので、わかりやすい表現でお願いします)

Nomu さん 2003年 06月 08日 14時 29分 20秒

To AAさん、ほにょほにょさん
お二人のサンプルに釣られて
MS Agentをインストールして、試しました。
確かに面白いです。。。

ただ、Myマシン(WinXP)では、Microsoftの
サイトの実例でも、読み上げ(Text-To-Speech)
部分はうまく動作しませんでした。

何やら英文を読むと SAPI4.0とSAPI5.1が何たら
かんたら・・・ よくわからん。

ただ、英文が表示できなくても、
お辞儀してくれるだけでも結構魅力ありますね。

さん 2003年 06月 06日 19時 16分 37秒

神です。
CUIベースでCPU利用率を表示(DOS窓に表示)させる方法って、ありますか。
(次回この掲示板見るのは月曜日昼頃です)

Return