HIMITU さん (HIMITU@HIMITU) 2000年 03月 22日 12時 19分 57秒

WScript.ShellのRunメソッドに関して教えて下さい。

"objWshShell.Run strCmdL, 1, True"
を実行した場合、"strCmdL"のコマンド長が影響を受けます。
strCmdLが486Byte以内の場合→正常
strCmdLが487byte以上の場合→VBSで書き込みできません、とエラーになる。

ご教授いただきたく。

HIMITU さん (HIMITU@HIMITU) 2000年 03月 22日 12時 01分 14秒

"WScript.Shell"オブジェクトのRunメソッドで
コマンドを起動したいのですが、
このコマンド長が問題でして、
objWshShell.Run strCmd, 1, True
の、strCmdに486Byteまではコマンド起動できるのですが、487文字超になると
以下のエラーが発生します。
”VBScript実行エラー 書き込みできません。”

ちなみに、言語はVBSです。

どなたかご存知ですか?


管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 21日 03時 46分 41秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: Smiff さん

>  もちょっと、そのShellオブジェクトのことについて教えていただけませんか。

「オブジェクトの解説」に一通り解説してます。
英語でならMSのサイトにリファレンスもあります。

Smiff さん (smiff@yahoo.co.jp) 2000年 03月 20日 07時 27分 55秒

To:むたぐちさん

 へぇ〜Shellオブジェクトなんてぇのがあるんですか。今僕はここで教えて
もらったWSH2.0といっしょにダウンロードしたドキュメントと、オーム社発行
のWSHクイックリファレンスという本を頼りにしているんですが、どちらにも
このShellオブジェクトというのは出てこないんですよねぇ。ひょっとしたら、
またここのどっかに隠れとるのかしらん。
 もちょっと、そのShellオブジェクトのことについて教えていただけませんか。

 なんせ不精者なもんで、このhpに来ても掲示板だけつついてすぐ帰ってしま
