はじめまして、WSH初心者のTom
真琴さん、以下のコードをvbsファイルにコピーして実行して下さい。
ご使用のWSHのバージョンが分ります。
'===========================================================
version=ScriptEngineMajorVersion &"."&ScriptEngineMinorVersion
if version >= 5.1 then
MsgBox "WSH 2.0を使用してるで。"
else
MsgBox "エンジンが古すぎるで。"
end if
'===========================================================
皆さん、はじめまして、よろしくお願いします。
既出の質問であれば、ごめんなさい。
で、早速、質問なんですが、WSHで「共通関数などの他のファイルをインクルード」
したいのですが、その方法を教えて下さいませんでしょうか?
HPとかで、色々と調べてはみたのですが、結局、解決できませんでした。
XMLとかいうのを、勉強しなきゃいけないんでしょうか・・・?
また、調べている最中に、色んなページに、「インクルードは、WSH2.0 から
出来るようになった」と書いてあったのですが、現在使っているWSHのバージョン
がいくつなのかを知る為には、どういう操作をすればいいのでしょうか?
合わせて、教えてください。
では、よろしくお願いします。
レジストリキーを削除したいのですが、
サブキーがあるとRegDeleteではエラーと
なってしまいます。サブキーも一括して削除したい
のですが、何か方法をしっている方
アドバイスお願いします。
はじめて投稿させて頂きます。はじめまして。
このページでVbsを勉強させて頂きました。
管理人さんありがとうございます。
この後はリファレンスを見ながらすこしづづ知識を
強化していきたいと思います。
さて、Vbsを学んだ後にJscriptも出来れば学びたいなと思っています。
JavaScript勉強用のページはあまたにありますが、
htmlファイル外から使用しているJScriptのサンプルや
お勉強用のページは色々探しましたがほとんど見つけられません。
みなさんの中でJScriptの勉強に有益なページをお知りでしたら
お教え願えないでしょうか。英語のページでも頑張って勉強しますので
お知りでしたらどうかお教え下さい(もちろん日本語の方がベターですが)。
書き込み初でいきなり頼み事と言うのもぶしつけですが、
どうかよろしくお願いします。
あさ さん こんにちは
>■VB Net(ディスク、ドライブ関係)
>http://www.mvps.org/vbnet/code/disk/index.html
サイトの紹介ありがとうございます
チラッとしか見ていませんが、
色々な情報がありそうですね
英語でなければ、良かったのですが・・・
何とか頑張って見たいと思います
うぅ。
結局・・・・つくっちゃったよねぇえぇぇぇぇぇ〜(笑)
むたぐちさんのクラスの紹介に合わせて、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
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
>むたぐちさんへ
有用な情報ありがとうございます^^
でも、クラスって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で表示される文字から取得するしかないので、当然、表示されない値は取得できません。
後、頑張って自分で作って下さいね。誰も作ってくれませんよ^^
でわでわ。
#最近説教多くなってきたな(汗)
●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演算子で指定するのはクラス名ではなく、あくまでコンストラクタなので。
アドバイス頂いた内容が、pingの成功か失敗しか取得できません。
2000を使用しているのですが、時間取得方法あれば教えてください。
XPは.ResponseTimeで取得できました。ありがとう御座います。
>WSHでネットワークの接続速度を取得したいのですが
>プログラムがわかりません。
> DOSコマンドなら、ping、tracert等在るのですが
>誰かご存知の方教えてください。
>あさ さん へ
早速、ありがとうございます
>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では
技術的な掲示板は無かったようなので、
ディスク 状況 基本/論理
の取得が無いようなのですが、これらの取得はどうすれば可能でしょうか?
こちらの掲示板に質疑してよいかちょっと迷いますが
よろしくお願い致します
>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/
>ぐちやまさん
初めまして^^;;
え〜と・・・すみません。質問の意味が良く分かりません。^^;;;
もうちょっと具体的に書いてもらえると、ほかの方も答えようがあるかと思います。
まず、「何がしたい」のかと「何がわからない」のかは、最低限、他の方が読んで分かるように書いてください。
で、もし作りかけのスクリプトなどがあれば、それも貼り付けてください。
後、せっかくなので、「使う」だけでなく「理解」して下さいね。
分かっていると思いますが、ぐちやまさんのやりたい事をここでお願いして、誰かがそれを作ってくれることを期待はしないで下さいね。
多分。誰も作ってくれませんよ(^^;;;
>あさ さんへ
期待どおりの動作をしています。
ありがとうございます。
他サイトの掲示板よりレスが早くビックリです。
今後ともよろしくお願いします。
>あさ さんへ
期待どおりの動作をしています。
ありがとうございます。
他サイトの掲示板よりレスが早くビックリです。
今後ともよろしくお願いします。
WSHでネットワークの接続速度を取得したいのですが
プログラムがわかりません。
DOSコマンドなら、ping、tracert等在るのですが
誰かご存知の方教えてください。
いつもお世話になっています
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では無理そうですし
全くわかりません
きっと、変な質問をしていると思いますがよろしくお願い致します
始めまして。だれか教えて下さい。
アクティブなフォルダウィンドウに、フォルダまたはテキストファイルを新規作成するにはどうすればいいんですか?テキストファイルは作成したら開いた状態にしたいです。アクティブウィンドウのパスを取得してそこに作らせればいいかもと思いましたが、チンプンカンプンでそんなこと可能なのかすらわかりません。なにとぞご教示ください。
このサイトの実用スクリプトを使ってみて初めてwshなるものを知りました。すごい便利ですね。
Nomuさん、あささん、むたぐちさん
いろいろためになる情報ありがとうございます。
やはり、バイト配列を作るのは簡単ではないのですね。
たるさん作のCByteArray関数でうまく書き込むことができました。
BASP21もいろいろなことができそうなので研究してみます。
どうもありがとうございました。
>むたぐちさん&みなさん
>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に出来れば警告も出ずにスマートになるため
トライはしたんですが断念しました。いずれは何とかしたいですけど。
>オックンさんへ
すっかり、忘れていました(汗)
と、いうことは、こんな感じでいいのかな?
さくっと簡単に作って見ました。
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)で表現できます。
大変レスが遅くなりすいませんそして、
つたない文章力なのに、
ご親切な忠告とアドバイスありがとうございました。
>そのコードそのものをファイルに吐き出したい(VBSファイルを生成する?)ということなのかな(汗)
予想されている通りです。
掲示板に書き込んだコードを、作成されるテキストファイルに吐き出したいのです。
>SIGNAL9さんへ
私も紹介サイト見せていただきました^^;;
私は、Self modifying scriptに驚きました。
こんなこと、考えたこともなかったので、脳みそひっくりかえる感じです(笑)
>むたぐちさん
コンポーネントは探せばいろいろありますよね^^;;
でも、BASP21とかは使わずに、標準機能だけで済ませたいと思うのは私だけでしょうか(笑)
SelectはIsも使えませんよね。あんまり使いませんが(笑)
あと、私は「On Error GoTo **」が使えないのが痛いです。
VBでNextよりもよく使ってたので。。
まぁ、言い出すときりがないですね(笑)
ちなみに、VBSにはVBのStrConv関数はないですが、
BASP21にはStrConvメソッドが用意されてます。
こういうイヤらしい機能縮小は勘弁してもらいたいですよね。
Select Case内でToが使えなかったり…。
ぬは、やはりそうですか(泣
しかし、CByteArrayすごいですね。(^^;;;
ASCIIテーブルも自前、SJIS=>EUC変換も自前で作ってあるし(驚)
BASP21は有名ですね^^;;
使ったことないので、そんな機能があるとは知りませんでした^^;;
MS Agent・・・はやってないので、私はあまり興味を持っていなかったりします(笑)
だので、質問にも答えれなかったり(汗)
しっかし、むたぐちさん幅広くご存知で・・・(汗)
いろいろWSHで検索していたら、11の発言見つけてしまいました(笑)
To: syu さん
/ がつく原因は私にもちょっとわかりません。
MsgBox location.pathname とすると何と表示されます?
ついでに location.href も試していただけるとありがたいです。
Runメソッドに関しては、当たり前ですが引数がちゃんとしてないとエラーになりますよ。
実行するファイルをそのまま直に記述してRunしてやってもエラーがでるんでしょうか?
あと、WScript.Shellは通常のHTML内ではセキュリティ関係で動作しないか、警告が出るんですが、
そのあたりはクリアーされてるんでしょうか?
ちなみにセキュリティの問題は、単に拡張子をhtaに変えるだけでスルーされます。
(Windows版IE5以上の環境に限る)
To: SIGNAL9 さん
ページ紹介ありがとうございます。
また読ませていただきますね。
しかし、Graphical Classか…。doodle2はどうなってしまうんですか?(w
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)って感じで作れます。
バイナリ列について、
VBならStrConv(str,vbFromUnicode)でできるのですが・・
もとのデータをつなげて文字列として、
MidBで1バイト単位で取り出し、
そのAscBを取得して、
バイト配列をRedim Preserveして・・・
ってやっていったらうまくいきませんかね?
相変わらず試していない(汗)
>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等をうまく使えばいけそうな気もしますが・・・
むぅ・・・
私もわからん(笑)
>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のところはどう記述すればいいのでしょうか?
よろしくお願いします。
もしかしたら既出かも知れませんが、WSHサイトをひとつご紹介。
http://www.interclasse.com/
ページの右側にサンプルの目次が並んでるので見てみてください。
中々に力技のスクリプトが投稿されています(ちょっと無理やり
過ぎないか?と思うものもありますが^^;)
個人的には、Graphical Classはやられたって感じ。あとHTANoid
は「お前ここまで組んだんなら完成させろよ」って感じです(笑)
>むたぐちさん、あささん&みなさま
いろいろやってみたんですが
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
---省略---
なんてのもあるんでいけるかなと勝手に思ったんですが依然エラーになります。
追記です。書いた後、気がつきました。
よく読むと、じゅんさんは Streamに書き出しまでは成功している
ように読めますね。
ファイルに保存できない!というステップが問題であるということでしょうか。
SaveToFileメソッドで如何ざんしょ。
(これまた試していない)
試してはいませんが、(汗)先頭から単純に記述すればよいなら
objADOStream.Write Buffer
★Bufferはバイト配列を意味する
でダメでしょうか?書き込み位置を制御するなら、position プロパティとか
EOSプロパティなどが関係してくるはずです。
>WSHでバイナリファイルを扱うにはどうしたらよいか調べたら
>Adodb.Streamを使えばできることがわかりましたが、バイナリ
>の16進ダンプの値(00とかFFとかいった数字)を記述しておいて
>それをバイナリファイルとして書き出すことは可能でしょうか?
WSHでバイナリファイルを扱うにはどうしたらよいか調べたら
Adodb.Streamを使えばできることがわかりましたが、バイナリ
の16進ダンプの値(00とかFFとかいった数字)を記述しておいて
それをバイナリファイルとして書き出すことは可能でしょうか?
もし可能ならどういうコードになるかご教授願えないでしょうか。
達人の皆様へ質問です。
HTAがちょくちょく話題になりますが、
HTAのヘルプ(ドキュメント)って、どこにあるのでしょうか。
サンプルスクリプトを掲示しているサイトもありますが、
メソッドや開発上の注意点など、どこで情報入手しているんでしょう?
やっぱり英語サイト?
MSDNを保有しているのですが、キーワードでHTAってやっても
出てこないっす。。。
>むたぐちさんへ
むたぐちさん、お久しぶりです。
ご迷惑をおかけ致しました(><
とりあえず、お詫びを(汗)
で、うん。いらないと思いつつ、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
To: syu さん
Left(location.pathname,2) & "\folder\foler\file.ext"
見たいな感じで問題ないんじゃないでしょうか?
HTML/HTAで動作させることが前提のようなので、WScript.ScriptFullNameではなく
location.pathnameを使うことになると思います。
あささんのやり方のように、If文でパスを厳密に調べる必要はないんじゃないかと
思ったり。
> 一つ一つのSub Note_OnClick〜End Sub内に記述するようになるんでしょうか。
このくらいのコードならそれでもいいんじゃないかという気がします。
本来なら関数化すべきなんでしょうけど。
>つちやさん & あささん
アドバイスありがとうございます。
htmlファイルは目的ファイルと同フォルダにおくことは出来ます。
で、何から何からすみませんが
ご提供頂いたアドバイスをhtmlファイルに組込む場合どうなるんでしょうか。
一つ一つのSub Note_OnClick〜End Sub内に記述するようになるんでしょうか。
つちやさんのと同じような動作をするものは、普通ならこんな感じでしょうか。
sScriptPath = WScript.ScriptFullName
sFilePath = Left(sScriptPath,InStrRev(sScriptPath,"\")) & "Readme.txt"
>つちやさんへ
フォローありがとうございます(汗)
「スクリプトが動いているフルパスを取得して、そのドライブを調べる」というのは、まさに、つちやさんの手そのもののつもりだったのですが、分かりにくかったですね(笑)
しかし、Replaceするという方法は思いつきませんでした。(^^;;
私は「正規表現」とか「left、mid、right」とか使って力技のつもりでした(汗)
でも、Replace使うのが一番簡単そうですね^^
・・・で、syuさんひょっとしてスクリプトの場所、同一フォルダでない?(笑)
う〜ん。
ちょっと正規表現版と文字列加工版作ってみよっかな(^^;;;
とりあえず、簡単なほうから・・・
■文字列加工版
If Mid(WScript.ScriptFullName,2,1) = ":" Then
strFilePath = left(WScript.ScriptFullName,2) & "\Folder\subFolder\" & "FileName.exe"
End If
こんなんでいいかなぁ・・・汗(動作未確認)
Dear syuさん、あささん
参考までに、最近個人的に使っている手ですが、
スクリプトと同じフォルダにある、たとえばReadme.txtのフルパスは、
strFilePath = Replace(WScript.ScriptFullName, WScript.ScriptName, "Readme.txt")
で求められます。そのフォルダは、
strFolderPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
です。xxx.vbsなんて名前のフォルダ名をつけてなければいけます。
FileSystemObjectを使うよりは簡単かも。
>あささん
そうなんですよ。相対パスで書いてみたんですがエラーになるんですね〜。
それで困ってるんです。
うまい対処法が簡単にあるような気がするんですが・・・・
見つけれません。
サンプル改造・発展系なもんで一から考えるのが大変です。
>syuさんへ
こんにちは、最近ここにたむろってるあさと言います。^^
とりあえず、コスイ手を一つ(笑)
WScript.ScriptFullName
とかで、スクリプトが動いているフルパスを取得して、そのドライブを調べるというのを、一番最初に思い浮かべたのですがどうでしょう。^^;;;
スクリプトの場所はCDに焼かれた所ですよね?
多分、この方法でいけると思います。
#もっとスマートな方法ないかなぁ・・・
で。ここまで書いてふと思う。(汗)
Runメソッドってフルパス指定じゃないと動かないんでしたっけ?
相対パスで指定したらどうでしょう??ダメかな?(汗)
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です。
#ごぶさたしてますが、ROMってました(笑
>神さん
http://www.users.gr.jp/ml/archive/wsh/150.asp
この河端さんの記事が参考になるかもしれません。
ただ個人的には神さんの用途には多分、スクリプトよりネイティブのEXEで
実装した方がいいような気はしますが。
>オックンさんへ
こんにちは〜^^
せっかくここまでたどり着いたなら、このサイトの説明に全部目を通してからにしましょうね(笑)
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ファイルを生成する?)ということなのかな(汗)
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日なので、わかりやすい表現でお願いします)
To AAさん、ほにょほにょさん
お二人のサンプルに釣られて
MS Agentをインストールして、試しました。
確かに面白いです。。。
ただ、Myマシン(WinXP)では、Microsoftの
サイトの実例でも、読み上げ(Text-To-Speech)
部分はうまく動作しませんでした。
何やら英文を読むと SAPI4.0とSAPI5.1が何たら
かんたら・・・ よくわからん。
ただ、英文が表示できなくても、
お辞儀してくれるだけでも結構魅力ありますね。
神です。
CUIベースでCPU利用率を表示(DOS窓に表示)させる方法って、ありますか。
(次回この掲示板見るのは月曜日昼頃です)