う暮らししかしてないんです。m(_"_)m
 世の中知らないことが多すぎる・・・

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 20日 07時 07分 36秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: Toshiki さん

> 今、起動しているアプリケーションを終了させるにはどうしたらよいのでしょうか?

var WshShell = new ActiveXObject("WScript.Shell");
if (WshShell.AppActivate("title")) {
WshShell.SendKeys("%{F4}");
}

こんなかんじでしょうか。
ウィンドウをアクティブにしてAlt+F4を送っているだけです。

"program"を指定すると、何故かデスクトップがアクティブになりますね。
そのため、Windowsの終了ダイアログがでます。

Toshiki さん 2000年 03月 19日 04時 48分 49秒

下記書き込みについて自己レス

指定したアプリが起動しているかどうかは
> WshShell.AppActivate("program");
で判別できました、お騒がせしてスイマセン。

しかし、未だにアプリを終わらす方法がわかりません。

Toshiki さん 2000年 03月 19日 04時 16分 30秒

はじめまして、たった今から WSH の習得に励んでいるものです。

Javaスクリプトしかわからないので、JSでやっているのですが、
今、起動しているアプリケーションを終了させるにはどうしたらよいのでしょうか?

また、指定したアプリケーションが起動しているか判別する方法なんかもありましたら教えてください。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 18日 18時 24分 44秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: kia さん

> 書いてみました。こんな感じでどうでしょう。
> http://www.geocities.co.jp/SiliconValley-PaloAlto/5042/xstring.html

目から鱗でした。英数記号なんてたかだか数十なんだから、全部書き出してしまえば
良かったんですね。正規表現とか文字コードとか、難しく考えすぎでした。

それにしても、独自のメソッドを定義できるとは…。
JScriptはやっぱりいいですね。

To: Smiff さん

>  ファイルのタイムスタンプを取得する事は簡単なんですが、今ごみ箱
> (c:\recycled)の整理をスクリプトにやらせようとして、そのフォルダにある
> ファイルのタイムスタンプではなく、削除した日を取得したいんです。

FileSystemObjectは、仮想ファイルシステム(勝手に命名)にアクセスできませんので、
Shell.Applicationでやりましょう。

C:\Recycledは、エクスプローラで見たときと、DOSプロンプトなどで見たときでは
中身が違います。Shell.Applicationが前者の立場で、FileSystemObjectが後者の
立場でアクセスすると考えて、ほぼ間違いないでしょう。

以下に挙げるのは、30日以上前にごみ箱に入れたファイルを抹消するスクリプトです。
といっても、かなりお粗末ですが。

Const ssfBITBUCKET = 10
Set Shell = WScript.CreateObject("Shell.Application")

Set objRecycled=Shell.Namespace(ssfBITBUCKET)
For Each obj In objRecycled.Items
dd=DateDiff("d",objRecycled.GetDetailsOf(obj,2), Now)
If dd >= 30 then
msg=Msgbox (objRecycled.GetDetailsOf(obj,0) & "は、削除してから" & dd & _
"日経過してます。" & vbCrLf & "削除しますか?",vbYesNoCancel)
If msg=vbYes Then
obj.InvokeVerb "削除(&D)"
ElseIf msg=vbCancel Then
Exit For
End If
End If
Next
MsgBox "終了"

GetDetailsOfの第一引数にはFolderItemオブジェクト、第二引数には
フォルダを「詳細表示」したときのカラムの番号を指定します。
ごみ箱では、「名前」=0 「元の場所」=1 「削除した日」=2 となります。

実行するとわかるんですが、スクリプトが「削除するか?」と聞いた後、今度は
エクスプローラが「削除するか?」と聞いてきます。
スクリプトのメッセージを削ると、エクスプローラの削除確認ダイアログが
いっぺんに表示されてしまいます。
(もちろんFileSystemObjectでDeleteは不可能です)

「削除確認を出さないで削除する方法がない」ことと、「複数ファイルを一度に
削除する方法がない」ことが問題です。これはどうしようもないんじゃないでしょうか。

recycle.httを見ても、「これらの項目を元の場所に戻す」では、選択されたファイルの
コレクションであるFolderItemsコレクションに含まれる、各FolderItemオブジェクトを
順にInvokeVerbして実現しています。つまり、FolderItemsコレクションには
InvokeVerbがないわけです。
「元に戻す」は確認メッセージが出ないので、これでもいいわけですが。

>  あれれ?全角のかぎかっこがまずいのか。

そんなはずはないと思うんですけどねえ。
何かが起きているのか?

Smiff さん (smiff@yahoo.co.jp) 2000年 03月 18日 07時 32分 58秒

 あれれ?全角のかぎかっこがまずいのか。

ファイルのタイムスタンプではなく、削除した日を取得したいんです。

 たびたび失礼致しました。m(._.)m>all



Smiff さん (smiff@yahoo.co.jp) 2000年 03月 18日 07時 27分 57秒

 あれ?おかしいなぁ。名前が全角になっちゃいましたね。でかいつらしてしまいました。(^_^;)

 それに本文も一部化けてしまいました。しかも要の1語がゥ・

ファイルのタイムスタンプではなく、∈鐔「靴親。を取得したいんです。
                 ~~~~~~~~~~~~
でした。


Smiff さん (smiff@yahoo.co.jp) 2000年 03月 18日 07時 21分 19秒

 またまた教えていただきたいことが出てきてしまいました。

 ファイルのタイムスタンプを取得する事は簡単なんですが、今ごみ箱
(c:\recycled)の整理をスクリプトにやらせようとして、そのフォルダにある
ファイルのタイムスタンプではなく、∈鐔「靴親。を取得したいんです。
 SpecialFoldersの中にもごみ箱ってないんですよね。(・_;)

 ご参考までに、やってみたスクリプトです。
------------------------------------------------------
'ごみ箱フォルダ内の30日以上前のファイルを抜き出す
option explicit

dim objfs 'File system object
dim objfolder 'ごみ箱フォルダオブジェクトをセット
dim objoldlist
dim objf
dim prevdays 'const
dim i
dim str

prevdays = 30 '経過日数
set objfs = createobject("scripting.filesystemobject")
set objfolder = objfs.getfolder("C:\RECYCLED")
Set objoldlist = CreateObject("Scripting.Dictionary")
i = 0
for each objf in objfolder.files
'ファイルのタイムスタンプをチェック
'タイムスタンプでなく、削除した日を取得する必要がある。
if DateDiff("d", objf.DateLastAccessed , Now) >= prevdays then
objoldlist.add i, objf
i = i + 1
end if
next
if i = 0 then
msgbox "Old file is not found"
wscript.quit
end if
str = ""
i = i - 1
do while i >= 0
str = str & objoldlist.item(i).name & " " & vbtab &_
objoldlist.item(i).DateLastAccessed & vbcrlf
i = i - 1
loop
msgbox str, vbokonly, "ごみ箱の中の古いファイル"
wscript.quit

kia さん (kia@geocities.co.jp) 2000年 03月 18日 06時 59分 54秒

こんにちは。

>sakuraさん
書いてみました。こんな感じでどうでしょう。
http://www.geocities.co.jp/SiliconValley-PaloAlto/5042/xstring.html
↑ここの終わりのところです。
ではでは。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 17日 03時 31分 47秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: タナカ さん

> 具体的にセキュリティのどこを変更すればよいのでしょうか?

HTMLファイルはどのセキュリティーゾーンで開かれていますか?
ブラウザの右下に表示されるのがセキュリティーゾーンです。
このセキュリティーゾーンに対応したゾーンのセキュリティ設定をおこなってください。

具体的には、「レベルのカスタマイズ」で、「ActiveXコントロールとプラグイン」以下を
すべて「有効にする」にします。
もちろんこれでセキュリティは最低になります。インターネットゾーンには適用しないでください。
該当するサイトを「信頼済みサイトゾーン」にし、このゾーンの設定を緩くすると良いでしょう。

なお、ローカルでHTMLファイルを開くと、「マイコンピュータ」というセキュリティゾーンが
適用されます。このゾーンは、通常、セキュリティ設定のカスタマイズができません。
レジストリをいじることで、カスタマイズができるようになるのですが、おすすめしません。
(IEのHTML表示コントロールを使ったメーラなどで、セキュリティ上の問題が出るかも
しれないので)

ローカルで実行する場合は、拡張子を.htaにして、HTAとして実行させるのがいいと
思われます。この方法だと、ActiveX実行の警告は出ません。(IE5が必要)

To: sakura さん

> JScriptネタの質問(^^;)なのですがよろしいでしょうか?

JScriptはよくわからないので、満足には答えられませんが…。

JScriptなら、AYAさんの"趣味のJavaScriptなページ"で
回答が得られるかもしれません。
http://member.nifty.ne.jp/aya/index.htm

> 2バイト文字(speak等の2バイト英字)を半角(speak)にしたいのですが、
> toLowerCaseでは効きませんよね。(元のまま通してしまう)

私の発想だと、"全角"英字の文字コードからいくらかマイナスして"半角"英字に
します。
でも、正規表現が使えれば、そちらの方がいいですね。(私にはやり方がわかりませんが)

# WSHではUnicodeが使われているので、"全角"英字も"半角"英字もみな2バイトですね。

sakura さん 2000年 03月 16日 06時 18分 22秒

おはようございます。
JScriptネタの質問(^^;)なのですがよろしいでしょうか?

2バイト文字(speak等の2バイト英字)を半角(speak)にしたいのですが、
toLowerCaseでは効きませんよね。(元のまま通してしまう)
なんとか半角英字にしたいのですが、なにか良い手立てがありましたらご教示願います。

タナカ さん (s-tanaka@m2.sys.to.casio.co.jp) 2000年 03月 15日 09時 58分 51秒

むたぐち様:
教えていただいたやりとりを拝見させていただきました。
そこで以下のように修正したところ動作するようになりました。

Set WSHShell = CreateObject("WScript.Shell")
WSHShell.Run "C:\winnt\notepad.exe"

ですが、ブラウザに画面を出して最初の1回目のクリック時にのみ
「このページのソフトウェア(ActiveXコントロール)のいくつかは
安全でない可能性があります。実行しないことをお勧めします。実行を
許可しますか?」
と聞かれてしまいます。
で、書き込みにございましたとおり、IEのセキュリティ関係だと思い、
イントラネットの項目に関してすべて「有効」に変更してみました。
ですが、依然とし上記ダイアログが表示されてしまいます。

具体的にセキュリティのどこを変更すればよいのでしょうか?

よろしくおねがいいたします。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 15日 09時 16分 37秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: Dive-Master さん

> HP の方は、明日の夜( 出来るだけ早く )公開するつもりでいます。

すでに公開されてますね(^^;
後ほどお伺いします。

To: タナカ さん

> 以下のように HTML を作成し、ブラウザ上でクリックしたら
> notepad.exeが起動することを期待したのですが、
> 「ページでエラーが発生しました」と出て実行できません。

ポイントは、「CreateObjectメソッドではなく、関数を使う」ことと、
「ブラウザのセキュリティ設定」です。
詳しくは、
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list7.shtml
の、VFRさんの発言からはじまるやりとりを見ていただければわかると思います。
(これはFAQですね。ニュースグループでも…)

To: 寺島 さん

> 教えてもらいたいことがありますが、htmlからhtaを呼び出す方法はありませんか。呼び出そうとすると、保存かその場で開くが表示されてしまいます。

普通にリンクを張ればいいのでは?
<a href="nantoka.hta">Click!</a>
私のところでは、ダイアログは表示されませんが…。
(むしろ私の方が異常なのかも。普通のHTMLと同じ扱いを受けているようです。
MIME型の登録がおかしいのだろうか。application/htaになっているんですが…??
他のみなさんはどうですか?)

http://www.asia.microsoft.com/japan/developer/workshop/author/hta/overview/htaoverview.asp
によると、.htaへのリンクをクリックし、「その場で開く/保存」ダイアログから開く
方式を、「Web モデル」というらしいです。

ところで、このページに書いてある方法だと、いちいちIEを立ち上げて「開く」必要があります。
(ダウンロード時に確認のダイアログを出さない設定にしておけばいいんでしょうが…)
mshta.exeは引数にURLを指定できるので、
mshta.exe http://www.nantoka.com/nantoka.hta
というショートカットを作ってやればいいのに…。(これだと関連ファイルが参照できないのかも?)

HTMLからHTAをmshta.exeで直接立ち上げるには、タナカさんのコードのように、WshShell.Runを
使うしかないと思います。
で、通常のセキュリティ設定なら、これは動作しないわけですが…。

HTAを配布するには、私のようにアーカイブにしておき、それをダウンロードさせるのが
一般的かなと思います。(パッケージ モデル )



寺島 さん (densan-p@avis.ne.jp) 2000年 03月 15日 01時 21分 30秒

WSHを勉強中でいろいろ調べていたらここにたどりつきました。
教えてもらいたいことがありますが、htmlからhtaを呼び出す方法はありませんか。呼び出そうとすると、保存かその場で開くが表示されてしまいます。
何かいいやり方があれば教えてほしいのですが。

タナカ さん (s-tanaka@m2.sys.to.casio.co.jp) 2000年 03月 14日 22時 50分 14秒

非常に基本的なことを質問していると思うのですが
ご教授願います。
以下のように HTML を作成し、ブラウザ上でクリックしたら
notepad.exeが起動することを期待したのですが、
「ページでエラーが発生しました」と出て実行できません。

以下の環境で試しましたがダメでした。
Win2000 + IE5
Win98SE + IE5

どこを修正すればよいのでしょうか?
------------------
<html>
<HEAD>
<TITLE></TITLE>

</HEAD>
<BODY>
<INPUT TYPE=BUTTON LANGUAGE="VBScript" VALUE="Click Here for a Message!" NAME="TestButton">
</body>

<SCRIPT LANGUAGE="VBScript">
Sub TestButton_OnClick()
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "notepad.exe",1,True
End Sub
</SCRIPT>


</html>

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 13日 02時 20分 46秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: HIRO さん

> TESTしてみてうまく動いてくれました。これで日々のルーチンワークから開放され意義のある仕事をして世の中に貢献できそうですm(__)m

良かったです。
これで私*も*世の中に貢献したことになるのかな(笑)

To: くいち さん

>  resource タグに書いたら公開されないかな?などと考えて、
> いろいろ試してみましたが、うまくいかず、結局諦めました。

MSのニュースグループ(英語)で質問してみると、答えが得られるかもしれませんね。
一般ユーザーだけではなく、MSのプログラマらしき人物が購読されているようなので。

> (こうなったら、逃げていたIDLの書き方を勉強しなくては・・・)

IDLって何でしょう??

> (もっと進めるとプレゼンテーション層とビジネスロジックの切り離し?
> が出来て非常に良いです。)

WindowsDNAですね。(よくわかってない > 自分)

> > ぜひ、↓の新開発(?)のソートを使ってください!

あ、そういえばあのソートですが、JSのソートに使う関数でごちゃごちゃ
書いてますが、
function sortnum(x,y)
{
return(x - y);
}
でもいいですね。
JSは、数字の文字列("2"とか)を算術演算にかけると、数字として解釈してくれます
ので、便利ですね。(さすがに普通の文字列を入れるとエラーになりますが)

> (多次元のソートは難易度高いですね。頑張ってみます。)

VBSからJSに多次元配列を渡すのは簡単ですが、JSに渡された時点で1次元に
なってしまいます。
また多次元の配列に戻す必要があるし、その結果をVBSに戻すのがまた面倒です。

Dive-Master さん (Dive-Master@m2.people.or.jp) 2000年 03月 13日 00時 53分 23秒
URL:http://www.people.or.jp/~Dive-Master/

はろはろ Dive-Master ですぅ〜

こちらに伺うのが、大夫“久しぶりぃ〜”状態になってしまいましたね。
その間に、リンクを作っていただいたり
貴重な意見を頂いたりで、感謝に耐えない気持ちですぅ〜

HP の方は、明日の夜( 出来るだけ早く )公開するつもりでいます。
が、初期公開予定のコンテンツは全て出来そうもありません。
#完全な見切り発車になりましたぁ〜

公開記念のプレゼントに関してですが
むたぐちさん( & ちゃぶーんさん )には
OS でも良いかなと…思っていますぅ〜
#別に買ったわけでもないのでぇ…

とりあえず、書き込みだけしていただければ
メールにてご連絡しますので
その時に決定しましょう!

では、また後ほどぉ〜

くいち さん 2000年 03月 12日 17時 44分 06秒

むたぐち様、RESありがとうございました。
(こちらのRESが遅くなりまして申し訳ありません。)

> WSCにはHTMLヘルプがあるのは、ご存じですよね。
> それに詳しい.wscファイルの仕様が載っています。

> 公開方法は載っていますが、定数に関してはないようですね。なんででしょう?

 やはりないですね。
 resource タグに書いたら公開されないかな?などと考えて、
いろいろ試してみましたが、うまくいかず、結局諦めました。
(こうなったら、逃げていたIDLの書き方を勉強しなくては・・・)

> WSCにちょっと興味がわいてきましたが(笑)

 WSCは、結構便利で、何か使い回しが出来そうな部品を作るたびに
WSCにしてます(おかげでWSCだらけ)。

 あと、ASPで、表示以外の処理をWSCにして切り離しておくと、
ASPが読書きしやすくなります。
(もっと進めるとプレゼンテーション層とビジネスロジックの切り離し?
が出来て非常に良いです。)

 リモートコンポーネントにも出来るようなので、Webのクライアント
サイドでも有効だと思います。

> ぜひ、↓の新開発(?)のソートを使ってください!

 ありがとうございます。参考にさせていただきます。
(多次元のソートは難易度高いですね。頑張ってみます。)

HIRO さん 2000年 03月 12日 02時 12分 08秒

管理人様、早速のレスありがとうございました。
TESTしてみてうまく動いてくれました。これで日々のルーチンワークから開放され意義のある仕事をして世の中に貢献できそうですm(__)m
残念ながらMicrosoft社の製品ではなく、Delphiで組まれた超マイナーなアプリなので、対応していないようです。
これからもこのHPで勉強させて頂きたいと思います。


管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 12日 01時 05分 31秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/


To: HIRO さん

> あるサーバアプリケーションをWSH2.0のAppActivate、SendKeys等を使用して無人で運用できるようにしたいと思っています。ある処理が完了して、特定の名前のWINDOWがオープンするのを待つ処理を考えているのですが初心者なので思いつきません。

Dim ret
Set WshShell = WScript.CreateObject("WScript.Shell")
Do While ret=False
ret=WshShell.AppActivate("AppTitle")
wscript.sleep 100
Loop

のような処理でどうでしょう。

AppActivateメソッドは、引数にだいたい一致したウィンドウタイトルが見つかると、
それをアクティブにし、Trueを返します。見つからないときはFalseを返します。
(返値についてはまったくundocumentedですね。このAppActivateメソッドのヘルプの
説明は滅茶苦茶なので、基本的に信用してはいけません(^^;)
この「だいたい」というのが問題で、上の例だと、「AppTitle - hoge.ext」というタイトルが
他にあれば、そちらがアクティブになることもあります。
さらに、Windows98では、Zオーダーの処理の仕方がWindows95と異なっているようで、
アクティブにならず、タスクバーが点滅するだけのことがあります。
つまり、あまり当てにならないものだとも言えるでしょう。

そのサーバアプリケーションが何かはわかりませんが、オートメーションで各種操作を
おこなえるオブジェクトを利用できないでしょうか。
(具体的には、WSHからCreateObject関数/メソッドでオブジェクトを作成して利用)
たぶん、WSH本来の理念(?)から言うと、こちらの方法が推奨されるのでしょうね。
Microsoft製のアプリなら、大抵利用できるんですが…。

To: のぼりお さん

> これを読む限り、HTMLでのページとIFRAME間のやり取りは制限されているようなので、
> HTAファイルで作ろうと思います。ローカルファイルへのアクセスするため一石二鳥です。

普通のHTMLでは制限がかかっているわけですか。そういえば、これに関したセキュリティホールが
騒がれたことがあったような…? Cross Frame問題? これではないですか?
HTAでは、その点、アクセスの許可をフレームに与える手段があるので、この問題は
解消されますね。
でも、例のフレームの履歴をさかのぼるコードをHTAで動かしてみると、「アクセス拒否」の
エラーは出ないものの、何も起こりませんでした。

のぼりお さん 2000年 03月 11日 12時 59分 59秒

むたぐちさん、レスありがとうございます。

>確認ですが、iDisplayはiframeタグのidですよね?
すみません、よく分からない書き方を説明してました。iDisplayはIFRAMEのNAME属性で指定してました。

HTAファイルならフレームのアクセスが出来るようなので、
このサイトのリンクにあるkiaさんのページを見に行くと下記のリンクにIFRAMEのAPPLICATION属性についてのコメントがありました。

http://www.asia.microsoft.com/japan/developer/workshop/author/hta/overview/htaoverview.asp

これを読む限り、HTMLでのページとIFRAME間のやり取りは制限されているようなので、
HTAファイルで作ろうと思います。ローカルファイルへのアクセスするため一石二鳥です。

このサイトすごく参考になります。ありがとうございました。

HIRO さん 2000年 03月 11日 12時 16分 55秒

あるサーバアプリケーションをWSH2.0のAppActivate、SendKeys等を使用して無人で運用できるようにしたいと思っています。ある処理が完了して、特定の名前のWINDOWがオープンするのを待つ処理を考えているのですが初心者なので思いつきません。過去ログも見たつもりなのですがあったら申し訳ありません。
よろしくお願いします。

Tomo さん (tomo1-h@geocities.co.jp) 2000年 03月 11日 10時 11分 03秒
URL:http://www.geocities.co.jp/SiliconValley/9964/

>管理人さん

 ありがとうございました。動きました。これからも、何かあったらちょくちょくおじゃまします。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 10日 18時 55分 29秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: のぼりお さん

> 「戻る」、「進む」は「アクセスが拒否されました」というエラーが出て、実行できません。
> window.iDisplay.history.go(ix); <-エラー

確認ですが、iDisplayはiframeタグのidですよね?

window.frames.iDisplay.history.go(ix);を試して
みてください。(私がやってみたところでは、やはりうまくいきませんでしたが…)
(それと、JavaScriptだったら、frames("iDisplay")とする必要があるかも?)

もしかすると、IEには、もともとフレームのhistoryというのはないのかもしれません。
フレームのwindowオブジェクトでは不可で、親ウィンドウのwindowオブジェクトでしか
historyにアクセスできない、
すなわち、window.historyでしか参照できないのではないでしょうか。

> >注意点としては、frame要素のApplication属性を"yes"にしておくことです。
> というのがもしかして関係あるのでしょうか?

これは、HTAにおいて、フレーム内のHTMLから親ウィンドウのHTAにアクセスする権限を
与える、という意味です。通常のHTMLでは指定しても効果がありません。

> children等を使っていろいろやってみたのですが分かりませんでした。

iframeは、body要素のchildrenに当たるので、body要素にid属性をつけて(仮にbdyMainとでも
しておく)、bdyMain.children.iDisplayでアクセスできます。(これはWindowオブジェクトを
返すのでは*ない*ことに注意。返されるのは、iframe要素のオブジェクトです。)
window.iDisplayだと、srcプロパティなどが参照できません。(エラーになる)

のぼりお さん 2000年 03月 10日 15時 50分 28秒

はじめまして。のぼりおといいます。

HTMLの書き方で質問があります。
IFRAMEタグをページに入れておき、IFRAMEをある程度操作したいと考えています。
ボタンを配置して、クリックすると指定のアドレスに飛ぶということは出来たのですが、
window.iframe.location.href = url;

「戻る」、「進む」は「アクセスが拒否されました」というエラーが出て、実行できません。
window.iDisplay.history.go(ix); <-エラー

下の方でむたぐちさんの言われている、
>注意点としては、frame要素のApplication属性を"yes"にしておくことです。
というのがもしかして関係あるのでしょうか?
children等を使っていろいろやってみたのですが分かりませんでした。

よろしくお願いします。

Smiff さん (smiff@yahoo.co.jp) 2000年 03月 10日 07時 28分 34秒

To:管理人むたぐち さん

>詳しくは「WSH2.0の新機能」を参照してください。
>「WSH技術情報」でもぼやいてますね(笑)

 おっと、どっちもまだ見てなかった(^_^;)

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 10日 02時 33分 02秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: Smiff さん

>  って、なんかエレガントじゃない・・・もっとましなやり方ないですか?>all

WSH2.0をインストールしましょう。
詳しくは「WSH2.0の新機能」を参照してください。
「WSH技術情報」でもぼやいてますね(笑)

WSH1.0のときは、私もバッチファイルを使うしか方法が思いつきませんでした。
他にも、ターゲットを"wscript.exe hoge.vbs"としたショートカットを作り、
それにD&Dする案もあったのですが、Windowsのショートカットは、D&D時に
オプションを無効にしてしまう仕様になっていて、これではうまくいきませんでした。

Smiff さん (smiff@yahoo.co.jp) 2000年 03月 09日 23時 07分 39秒

スクリプトファイルへのドラッグ&ドロップ

 wscript.argumentsを使って、引数として手渡されたファイル名のファイルをアクセスするスクリプトを作ることができたという話は先日書きましたが、そのスクリプトのターゲットになるファイルの拡張子のフォルダオプションのアクションのひとつとして、

wscript "スクリプトファイル" "%1"

というのを関連付けしておくと、ターゲットになるファイルのコンテキストメニューからそのスクリプトを起動できるようになるわけです。

 しかし、もうひとつやれればと思うことは、スクリプトファイルにターゲットファイルをドラッグ&ドロップして処理できないかということなんです。
 そこでSmiff君考えた。もうひとつバッチファイルを作るのです。たとえば次のようなスクリプトとバッチファイルを作成します。

<test.vbs>-----------------------------------------
option explicit

dim args
set args = WScript.Arguments
msgbox args(0)
wscript.quit
-----------------------------------------------------
<test.bat>-------------------------------------------
wscript "test.vbs" "%1"
-----------------------------------------------------

とこうしておいて、ターゲットファイルをtest.batのほうへドラッグ&ドロップすれば、めでたくtesut.vbsに引数として渡すことができるのであります。

 って、なんかエレガントじゃない・・・もっとましなやり方ないですか?>all

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 09日 00時 34分 20秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

●Shell.Application続報
http://msdn.microsoft.com/library/psdk/shellcc/Shell/Objects/IShellDispatch2/IShellDispatch2.htm
に、ShellオブジェクトのWin2000で拡張された機能一覧があります。

ShellExecute(sFile [,vArguments] [,vDirectory] [,vOperation] [,vShow])
sFile:ファイルのパス
vArguments:コマンドラインオプション
vDirectory:たぶん、作業フォルダ
vOperation:右クリックメニューのアクション名(FolderItemオブジェクトのinvokeVerbメソッド参照)
vShow:ウィンドウの表示。WshShell.Runと同じ

他に、CanStartStopService、IsServiceRunning、ServiceStart、ServiceStopというサービス関係の
メソッド・FindPrinterメソッド(プリンタを探すダイアログを出す?)・
GetSystemInformationメソッド(CPUのクロック数、メモリの容量などの他に
なぜかDoubleClickTimeなんてのがある)・ShowBrowserBarメソッド(IEオブジェクトにもあるが…)
が追加されています。興味がある方は見てみてください。

●テキストファイルビューア(HTA)の進行状況
>フレーム間で、変数を共有するにはどうすればいいのだろう…。
と言っていましたが、ようやくやり方がわかりました。
ポイントは、window.parent.procAのような書き方で、親ウィンドウのスクリプトのプロシージャが
実行できるという点です。
これで、スクリプトはすべて.htaに集められます。(各フレームのファイルでは、onclickなどのイベント
だけを記述しておき、.htaのプロシージャを呼び出す)
これで、.hta内の変数をどのフレームからも参照できることになります。
…文章ではわかりにくいかな?

注意点としては、frame要素のApplication属性を"yes"にしておくことです。

逆に、子ウィンドウへのアクセスは、window.frames.frmtextのような感じです。

ところで、.htaでframe要素にアクセスするのに一つ注意点があります。たとえば
<frame src="files/file.htm" APPLICATION="yes" name="text" id="frmtext" scrolling="auto">
にアクセスするのに、
msgbox frmtext.srcではエラーになります。正しくは、
msgbox frsmain.children.frmtext.src
のようにします。(frsmainは、frameset要素のid)
これがわからなくて、ずいぶん苦労しました。

さて、新バーションも、基本的な部分は完成しました。あとはいろいろ機能をつけていくだけです。
手元には、実装したい機能のメモがあります。本当にできるんだろうか(^^;

To: Smiff さん

>  今まで、わずかなドキュメントを便りに悩んでいましたが、これからはここへちょくちょくお邪魔しようかと思います。

ちょくちょくと言わずに、しょっちゅういらっしゃってください(^^;
たしかに公式なドキュメントは少ないので、ちょっと複雑なことをやろうと思うと
やり方がわからなくてあきらめてしまうことがあると思います。
そんな方々のお力になれればな、と思ってます。

マニアックな話題は大歓迎ですが、ちょっとわからないことでも遠慮なく聞いてください。
(といっても、一応公式なドキュメントには目を通してくださいね(^^;)

To: tomo さん

> エラーが表示されて動きません。教えてください。

こういう質問をするときは、どういうエラーが出るのかを併記しておくとGoodです。

本題ですが、まずhead要素内にscript要素を記述し、中に以下のスクリプトを入れてください。

Sub Window_OnLoad()

Dim MidiFileName(2), MidiFileNo
MidiFileName(0) = "midi0"
MidiFileName(1) = "midi1"
MidiFileName(2) = "midi2"
Randomize
MidiFileNo = Int(Rnd*3)
bgsound1.src = MidiFileName(MidiFileNo) & ".mid"

End Sub

次に、同じくhead要素内に、
<bgsound src="midi0.mid" id="bgsound1">
を記述します。

あと、MidiFileNo = Int((2 - 1 + 1) * Rnd + 1)ですが、これだとMidiFileNo=0に
なることは絶対にないので、Int(Rnd*3)に変えました。

なお、bgsound要素は、IE専用らしいので、ネスケでは意味がないと思います。
http://www.people.or.jp/~Dive-Master/ (Dive-Masterさんのページ)に、
ブラウザの種類によって、書き込むタグの種類を変えるスクリプト(JavaScript)が
使用されていますので、参考にしてみてください。

>  あと、イベントは何にすればいいんでしょうか。Body onLoad?

↑のスクリプトでは、Windowオブジェクトのonloadイベントで実行させていますが、
<body onload="playmidi()">
でもいいと思います。その場合は、Sub Window_OnLoad()のかわりに Sub playmidi()としてください。

tomo さん (tomo1-h@geocities.co.jp) 2000年 03月 08日 19時 18分 20秒
URL:http://www.geocities.co.jp/SiliconValley/9964/

 はじめまして、Tomoといいます。

 たぶん、とても初歩的な質問だと思いますが、よろしくお願いします。HP内で、ページがロードされたときに、MIDIのBGMをランダムで再生するようなスクリプトを作りたいのですがうまくできません。
 MSDNライブラリを読みましたが、わかりません。今、理解している範囲で書いてみましたが、エラーが表示されて動きません。教えてください。
 あと、イベントは何にすればいいんでしょうか。Body onLoad?


Function Button1_onClick()
Dim MidiFileName(2), MidiFileNo

MidiFileName(0) = "midi0"
MidiFileName(1) = "midi1"
MidiFileName(2) = "midi2"

Randomize

MidiFileNo = Int((2 - 1 + 1) * Rnd + 1)

BGSOUND.src = MidiFileName(MidiFileNo) & ".mid"

End Function

Smiff さん (smiff@yahoo.co.jp) 2000年 03月 06日 22時 46分 05秒

 はじめまして、Smiffと申します。

 何とかwshをファイルの整理に使いたいと思っていて、つい先日コマンドライン引数(WScript.Arguments)の扱いかたが分かって胸をなで下ろしている今日このごろです。
 今まで、わずかなドキュメントを便りに悩んでいましたが、これからはここへちょくちょくお邪魔しようかと思います。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 06日 12時 37分 18秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

ADSIって、Win98版もあるのね(^^;
日本語版もちゃんとあります。
http://www.microsoft.com/NTServer/nts/downloads/other/ADSI25/default.asp

ただ、スタンドアロンなWin98にインストールしてもあまり意味がないです。
(インターフェースに過ぎないので、Active Directoryなどのディレクトリサービスを
構築しているネットワークにログオンしていないと意味がない)

#でも、タイプライブラリが登録されるので、それはそれで良いのかも…。

ADSIについては、http://www.galliver.co.jp/writing/nikkei_tokushu/wad002/index.html
で勉強しましょう。Active Directory自体の説明もあります。

チャブーンさんの
http://www.kissnet.ne.jp/~chaboon/tipsGAI1.html
を先に読んでおいた方が、より理解が深まると思います。

To: 三浦 さん

> WSHを勉強中ですが、デバッガをしたいのですがやり方を教えて下さい。

1) http://www.asia.microsoft.com/Japan/Developer/Scripting/default.htm
からリンクをたどり、スクリプトデバッガ(ie401dbg.exe)をダウンロードし、インストールする。
WSHは2.0以上(Windows Script5.1)が必須。

2-a) コマンドラインから、
cscript.exe //X C:\hoge.vbs
を実行する。
wscript.exe //X C:\hoge.vbs
でもOK。

これで、スクリプトデバッガのウィンドウが開き、デバッガ内でスクリプトの実行が可能。
スクリプト中に、
stop
という行を入れておくと、そこで実行が一時中断する。

2-b) コマンドラインから、
cscript.exe //D C:\hoge.vbs
を実行する。
wscript.exe //D C:\hoge.vbs
でもOK。

これで、エラーが発生したとき、あるいはstopという行があったときのみ、デバッガが開く。

2-c) WSFファイルをデバッグするには:
1.レジストリエディタで、
HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settingsキーの、JITDebugという
DWORD値を、0から1に変更する。

2.<job>要素のすぐ下の行に、
<?job debug="true" ?>
と記述する。

3-a. hoge.wsfを普通に実行する。エラーがあるとデバッガが開く。

3-b. wscript.exe //X C:\hoge.wsf
を実行する。
スクリプトデバッガのウィンドウが開き、デバッガ内でスクリプトの実行が可能。

とまあ、スクリプトデバッガを立ち上げるのは結構ややこしいです。
しかも、上に挙げた中にはundocumentedなことも含まれています。

以下、余談…

ところで、WSFファイルの<?job ?>要素には、debugパラメータの他に、errorパラメータ
というのがあります。これの働きがよくわかりません。

ヘルプより:
>通常、製品ではバッチ ファイルの実行時にエラーは表示されません。ただし、Windows スクリプト コンポーネント ファイルの開発中には、ファイル内のエラーが通知されると便利な場合もあります。次のエラー通知を指定することができます。

これは嘘なんですが(実際はデフォルトでエラー表示されるし、
errorパラメータに何を指定してもエラーは表示される)、よく見るとこの文面って変です。
>ただし、Windows スクリプト コンポーネント ファイルの開発中には
ってところです。それはWSCですよね。

で、WSCのヘルプ(<?component?>要素)を見ると、こんなことが書いてある。
>スクリプト コンポーネントは、COM コンポーネントとして使用されるため、実行時にエラーがあっても通知されないのが一般的です。ただし、スクリプト コンポーネント ファイルの開発中には、ファイル内のエラーを通知させる方が便利です。次の種類のエラー通知を指定できます。

ん?一部、全く同じことが書いてありますね。
ということは、<?job ?>の方のerrorパラメータは、<?component?>のerrorパラメータと混同している
可能性が出てきました。つまり、<?job ?>の方のerrorパラメータは実際には存在しない、
という仮説です。みなさんはどう思われますか?

この辺の事情も含め、「WSH2.0の新機能」にいろいろ加筆しておきました。

Takashi Ito さん (ito_t@mm.bch.east.ntt.co.jp) 2000年 03月 06日 10時 31分 55秒

管理人むたぐちさん

コメントありがとうございました。
無事解決できました。

> 実行したのですが以下のエラーメッセージが出力され実行できません。
>
> エラー;ActiveXコンポーネントはオブジェクトを作成できません;'WScripteShell'

過去に同じ質問がありました。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list7.shtml
の、VFRさんの発言からはじまるやりとりを見ていただければわかると思います。
ちょっと寄り道もしてますけど、結局解決したので、まあじっくり読んでください(^^;

三浦 さん (miura@system-in.co.jp) 2000年 03月 05日 13時 09分 39秒

WSHを勉強中ですが、デバッガをしたいのですがやり方を教えて下さい。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 04日 02時 34分 08秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

↓のソートですが、Executeステートメントを使う代わりに、Eval関数を使う手も
あります。

arr=Eval("Array(" & VBArrayTest (arr).toString() & ")")

まあ、同じことなんですけど、いかにも「関数を代入しています!」という感じがしていいかも。

To: Takashi Ito さん

> 実行したのですが以下のエラーメッセージが出力され実行できません。
>
> エラー;ActiveXコンポーネントはオブジェクトを作成できません;'WScripteShell'

過去に同じ質問がありました。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list7.shtml
の、VFRさんの発言からはじまるやりとりを見ていただければわかると思います。
ちょっと寄り道もしてますけど、結局解決したので、まあじっくり読んでください(^^;

To: くいち さん

>  なにを検索していたかといいますと、WSCでコンポーネントを作成した
> 後、定数を公開できないかと調べておりました。
> (定数=WSHの場合は、<reference>で使用します。)
> それで、こちらの「WSH技術情報」にヒットしました。

WSCについては、あのいい加減な紹介記事しかないですけどね。
検索エンジン、恐るべし。

WSCにはHTMLヘルプがあるのは、ご存じですよね。
それに詳しい.wscファイルの仕様が載っています。

(余談ですが、↓の方で私が書いた、
「なぜ、<object>要素の"reference","events"パラメータがundocumentedなのか」
を検証するため、私もこのHTMLヘルプをダウンロードしてみました。
でも、"reference","events"パラメータはやっぱりundocumentedじゃないか)

そういえば、メソッド<method>・プロパティ<property>・イベント<event>の
公開方法は載っていますが、定数に関してはないようですね。なんででしょう?

<reference>要素はWSCにもありますが、これはあくまで「他のタイプライブラリの定数を
参照する」ものですからね。

>  タイプライブラリはウィザードで作れて、メソッド・プロパティ・イベント
> は、そこに入るのですが、定数だけがどうしても分かりません。

ウィザードなんかもあるんですね。噂には聞いていましたが…。
というように、WSCはあまりよく知らないので、これ以上のことはわかりません。
WSCにちょっと興味がわいてきましたが(笑)
DHTML Behavior スクリプト コンポーネントとか、楽しそうです。

>  特にソート、私は2次元配列のソートを考えるのが面倒で
>  力技(バブルソート?)で書きました。

ぜひ、↓の新開発(?)のソートを使ってください!
まだ1次元ソートしか作ってませんが、工夫次第で多次元ソートも可能でしょう。
JSのVBArrayオブジェクトは、多次元配列を読み込ませると、1次元配列に
変換されてしまうので、結構大変かもしれませんが。

#最初から最後までJSで書けば…という声が聞こえてきた(爆)

To: 高瀬 さん

> frame page のなかの tag をWSH-VBS で探し出す
> にはどうすればよいのでしょうか? 

2000年 03月 03日 00時 53分 48秒 の私の発言を見てください(^^;
そう、私もここでつまずいているのです。
本当に、どうにかしたいですね。

高瀬 さん (takase@ewb.dec.com) 2000年 03月 03日 18時 00分 49秒

お世話になります。

frame page のなかの tag をWSH-VBS で探し出す
にはどうすればよいのでしょうか? 

毎回愚問ですがよろしくお願いします。

高瀬 

くいち さん 2000年 03月 03日 16時 14分 13秒

はじめまして、くいち と申します。

 Windows Scripting Components(WSC) について、検索しているうちに
ここにたどり着きました。

 よろしくお願いします。

 なにを検索していたかといいますと、WSCでコンポーネントを作成した
後、定数を公開できないかと調べておりました。
(定数=WSHの場合は、<reference>で使用します。)
それで、こちらの「WSH技術情報」にヒットしました。

 タイプライブラリはウィザードで作れて、メソッド・プロパティ・イベント
は、そこに入るのですが、定数だけがどうしても分かりません。
 何か情報がありましたら教えてください。

# ずっと過去ログを読んでいたのですが、強力なのがたくさんありますね。
 特にソート、私は2次元配列のソートを考えるのが面倒で
 力技(バブルソート?)で書きました。
 そんなものを書く前にこちらを発見できていれば・・・。

Takashi Ito さん (ito_t@mm.bch.east.ntt.co.jp) 2000年 03月 03日 13時 59分 47秒

むたぐちさん

コメントありがとうございます。

>To: Takashi Ito さん
>
> HTMLファイルから、WSHのファイル(*.vbs)を起動(実行)したいのですが、簡>単な方法を教えてください。
>
><script language="vbscript">
>Set WshShell=CreateObject("WScript.Shell")
>WshShell.Run "C:\hoge.vbs"
>Set WshShell=Nothing
></script>
>
>これで実行できますけど、それなら最初から
><script language="vbscript" src="hoge.vbs">
></script>
>とした方がいいかも。

実行したのですが以下のエラーメッセージが出力され実行できません。

エラー;ActiveXコンポーネントはオブジェクトを作成できません;'WScripteShell'

Takashi Ito さん (ito_t@mm.bch.east.ntt.co.jp) 2000年 03月 03日 13時 59分 36秒

むたぐちさん

コメントありがとうございます。

>To: Takashi Ito さん
>
> HTMLファイルから、WSHのファイル(*.vbs)を起動(実行)したいのですが、簡>単な方法を教えてください。
>
><script language="vbscript">
>Set WshShell=CreateObject("WScript.Shell")
>WshShell.Run "C:\hoge.vbs"
>Set WshShell=Nothing
></script>
>
>これで実行できますけど、それなら最初から
><script language="vbscript" src="hoge.vbs">
></script>
>とした方がいいかも。

実行したのですが以下のエラーメッセージが出力され実行できません。

エラー;ActiveXコンポーネントはオブジェクトを作成できません;'WScripteShell'

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 03日 13時 12分 17秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

>WSH2.0のヘルプには、VBSからJSの関数を実行する例がありますが、値を渡したり、
>返値を参照する例は(たぶん)ありません。ちょっと研究が要りそうです。

参照する例は、ありました。
(Windows Scripting Hostチュートリアル→Windowsスクリプトファイルの使用)
文字列をJSに渡して、文字列を参照する例ですが…。

で、JSには、VBArray オブジェクトというそのものズバリなオブジェクトがありまして、
これが使えます。


とりあえず、見よう見まねでサンプル完成。まず、文字列ソートの参考例です。

<job>
<SCRIPT LANGUAGE="JScript">

function VBArrayTest(vbarray)
{
var a = new VBArray(vbarray);
var b = a.toArray();
var l = b.sort();
return(l);
}

</SCRIPT>

<SCRIPT LANGUAGE="VBScript">

arr=Array("お","あ","え","い","う") 'VBSの1次元配列作成
arr=Split(VBArrayTest (arr).toString(),",")
'JSのVBArrayTestに配列を渡し、その返値をSplit関数で、","で区切った配列に戻す。

msgbox Join(arr) 'ソートされた配列を結合して表示

</SCRIPT>
</job>

>現在、JScript 配列を VBArray に変換する方法はありません。
とヘルプにはありますが、何とか工夫しています。

JSの関数の戻り値は、VBSでは"JScriptTypeInfo"というオブジェクトで、
このオブジェクトの既定プロパティ(?)は、「カンマで各項目を区切った文字列」で
あり、toStringメソッドや、valueOfメソッドの返値と同様です。
(JSのメソッドは、引数なしでもかっこをつけるのが必須。省略すると関数そのものが
文字列として返される。それにしても、VBSからJSのオブジェクトのメソッドが実行できるのは
なんだか不思議。)
↑の例では、この文字列から、Split関数を使って強引に配列に戻しています。

*

JSの関数の戻り値を
For Each...Nextステートメントにかけると、各値が参照できます。
#下のコードは、↑のスクリプトの、VBSの部分を置き換えて実行してください。以下同様。

arr=Array("お","あ","え","い","う")
For Each item In VBArrayTest (arr)
msgbox item
Next

*

次に、元の配列を、数値の配列にすると、

arr=Array(112,2,33,783,5342.78914516)
For Each item In VBArrayTest (arr)
msgbox item & TypeName(item)
Next

を実行すると、ちゃんと型を保ったままVBSに値を返してくれていることがわかります。

*

さらに、こんな方法まで発展させました。裏技的ですが。

arr=Array(112,2,33,783,5342.78914516)
Execute "arr=Array(" & VBArrayTest (arr).toString() & ")"
msgbox join(arr)

これでJScript 配列が VBArray になってしまいます。不思議。
この方法は、最初の方法に比べて、「配列の各値の変数の型が
変化しない」というメリットがあります。
これが本命かな?

#Executeステートメントは、何か異質なステートメントですけど、
#とんでもない威力を発揮することがあります(笑)

*

あとは、sortに使うJSの関数(数値順でソート)を書くだけです。
付け焼き刃なスクリプトで恐縮ですが、こんなのを作りました。
(今度はJSの部分を置き換えてください)

function VBArrayTest(vbarray)
{
var a = new VBArray(vbarray);
var b = a.toArray();
var l = b.sort(sortnum);
return(l);
}

function sortnum(x,y)
{
if (x < y)
{
return(-1);
}
if (x == y)
{
return(0);
}
if (x > y)
{
return(1);
}
}

-1と1を入れ替えれば、昇順・降順の切り替えもできます。
これでバブルソートともおさらばです!

次は、多次元配列のソートですが、疲れたのでまた今度にします。

*

VBS+JSの組み合わせは、結構面白い分野ですね。

それにしても、VBArray オブジェクト、「ECMA に準拠しないJScript の機能」の
代表格だな(笑)

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 03日 00時 53分 48秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: kia さん

> よく知らないのですが、VBScriptからオブジェクトを直接参照できないのならば、
> アクセス用の関数を用意して・・・ということでしょうかね?

VBSでは配列は、変数扱いなんですよね…。
VBSの配列をJSに渡すとき、オブジェクトに変換(?)しないといけないわけです。
(Join関数で文字列にして渡し、JS側で配列に戻し、ソートして、また文字列
に戻してVBSに返し、Split関数で配列にする、とか?)
WSH2.0のヘルプには、VBSからJSの関数を実行する例がありますが、値を渡したり、
返値を参照する例は(たぶん)ありません。ちょっと研究が要りそうです。

> 比較用の関数を用意すれば、好きなように並べ替えられます。

比較用の関数がどういうものかよくわかりません(JSのヘルプにも具体例はなかった)が、
その言葉を聞いて安心しました(笑)
数値の並び替えをやるのが目的ですから。

> >(いや、根本的な問題として、JScriptの文法をまず習得せねば)
> これもできるでしょう。(笑)

がんばります(^^;
以前*.httを解析した経験が役に立ちそうです。

> >(やっぱりVBSにもsort関数、concat関数が欲しいです(^^;)
> これはmicrosoft.public.*あたりでしつこく発言するとか・・・・。

VBS5.5で使えるようになっている…といいですが。

> 履歴のリストを作るのがおもしろいですね。

ちょっと遅いですが(^^;
(わざわざルートを指定すると警告を出すようにしている)
どうも、GetDatailsOfを使っているのが原因の一つのようです。

> 今はさる場所から毎日データを取ってくるのに応用しています。
> 自作のスクリプトだと好きなように書きかえられますし、
> コンテンツをいちいち解析しなくても必要なところだけ切り出せますし便利ですね。

WSHでIEをいじくる手法を、世間一般に広めたいですね。

今度、あのスクリプトを改造して、リンクを見つけてはnavigateを繰り返すスクリプトを
作ってみたいです。ネットサーフィンというより、ネット漂流(^^;
フレームの処理の問題を片づけねばなりませんが。
Set document=IE.Document
For Each frm In document.frames
msgbox frm.location
Next
これが何故動かないのか。
document.frames.lengthだとちゃんと値(フレーム数)が返ります。
しかし、document.frames(0)やdocument.frames.Item(0)などは、本来なら
Windowオブジェクトを返すはずなのに、何も値を返しません。
HTMLから直に使う場合は、うまくいくようですが、これってバグでしょうか。

あと、anchorsオブジェクトの仕様が気に入らないぞ!
ドキュメント中のすべてのAエレメントのコレクションなのはいいのですが、
"NAME=またはID=属性を持つ"という条件があるので、実際には使いものになりません。

…と思っていたんですが、MSDNライブラリを見ていると、tagsメソッドなんていう
のがあるではないですか。
Set anchors=document.all.tags("A")
これでanchorsコレクションは、Aエレメントのコレクションになります。

kia さん (kia@geocities.co.jp) 2000年 03月 02日 06時 36分 14秒

>むたぐちさん
>●スクリプト紹介
わぉ。紹介してもらえるなら、ちゃんと作るんだった。(爆)

選択領域についての情報ありがとうございます。もう少し色々試してみます。

>やってみようかな。(といっても、VBSの配列をどうやってJSに渡せばいいのか?)
JScriptの配列は基本的にただのオブジェクトです。
よく知らないのですが、VBScriptからオブジェクトを直接参照できないのならば、
アクセス用の関数を用意して・・・ということでしょうかね?

>(そもそも、文字列以外に数値でのソートはできるのか?)
これはできます。
比較用の関数を用意すれば、好きなように並べ替えられます。
オブジェクトの配列なんかもソートできます。

>(いや、根本的な問題として、JScriptの文法をまず習得せねば)
これもできるでしょう。(笑)

>(やっぱりVBSにもsort関数、concat関数が欲しいです(^^;)
これはmicrosoft.public.*あたりでしつこく発言するとか・・・・。

>IE自動操縦なるスクリプトを作りました。
履歴のリストを作るのがおもしろいですね。

私も巡回スクリプトを作ってましたが、
今はさる場所から毎日データを取ってくるのに応用しています。
自作のスクリプトだと好きなように書きかえられますし、
コンテンツをいちいち解析しなくても必要なところだけ切り出せますし便利ですね。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 02日 02時 15分 57秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: Takashi Ito さん

> HTMLファイルから、WSHのファイル(*.vbs)を起動(実行)したいのですが、簡単な方法を教えてください。

<script language="vbscript">
Set WshShell=CreateObject("WScript.Shell")
WshShell.Run "C:\hoge.vbs"
Set WshShell=Nothing
</script>

これで実行できますけど、それなら最初から
<script language="vbscript" src="hoge.vbs">
</script>
とした方がいいかも。

Takashi Ito さん (ito_t@mm.bch.east.ntt.co.jp) 2000年 03月 01日 17時 05分 51秒

WSHの初心者で、今勉強しています。

HTMLファイルから、WSHのファイル(*.vbs)を起動(実行)したいのですが、簡単な方法を教えてください。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 01日 12時 37分 04秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

●更新情報その1-オブジェクト解説
「オブジェクト解説」に、InternetExplorerオブジェクトのメンバを列挙したものを
アップしました(オブジェクトブラウザからコピーしただけとも言う(爆))。
まだ項目だけです。
これから、これを解説で埋めていかねばならないかと思うと、ちょっとブルーです(?)

というか、このままの方が見やすくていいような気がしてきた(^^;
As Stringとかいう書き方は、VBSでは未サポートだけど、引数の型が一目瞭然ですので
メリットは大きいと思います。

Documentオブジェクトをどこまで解説するかが問題ですね。
ここからDHTMLの全オブジェクトにアクセスが可能なのですが…。
CSSだってstyleプロパティでアクセス可能なので、解説する必要があるのだろうか。

●更新情報その2-ダウンロード
IE自動操縦なるスクリプトを作りました。
テキストファイルに書き出したURLを順に表示します。
お気に入りや履歴もリスト化できます。
オフラインで、キャッシュを連続表示させたりもできます。

IEをWSHから操作する教材としても使えるかもしれません。

●スクリプト紹介
kiaさんのページで、HTAで作られた簡易テキストエディタである「KEdit」が公開
されました。
http://www.geocities.co.jp/SiliconValley-PaloAlto/5042/
とにかく、メニューがいいです。一度見てみてください。

ところで、JScriptには配列のオブジェクトにsortメソッド(ソート)とかconcatメソッド
(配列の結合)とか、私が欲しくてたまらなかった機能がちゃんとあるんですね…。
WSFファイルで基本部分をVBSで書き、配列のソートをJSで書く、というのを
やってみようかな。(といっても、VBSの配列をどうやってJSに渡せばいいのか?)
(そもそも、文字列以外に数値でのソートはできるのか?)
(いや、根本的な問題として、JScriptの文法をまず習得せねば)
(やっぱりVBSにもsort関数、concat関数が欲しいです(^^;)

●なぜ、<object>要素の"reference","events"パラメータがundocumentedなのか
これに関して、microsoft.public.scripting.wshを見ていると、質疑応答がありました(^^;
いつもタイムリーに記事が投稿されるなあ(笑)
Subject: WSF & <object> element & "reference=" parameter
Message-ID: <edgPLHkf$GA.168@cppssbbsa02.microsoft.com>

結論を言うと、記述忘れらしいです。
このヘルプは、一番最後にできたものだったため、チェックが不十分だったようです。

で、WSFファイルの各XML要素は、WSC(Windows Script Component)のXMLとほぼ同一(<job>は
WSFだけ)で、WSCのドキュメントと見比べれば、WSFのヘルプで欠けている記述がわかるらしいです。
<comment>要素に至っては、要素自体の記述が忘れられています(笑)

#向こうではPRIMALSCRIPTってはやってんのかなー。

●今週のスクリプトワンポイント講座
CommonDialogで、複数ファイルを選択する方法です。
microsoft.public.jp.activexに投稿したものです。
とりあえずここでも公開しておきます。

Dim Dlg,Fs
Const cdlOFNAllowMultiselect=&H200
Const cdlOFNExplorer=&H80000

Set Dlg = WScript.CreateObject("MscomDlg.CommonDialog")
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

Dlg.Filter= "VBSファイル(*.vbs)|*.vbs"
Dlg.MaxFileSize=5000
Dlg.FilterIndex=0
'Dlg.InitDir="D:\vbs"
Dlg.Flags=cdlOFNAllowMultiselect+cdlOFNExplorer
Dlg.ShowOpen

aPath=Split(Dlg.Filename,vbNullChar) 'Null文字で区切って一次元配列作成
If UBound(aPath)=0 Then 'ファイルを一つ選択した場合
sDir=Fs.GetParentFolderName(aPath(0)) '親フォルダ取得
aPath(0)=Fs.GetFileName(aPath(0)) 'ファイル名取得
Else
sDir=aPath(0) '配列の最初がフォルダ名
End If

aPath=Filter(aPath,"\",False) '配列で、"\"がついたもの(フォルダ名)を除く
'これで、aPathには、フォルダ名を除いたファイル名が格納されていることになる

For I=LBound(aPath) To UBound(aPath)
'すべてのファイル名にフォルダ名をつけてフルパスにする
aPath(I)=Fs.BuildPath(sDir,aPath(I))
Next

msgbox Join(aPath," ")

Set Fs=Nothing
Set Dlg=Nothing

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 02月 28日 18時 53分 25秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: うしさん さん
>すごい! 本当にありごとうございます。
コピーアンドペーストは反則です(笑)

To: 【おじさま】 さん

> 手持ちのツールの中で、どれが作業用フォルダ指定が意味を持つアプリケー
> ションなのか思い付かなかったのですが、秀丸エディタを指定してやってみ
> ました。作業用フォルダが有効かどうかは別として Win2000 で動き、Win98
> (SE ではない) + IE4.01SP2 だと「オブジェクトでサポートされていない
> プロパティまたはメソッドです。」でエラーになりました。

あのIShellDispatch2クラスのメンバは、IE5+Win98であれば、オブジェクトブラウザで
見ることはできますが、実行することはできません。
Shell32.dllがVer5.0以上であることが、使える条件のようです。
ちなみに、前も書きましたが、Win2000ではFolderItemVerbオブジェクトが
(エラーが出ずに)使えるようになりました。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 02月 28日 13時 01分 32秒
URL:http://homepage1.nifty.com/~tomiyama/

管理人むたぐち さん

>Win2000をお持ちの方は、作業フォルダ指定に意味があるアプリを指定して、
>以下のコードを試してみてください。報告、お待ちしてます。

手持ちのツールの中で、どれが作業用フォルダ指定が意味を持つアプリケー
ションなのか思い付かなかったのですが、秀丸エディタを指定してやってみ
ました。作業用フォルダが有効かどうかは別として Win2000 で動き、Win98
(SE ではない) + IE4.01SP2 だと「オブジェクトでサポートされていない
プロパティまたはメソッドです。」でエラーになりました。

Return