なおすけ さん 2000年 05月 03日 14時 39分 11秒

TO:管理人むたぐちさん

ありがとうございます。
外部アプリケーションを使って、壁紙の変更をするという
発想自体ありませんでした。
言われたとおり、ためしてみたら、とりあえず、できました。
まだ、WSHを知ってまもないので、くだらない質問ばかりだと思いますが
これからも、よろしくお願いします。
どうもありがとうございました。m(__)m

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


To: なおすけ さん

> はじめまして、VBSから、壁紙の変更など、
> 出来たら、ODBCの設定まで、コントロールパネルで出来る作業を、
> ダブルクリックだけで済ませるようにしたいのですが・・・

WshShell.SendKeysで、適当なキーコードをダイアログに送ってやるというのが、
もっとも単純な方法です。

画面のプロパティを開くと、Alt+Sで画像のリストにフォーカスが移るので、
使いたい画像ファイル名が反転するまで ↓ を送り、最後にEnterを送れば
いいでしょう。

しかし、この方法だと、あらかじめ登録されているファイルしか選べません。

壁紙のファイル名を保持しているレジストリの項目を書き換えてやるという
方法もあります。
HKEY_CURRENT_USER\Control Panel\DesktopキーのWallPaperという値の名前が該当します。
WshShell.RegWriteなどを使って書き込んでやるといいでしょう。

ただし、この変更は、すぐにデスクトップに反映されるわけではありません。
再ログオン/再起動が必要になるでしょう。

一番いいのは、外部アプリケーションを併用する方法です。
私は、画像ファイルビューアにGVを愛用していますが(IrfanViewも使ってますけど)、
これには画像ファイルを壁紙にする機能があります。
GV.exe /WALL2 filename
を実行すると、Windowsフォルダにfilenameのファイルがコピーされ、それが
壁紙になります。

同じようにIEにも画像を壁紙にする機能があります。
が、この機能をWSHから利用する方法があるのか、私にはわかりません。
# ドキュメント内の右クリックメニューを実行する方法があればいいんですが。

ODBCに関しては全然知らないのですが、なんとなくADOを使えばいいのかな、
という気がします。本当になんとなく、ですので(^^; # 全く関係ないのかも

To: ぽう さん

> 今、MS-Excel のファイルを開くスクリプトを書いています。
> GetObejct を使って実行中の Excel オブジェクトを取得しようとして
> いるのですが、アクティブなウィンドウ(プロセス?)によって
> GetObejct が失敗する場合があり、期待する動作にできずにいます。

Excelを持っていないので、詳しくはわからないのですが…。

ヘルプによると、GetObject関数の第一引数は省略可能に
なっていますが、
「引数 pathname に長さ 0 の文字列 ("") を指定した場合は、引数 class も指定する必要があります。」
とあり、Set xl = GetObject("","Excel.Application")とやればいいのかな、という気が
なんとなくします。これも、なんとなく、ですけど(^^;

また、Popupを実行することでうまくいくという点から考えて、アクティブウィンドウが
関係しているのかなあ、という気がします。
WshShell.AppActivateで、Excelを、あるいは他のウィンドウをアクティブにした場合は
どうなるでしょうか。

MsgBox TypeName(xl)
の直前に、WScript.Sleepを入れるのも試してみてください。Shell(エクスプローラ)の
オブジェクトを操作していると、スクリプトの終了と同時に動作が強制的にストップ
されてしまうという現象に遭遇することがあり、今回の場合も関係あるかもしれないので。
# 今回の場合、MsgBoxでスクリプトは一時中断するので、これは当てはまらない気もしますが。

さらに、

Do While IsEmpty(xl)
Set xl = GetObject(,"Excel.Application")
Wscript.Sleep 100
Loop

などで、xlに有効な値が入るまであがいてみた場合はどうでしょう。
Do...Loopより、For...Nextで回数指定をした方がいいかもしれません。

…あまり有効な回答ではありませんでしたね。
というか、GetObjectでこういうことができるんですね(知らなかった…)。
*.htmとInternetExplorerで同じようなことはできるのかな?

ADSI/WMIで、GetObject関数自体はおなじみなんですけど(^^;

To: 初訪問です さん

> レスありがとうございます。ちょっと見落としてて
> お礼が遅れてしまいました;。すみません。

いえいえ。どういたしまして。
私がレスをまとめて書くという、横着なことをしているせいもあるでしょうね(^^;
考え直した方がいいかも…。
# 私、自作スクリプトを利用して、"To:"と引用をテンプレート化したテキスト
# ファイルを生成し、それをエディタで編集するという形を取っているので、
# まとめてレス形式になってしまうのです。

この際、ツリー式の掲示板にした方がいいんでしょうか。ツリー式は
読むのが面倒なので嫌いなんですが、いくつかのテーマのQ&Aが同時平行で
書き込まれるここでは、案外適しているのかもしれません。

To: Hamige さん

> 早速使ってみました。
> 以下のコードを作成し、共有フォルダ内で、時間をずらして同じコードを
> 実行したところ、共有違反のダイアログが表示されました。このダイアログは
> 出てしまうものなのでしょうか?それとも、私のコーディングがまずいので
> しょうか?

Subプロシージャ内では、メインルーチンで記述したOn Error Resume Nextは
効きませんので、改めてOn Error Resume Nextを記述する必要があります。

もしかすると、そのダイアログはWSHのエラーではないんでしょうか?
だとすると、ちょっと厄介ですね…。

> -----コード部--------------------------
> On Error Resume Next
> Err.Clear
> <ファイルをオープンし、読み書きする処理>
>
> -----コード部終わり--------------------
>
> 私がやりたいことは対象となるファイルが他のユーザが使用して
> いた場合、
> 1.任意の秒数待つ
> 2.ファイルのオープンを試みる
> 3.ファイルがオープンできるまで1,2の動作を繰り返す。
>
> です。「On Error Resume Next」ですと、エラー(この場合共有違反)
> のあった個所を飛ばし、次の処理にうつるような気がするのですが。
> 「On Error GoTo 〜」のようなしよう方法は可能なのでしょうか?

On Error GoTo ...は、VBSではサポート外です。
ただし、VBS5.0からはOn Error Goto 0(エラー処理を無効化)だけは記述できます。

Do
Err.Clear
WScript.Sleep 5000 '5秒待つ
-処理-
Loop Until Err.Number=0

とかで、エラーが発生しなくなるまでループを取ることは可能です。

> 色々試してみたのですが、テキストファイルの場合、他のユーザが
> 開いている間でも、何のエラーもなく開けるようでした。WordやExcelの
> 場合は、「他のユーザが使用しています」といった由のダイアログが表示
> されました。私も素人ですのでよくわかりませんが、Word等は開くと
> 同時に作成されるテンポラリファイルの有無で判断しているのでしょうか?

いえ、これは単純にファイルをロックしてあるか否かの違いでしょう。
テキストファイルでは、エディタがファイルをOpenしているのは、
保存時か読み出し時のみで、あとの時間は、どのプロセスからもファイルは
読み出せます。

# ちなみに私の愛用エディタであるEmEditorには、編集中のファイルを
# 他のプロセスからアクセスできないようにするオプションがついています。

# Win2000では、やたらに共有違反が出るんですが、こういうものなのかな?

To: 【おじさま】 さん

いつもありがとうございます。

> ありませんね(がっくり)。ファイルとかレジストリの方がこの HTA の
> 目的には適していますが、相当長い文字列も扱うことを考えればファイ
> ルが最も適しているように思います。コマンドラインと違ってクリップ
> ボードに書き込むだけではなく読み取った文字列も返せますね。

一度ファイル化して、それを読み出すというのはやっぱり非能率的というか、
あまり好ましくないのは確かです。何とかしてもっとスマートなやり方を
発見したいところです。

ところで、ファイル化するというアイデアの前には、
「VBSへの引数一つずつにそれぞれHTAを実行してやれば、コマンドライン文字数
制限にはひっかからないんじゃないか?」
という考えが浮かんだ(そして書き込もうとする寸前だった!)のですが、
これはそれこそ非能率的ですよね。

> 語でも探してみましたがないんですよね。HTA ってあんまり普及してな
> いのかな。

それは間違いないでしょう。
MSもあまり本気で作りこんだとも思えないです。
ADSIやWMIは、本当に気合というかそういうものがひしひしと伝わってくるのですが。
まあ、比較すべきものでもないんでしょうけど。

関係ないですけど、MSもいよいよ分割されるんでしょうか。
OS部門・インターネット&アプリ部門で分割すると、OS部門が
あまりにも哀れですね(^^;

OSとIEの関係が今後どうなっていくのかも、気になるところです。

To: やっさん さん

> 今回のVBSファイルはCのモジュールより呼び出されます。
> まず1つ目は、Cのモジュールより、VBSファイルを起動させる方法がわかりません。
> WSHであると、RUNメソッドによって、アプリを起動させることができますが、C
> では、どのように処理を開始させる方法があるかわかりません。

メールもいただいたのに、私からの回答ができなくてすいませんでした。
Cに関してはまったく無知です。こんなんじゃ、いけませんね。

WSHの終了コードは、WScript.Quitで指定できるのは【おじさま】さん
ご指摘のとおりです。

逆に、WSHで実行したアプリの終了コードは、WshShell.Runの返り値で
取得できます。

とまあ、今回の事例とは直接関係ないのですが、何か書いておかないといけない気がして(笑)

やっさん さん 2000年 05月 02日 18時 14分 18秒

おじさま様:

ありがとうございました。
おかげで、何とか無事に作成することができました。
教えていただいたHPの作者の方にも質問させていただきました。
実現方法は、やはりShellExecuteExでした。
これにより、VBSを実行させ、戻り値もWScript.Quit 値にて
設定し、これをC++のGetExitCodeProcess(hProcess,&dwExitCode)で参照します。ただし、戻り値を見るためにプロセスハンドルが必要なようで、SHELLEXECUTEINFOのhProcessを使って、戻り値を参照することができました。
おじさま様、本当にありがとうございました。
明日からやっと、連休を迎えることができます。
それでは、失礼いたします。
本当にありがとうございました。

やっさん さん 2000年 05月 02日 18時 14分 08秒

おじさま様:

ありがとうございました。
おかげで、何とか無事に作成することができました。
教えていただいたHPの作者の方にも質問させていただきました。
実現方法は、やはりShellExecuteExでした。
これにより、VBSを実行させ、戻り値もWScript.Quit 値にて
設定し、これをC++のGetExitCodeProcess(hProcess,&dwExitCode)で参照します。ただし、戻り値を見るためにプロセスハンドルが必要なようで、SHELLEXECUTEINFOのhProcessを使って、戻り値を参照することができました。
おじさま様、本当にありがとうございました。
明日からやっと、連休を迎えることができます。
それでは、失礼いたします。
本当にありがとうございました。

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

やっさん様

Microsoft の WSH のサイトには WSH のヘルプもありますが
お持ちではないですか。そのヘルプによれば、WScript.Quit
の後に半角スペースを1個入れてその後に数字を書けば、それ
がエラーコードとして戻るようです。

ヘルプなしで WSH を学習するのはかなり厳しいです。お持ち
でなければ

http://www.asia.microsoft.com/japan/Developer/Scripting/

からのダウンロードをお勧めします。

vbsdoc.exe VBScript のヘルプ
jsdoc.exe  JScript のヘルプ
wshdoc.exe WSH のヘルプ

ついでに WSH2.0 は ste51jp.exe です。Win2000 は最初から
これを標準装備していますが、Win98/98SE の WSH は 1.0 で
す。もしお使いの WSH が 1.0 ならばバージョンアップをお勧
めします。詳しいことは、管理人むたぐちさんがこのサイトに
記載しています。

やっさん さん (yuichi_yokoyama@neis.nec.co.jp) 2000年 05月 02日 14時 12分 42秒

おじさま様:

たくさんのレス、どうもありがとうございます。
早速、CreateProcess,ShellExecuteExについて、
教えていただいたサイトで調べてみました。
どうもありがとうございます。
Cモジュールからの呼び出しは、これでどうやらできそうです。
ただ、WScriptQuitについては、どのように実現すればよいのでしょうか?
記述の仕方が良くわかりません。
実用例か何かありましたら、ご教授ください。

Hamige さん (tmsatoh@sys.civinfo.co.jp) 2000年 05月 02日 04時 05分 14秒

管理人むたぐちさん

毎度毎度レスが送れて済みません。
ご返答ありがとうございます。

>On Error Resume Next
>としておけば、とりあえず他のユーザーによってファイルが開かれている場合に、
>ファイル操作しようとしたときのエラーを回避できると思います。
>
早速使ってみました。
以下のコードを作成し、共有フォルダ内で、時間をずらして同じコードを
実行したところ、共有違反のダイアログが表示されました。このダイアログは
出てしまうものなのでしょうか?それとも、私のコーディングがまずいので
しょうか?

-----コード部--------------------------
On Error Resume Next
Err.Clear
<ファイルをオープンし、読み書きする処理>

-----コード部終わり--------------------

私がやりたいことは対象となるファイルが他のユーザが使用して
いた場合、
1.任意の秒数待つ
2.ファイルのオープンを試みる
3.ファイルがオープンできるまで1,2の動作を繰り返す。

です。「On Error Resume Next」ですと、エラー(この場合共有違反)
のあった個所を飛ばし、次の処理にうつるような気がするのですが。
「On Error GoTo 〜」のようなしよう方法は可能なのでしょうか?

>エクスプローラは、この辺りの処理をどうしているのでしょうね。
># ただ共有違反のエラーを出すだけだろうか?

色々試してみたのですが、テキストファイルの場合、他のユーザが
開いている間でも、何のエラーもなく開けるようでした。WordやExcelの
場合は、「他のユーザが使用しています」といった由のダイアログが表示
されました。私も素人ですのでよくわかりませんが、Word等は開くと
同時に作成されるテンポラリファイルの有無で判断しているのでしょうか?

初訪問です さん 2000年 05月 02日 00時 27分 00秒

管理人むたぐち さん

レスありがとうございます。ちょっと見落としてて
お礼が遅れてしまいました;。すみません。

教えていただいた所を読んでみて、今から色々試してみるところです。
なんか、僕が読んだどの本よりも突っ込んだ事が書いてあって感心しました。

また結果報告しにきます。本当にありがとうございました。

ぽう さん (housaka@po1.cnet-na.ne.jp) 2000年 05月 01日 23時 28分 54秒
URL:http://member.nifty.ne.jp/housaka/

はじめまして。
WSH を始めたばかりで、大変参考にさせていただいています。
ありがとうございます。

今、MS-Excel のファイルを開くスクリプトを書いています。
GetObejct を使って実行中の Excel オブジェクトを取得しようとして
いるのですが、アクティブなウィンドウ(プロセス?)によって
GetObejct が失敗する場合があり、期待する動作にできずにいます。

以下、テスト用コードです。
Windows 98、WScript.Version は 5.1 です。

Run で Excel.exe を起動しているのは、CreateObejct を使うと
アドインのオープンなども自分でコードを書く必要があるためです。


On Error Resume Next

MsgBox "Excel を起動し、Application オブジェクトを取得します。(ver. " & WScript.Version & ")"

Dim xl, xl_path

xl_path = """C:\Program Files\Microsoft Office\Office\Excel.exe"" /e"

Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")

Set xl = GetObject(,"Excel.Application")
If IsEmpty(xl) Then

'実行中の Excel がない場合は新たに起動
WSHShell.Run xl_path, 5

'起動後、充分に待ちます
WScript.Sleep 5000

'Popup を表示させると次の GetObejct が成功するのですが...
'WSHShell.Popup "Excel オブジェクトを取得します", 1

'この GetObject が成功しません
Set xl = GetObject(,"Excel.Application")

End If

MsgBox TypeName(xl)
Set xl = Nothing

アドバイスがありましたら、どうかよろしくお願いいたします。

なおすけ さん (id-nao@aurora.dti.ne.jp) 2000年 05月 01日 22時 30分 25秒

はじめまして、VBSから、壁紙の変更など、
出来たら、ODBCの設定まで、コントロールパネルで出来る作業を、
ダブルクリックだけで済ませるようにしたいのですが・・・
VBSはこのHPで、勉強させてもらっているだけなので、
本屋に、めぼしい本もないので・・・
ここの掲示板の話のレベルには到底及ばないのですが、ぜひなんか
サンプルなどありましたら、教えていただきたいのですが・・・
ちなみに、やっとこ、ここまでいきました。
Set Win = WScript.CreateObject("Shell.Application")
Win.ControlPanelItem "desk.cpl"
これで、画面のプロパティまではいけたのですが、指定したファイルを
壁紙にするなど、どしたらいいのでしょうか?

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

やっさんさん

何度もごめんなさい。

どうもCから外部アプリケーションを起動するにはご紹介した
API を使うのが普通みたいです(VB みたいに簡単じゃないのね)。

http://www.d1.dion.ne.jp/%7Ekf220jp/

に ShellExecuteEx と CreateProcess を使ったCのサンプル
コードがありました。

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

やっさんさん

すみません。spawn 関数群ってどうも DOS の話のようで Windows では
分かりません。

それからご紹介した ShellExecute や ShellExecuteEx は起動させるだ
けでその後の面倒は見ません。もしも起動させたアプリケーションを監視
するならば CreateProcess という API を調べてください。

あんまり役に立たないレスでごめんなさい。

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

やっさんさん

C言語は MS-DOS の頃に使ったきりで、もう随分昔になりますので
ほとんど忘れてしまいましたし、Windows でも同じなのかどうかも
分かりませんが、C言語で他のアプリケーションを起動する場合に
は spawn 関数群(spawnv spawnl など複数の関数を含む)が使わ
れます。確か起動させたプロセスの戻り値が spawn 関数群の戻り
値だったと思います。これ以上のことはすっかり忘れてしまいまし
たのでマニュアルなどで spawn をキーワードに探してください。
また C というのが C++ のことであれば残念ながら全く経験があり
ません。

それから API を使えば言語を選びません(勿論 API が使える言語
である必要はありますが)。ShellExecute または ShellExecuteEx
が他のプロセスを起動する API です。マニュアルなどでこの API
について調べてみてください。

WSH 終了時のエラーコードは WScript.Quit で設定できたと思いま
す。

やっさん さん (yuichi_yokoyama@neis.nec.co.jp) 2000年 05月 01日 17時 06分 51秒

はじめまして、横山と申します。
この業界は、今年の4月で2年目になります。
現在、VBSによってファイル操作を行うプログラムを作成しています。
主要な処理はほぼ終了しました。
しかし、2つ問題があって、どうしても完成させることができません。
※結果、GWも会社に来ている次第です。

早速、質問させて頂きます。
今回のVBSファイルはCのモジュールより呼び出されます。
まず1つ目は、Cのモジュールより、VBSファイルを起動させる方法がわかりません。
WSHであると、RUNメソッドによって、アプリを起動させることができますが、C
では、どのように処理を開始させる方法があるかわかりません。

処理は、正常終了した場合と、異常終了した場合とに別れます。
そこで、2つ目の質問なのですが、終了結果を呼び出し側のCのモジュールに返したい
のですが、どのように実現できるのかわかりません。
実現できるコンポーネントがあるのか、それすらもよくわかりません。
以上2点の問題が原因でなかなか完成できずにいます。
はっきり言って、やや限界です。
少しでもおわかりになる方は、是非ご教授ください。
どうかよろしくお願いいたします。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 30日 11時 12分 18秒
URL:http://homepage1.nifty.com/~tomiyama/

管理人むたぐちさん

>ただ、ファイル化するというのはあんまりスマートではない気はします。

大変良いアイデアではないでしょうか。ご示唆ありがとうございます。
本来コマンドラインパラメータというのはホワイトスペースで区切って
個々のパラメータを使うものですから、与えられた文字列をクリップボ
ードにコピーする汎用 HTA と考えた場合、その文字列がコマンドライン
として与えられるというのはむしろ適していないように思います。WSH
のほうでコマンドラインパラメータだったので、HTA のほうでも最初か
らそれしか考えていませんでした。四十代も半ばになると頭に柔軟性が
ありませんね(がっくり)。ファイルとかレジストリの方がこの HTA の
目的には適していますが、相当長い文字列も扱うことを考えればファイ
ルが最も適しているように思います。コマンドラインと違ってクリップ
ボードに書き込むだけではなく読み取った文字列も返せますね。

>ただ、%?? というパスのHTAが起動しないのは、明らかなバグですよね。
>これはMicrosoftに報告しておくべきかも? # ←どこに?

良く分かりませんが、多分今の症状ってローカルのファイルだと大丈夫
でも URL だと含んではいけない文字というのがあるらしくて、IE で直
接開いたときにはそれをちゃんと判断してくれるのに、Mshta 経由だと
ローカルのファイルも URL と同じ扱いをしてしまって windows.location
.pathname をわざわざ % 付きで変換してしまうし、最初から % が付い
たファイル名だと開けないのエラーを出すということですよね。HTA の
サポートってどこなのかは私も知りません。(^^;)

ただ昨日考えていましたが、oHTA.CommandLine が最初に自分自身のパス
を含む以上(これ自体はC言語などでも含むし、おかしな仕様とも思わ
ない)それを取り除いた文字列を取得するというのはちっとも稀な事で
はなく、結構いろいろな場合に使うありふれた事ではないかと思います。
だったらどこかにサンプルがありそう・・・・でもインターネットで英
語でも探してみましたがないんですよね。HTA ってあんまり普及してな
いのかな。

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

○WMIでスケジュールを作成する話
Win2000では、ATコマンドで、コマンドをスケジューリングできます。
# 詳しくは at /?

ここで定義したスケジュールは、タスクスケジューラ(WinNT\tasks)のオブジェクト
として登録されます。(at1,at2...のように)

ただし、タスクスケジューラで設定したタスクは、ATコマンドで出力される一覧には
現れません。(イメージ的には、ATコマンド⊂タスクスケジューラという感じかな?)

さて、WMIを使えば、ATコマンドで設定したスケジュールを参照することができます。

For Each schedule In GetObject _
("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_ScheduledJob")
str=str & schedule.jobID & ". " & schedule.command & vbCrLf
Next
msgbox str

このコードで、設定されているスケジュールの一覧が表示できます。
Win32_ScheduledJobクラスにはさらにいろいろなプロパティがあり、
実行日時やinteractiveで実行されるかどうか、などの設定も参照できます。

さらに、Createメソッドでスケジュールを作成することができます。
作成したスケジュールのジョブ番号も取得できます。
Deleteメソッドによる、スケジュールの破棄も可能です。

Win32_ScheduledJobを使ってできることは、ATコマンドでできることの域を出ませんが、
各プロパティやメソッドの引数を使っての処理が可能という点においては、
ATコマンドより優れています。

いろいろな条件を加味してスケジュールを組みたい場合には、ぜひWMIを使ってみましょう。

To: 【おじさま】 さん

> ところで % ナンタラは別にして、それ以外の部分は如何なもんでしょう。
> 管理人むたぐちさんならばこういう方法ではなくこう書くのにといった部分
> はありませんでしたでしょうか。

今、思いついたんですが…。

コマンドライン文字列長の制限の件ですが、WSHからいったんファイル名一覧を
ファイル化して、それをHTA側から読み込んでクリップボードに入れてやればクリア
できると思います。

この方法だと、%20とかの問題も起こりません。

ただ、ファイル化するというのはあんまりスマートではない気はします。

> For i = &H20 To &H7F
> strDel = Replace(strDel, "%" & Hex(i), Chr(i), 1, -1, vbBinaryCompare)
> Next
>
> で文字になるアスキーコードはあれば無条件で変換すれば良いのかも。

これで、%つきの文字に置換される文字を含むパスでも、うまく実行されるように
なりました。

ただ、%?? というパスのHTAが起動しないのは、明らかなバグですよね。
これはMicrosoftに報告しておくべきかも? # ←どこに?

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

管理人むたぐちさん

もしかして

For i = &H20 To &H7F
strDel = Replace(strDel, "%" & Hex(i), Chr(i), 1, -1, vbBinaryCompare)
Next

で文字になるアスキーコードはあれば無条件で変換すれば良いのかも。

今は自宅で HTA が使えない環境にいるので試せませんが。

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

管理人むたぐちさん

デバッグまでしていただきありがとうございます。

>このぶんだと、ファイル名には使えるが、URLでは置換されてしまう文字を
>徹底的に洗い出しておく必要がありそうですね。

あっ、やっぱり。半角スペース以外にもこういうのがありそうな気がしてた
んです。うーーん、どうも MSDN ライブラリ(2000 年 4 月版というのが昨
日届きました)にもこれについての記載がなさそうだし探すのが面倒です。
インターネット上の検索もしてみましたが、どうもキーワードの設定が下手
なせいか見つかりません。逆に % があったらその後の半角2文字を文字とし
て表示できるアスキーコードかどうかチェックして、そうならば変換してし
まうとか、% + 半角2文字は1文字と決め打ちで文字数を計算するとかのほ
うが良いかもしれません。でも2バイト文字とかはどういう扱いになるんだ
ろう。ソースは難しくなくてもかなりいろいろなケースでどうなるのかを試
すのが大変そう。

ところで % ナンタラは別にして、それ以外の部分は如何なもんでしょう。
管理人むたぐちさんならばこういう方法ではなくこう書くのにといった部分
はありませんでしたでしょうか。

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

To: 【おじさま】 さん

> 楽しみにしていただけるほどのものではないです(^^;)。DHTML の仕様
> を知らないので %20 とかで悩みましたし時間も掛かりますが、同じ事
> を VB で書いた時には、私でもせいぜい1時間くらいで書けた程度の単
> 純なソースです。ちゃんとした公開予定はありませんが

早速ダウンロードさせていただきました。
…ちゃんとコピーされない…なぜ?
と思って、デバッグしてみると、意外な事実が判明しました。
[ が %5B に、] が %5D に置換されるため、HTAがこれらを含むパスの場合、
location.pathnameで取得されるパスの長さがおかしくなってしまうためです。

このぶんだと、ファイル名には使えるが、URLでは置換されてしまう文字を
徹底的に洗い出しておく必要がありそうですね。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 29日 01時 11分 21秒
URL:http://homepage1.nifty.ne.jp/~tomiyama/

管理人むたぐちさん

>オートメーションでは無理っぽいですね。

私、勤務先では Win2000 なのですが、自宅では古いノートでパワーがな
いために Win98SE や IE5.01 では使いものにならず Win98 + IE4.01SP2
なんです。だから HTA が使えず自宅では HTA で書いても動作を確認で
きません。IE そのもののバージョンが違うので完全に同じことは無理で
も、多少似たようなことだけでもできると良いのですけれどね(試しに
Mshta.exe だけノート環境にコピーして CLSID まで真似てみたけどやっ
ぱりダメでした)。

># オートメーションは、COMコンポーネントの機能のごく一部であると解釈していますが、
># 正しいでしょうか?

えっえっ、そう言われても私には良く分かりません。管理人むたぐちさん
のほうがお詳しいのでは・・・・・(^^)。

>クリップボードにコピーするツール、完成を楽しみにしてます。

楽しみにしていただけるほどのものではないです(^^;)。DHTML の仕様
を知らないので %20 とかで悩みましたし時間も掛かりますが、同じ事
を VB で書いた時には、私でもせいぜい1時間くらいで書けた程度の単
純なソースです。ちゃんとした公開予定はありませんが

http://homepage1.nifty.com/~tomiyama/osl/ojcnc.lzh

に置いておきますので興味がございましたらどうぞ。添削していただけ
ると幸いです。数日で消しますので再配布は禁止。

・.vbs と .hta を必ず同じフォルダに置きます。

・.vbs そのものか .vbs のショートカット(シュートカットは例えば
 SendTo などに置く)にファイル/フォルダ名(複数可)をドラッグ
 ドロップ。

・渡せるファイル/フォルダ名の合計文字数は、当然コマンドラインオ
 プションの文字数までなのでかなり制限があります(DOS と同じかど
 うかは調べていませんがかなり少ないです。VB で作ったものも上限は
 ありますが、それよりも更に少ない気がします)。

本家 SendToX は上限がないのではないかと思うくらい長い文字列が扱え
ます。あれはショートカットへのドラッグドロップなどとは根本的に異
なった手法なんでしょうね。

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

○WSHとWin2000のコマンドプロンプト
Win2000では、*.vbsファイル(*.js,*.vbe,*.jse,*.wsfも)は、コマンドプロンプトからは実行ファイル
扱いです。

つまり、
cscript filename.vbs
あるいは
start filename.vbs
としなくても
filename
だけで実行ができてしまいます。

cscript //H:CScript
で、既定のスクリプティングホストをcscriptにしておけば、
Wscript.Echo(エコー) や、stdIn/Out/Err(標準入力・出力・エラー出力)、あるいは
WScript.Arguments(オプションの読み取り)などを使って、ちょっとした
コンソールアプリのようなものが作れます。

filename > test.txt
のようにすると
標準出力のリダイレクトなんかも可能です。(/UオプションでUnicodeで出力も可。)
最初のロゴを出力したくないなら、
cscript //NoLogo //S
を実行しておくといいでしょう。
# 入力のリダイレクトは無理そうだが

さらに、スクリプトエンコーダで.vbs→.vbeに変換しておくと、ちょっとかっこいいかも。

IISをインストールすると、いくつか管理用スクリプトがインストールされるんですが、
こういう使い方がされるようになったんだなあ、とちょっと感動しています。
# Win2000標準状態でも、1個だけ.vbsファイルがありますね(何に使うものかは知らないが)。

To: 【おじさま】 さん

> Mshta.exe って何をやってるのか良く分かりませんが、あのサイズやア
> イコンがないところを見ると、自分自身は WebBrowser を乗せられるよ
> うなフォームやコンテナを持ったプログラムではないように思います。
> IE の見た目のプロパティを HTA:Application タグにしたがって設定し
> て、さらにセキュリティを解除してファイル名を渡すツールみたいなも
> のかもしれませんが、渡す時に余計なことしてるのかも。

そうなんですよね。
mshta.exeは、ごく簡単な処理しかしていないはずです。
(実際例のエラーメッセージはIEのものですし)

> IE を COM コンポーネントとして使う時にセキュリティを解除するよう
> なプロパティがあるのかないのかは存じませんが、そういう情報があれ

オートメーションでは無理っぽいですね。
# オートメーションは、COMコンポーネントの機能のごく一部であると解釈していますが、
# 正しいでしょうか?

> HTA ファイルのフルパス部分だけでなく渡されたコマンドライン文字列
> 全体にこの処理が影響してしまいますよね。それでも渡された文字列が
> ファイルのパスならば問題はないのですが、汎用性を考えてパスだけで
> はなく渡された文字列をクリップボードにコピーする HTA としたかっ
> たのでこの手は使っていませんでした。

そうなんですか。ファイル名に ? は使えないのであれでOKかと思っていました。

クリップボードにコピーするツール、完成を楽しみにしてます。

To: AKiOS さん

> グループ化したことにより、個別に設定していたアンカータグの style 属性
> もスタイルシートの定義で一箇所にまとめられて大変スッキリしました。

MSDNライブラリに載っていたのですが、自分では試したことがなかったのですが、
ちゃんと動いてよかったです。
VBでいうところの、コントロール配列ですね。

AKiOS さん 2000年 04月 28日 12時 09分 51秒

管理人むたぐちさん、こんにちは。

>evalを使わないでコーディングするには、
(中略)
>としておき、aオブジェクトをグループ化してはいかがでしょう?

なるほど! こんなこともできるんですね。
早速、ご教示していただいた eval() を使わない方法に修正しました。
グループ化したことにより、個別に設定していたアンカータグの style 属性
もスタイルシートの定義で一箇所にまとめられて大変スッキリしました。
ありがとうございました。

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

管理人むたぐちさん

>でも、*.htmなら%20があってもちゃんと開けます。…変なの。

window.document.url を表示させると .hta でも .htm でも同じ結果で
スペースは %20 に置換されますが(20 って半角スペースの 16 進数で
のアスキーコードが 0x20 だからかな)、window.location.pathname に
ついては違いますね。.htm だと IE が直接開いて表示は先頭に / が付
いてスペースはスペースのままで、.hta だと多分 Mshta.exe 経由で IE
が(もしかしたら WebBrowser が)開いて、先頭に / は付かないけどス
ペースは %20 に置換されてしまう。URL の決まりって良く知りませんが
半角スペースがあってはいけないんでしょうね。

Mshta.exe って何をやってるのか良く分かりませんが、あのサイズやア
イコンがないところを見ると、自分自身は WebBrowser を乗せられるよ
うなフォームやコンテナを持ったプログラムではないように思います。
IE の見た目のプロパティを HTA:Application タグにしたがって設定し
て、さらにセキュリティを解除してファイル名を渡すツールみたいなも
のかもしれませんが、渡す時に余計なことしてるのかも。

IE を COM コンポーネントとして使う時にセキュリティを解除するよう
なプロパティがあるのかないのかは存じませんが、そういう情報があれ
ば Mshta.exe 相当の機能をするものは WSH でも書けちゃいそうですね。
書く意味があるかどうかは別にして。

>逆に、objHTA.commandLineの半角スペースをいったん「ファイル名として使われる
>ことがない文字3文字」に置換して何とかしてください(^^;

HTA ファイルのフルパス部分だけでなく渡されたコマンドライン文字列
全体にこの処理が影響してしまいますよね。それでも渡された文字列が
ファイルのパスならば問題はないのですが、汎用性を考えてパスだけで
はなく渡された文字列をクリップボードにコピーする HTA としたかっ
たのでこの手は使っていませんでした。

%20 を含むパスだと HTA 自体がエラーで起動しないと分かったので、
単に window.location.pathname の %20 をスペースに置換するだけで
済みそうです。ありがとうございました。

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

To: 【おじさま】 さん

> そもそもフルパス名に %20 という文字列が含まれる HTA
> ファイルはエラーになり実行できません。

そうなんですか。…(試してみる)…本当ですね。
%20は、スペースとして解釈されてしまうため、ファイルがないというエラーになりますね。

でも、*.htmなら%20があってもちゃんと開けます。…変なの。

To: Hamige さん

> 任意の共有フォルダ内のファイルを複数のPCから、参照
> 操作するのですが、これには排他制御が必要になると思
> います。そこで、最初にファイルにアクセスした人だけ
> がファイルを操作できるようにファイルをロックしたい
> のですが、これは可能でしょうか?

On Error Resume Next
としておけば、とりあえず他のユーザーによってファイルが開かれている場合に、
ファイル操作しようとしたときのエラーを回避できると思います。

エクスプローラは、この辺りの処理をどうしているのでしょうね。
# ただ共有違反のエラーを出すだけだろうか?

To: 初訪問です。 さん

> NoDrivesというバイナリを作って値を3f 00 00 00にしたい時って

「オブジェクトの解説」→「WshShellオブジェクト」に書いてます。

ただ、Long型の数値範囲を超える値を書き込むことはできません。
その場合は、regファイルを自前で用意し、それを実行させるようにするなどの
工夫が必要です。

Win2000なら、WMIを使うと、Reg Binaryの値をバイト配列で指定できます。
(つまり、Long型の制限はない)
それについては、ついこの前この掲示板に書きました。

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

To: 【おじさま】 さん

> window.document.URL 以外に HTA ファイル自身のフルパスを知る方
> 法はあるでしょうか。

location.pathnameでも取れます(file://がつかないのでこちらのほうがいいかも)が、
やはり半角スペースが%20になってしまいますね…。
この現象は私も知りませんでした。

> それでは %20 を半角スペース1個に
> 置換すれば良いかとなると、HTA ファイルが元々 %20 という文字列
> を含んだパスである場合におかしなことになってしまいます。

逆に、objHTA.commandLineの半角スペースをいったん「ファイル名として使われる
ことがない文字3文字」に置換して何とかしてください(^^;
これでコマンドラインがとれるのではないかと思います。

tmppath=Trim(objHTA.commandline)
tmppath=Replace(tmppath,"""","")
tmppath=Right(Replace(tmppath," ","???"),Len(Replace(tmppath," ","%20"))-Len(location.pathname))
tmppath=Replace(tmppath,"???"," ")
msgbox tmppath

初訪問です。 さん 2000年 04月 27日 20時 41分 58秒

あの、いきなり質問で大変恐縮なんですが、
VBSでレジストリをいじるときに、バイナリの値の書き方って
どうやるんでしょう?
例えば、NoDrivesというバイナリを作って値を3f 00 00 00にしたい時って
"\・・Pass・・\NoDrives",「ここが分かりません」,"Reg_舗嘉リ"
この分からない部分にどう書きこめばいいんでしょう?
どなたか分かりましたら、教えてください。よろしくお願いします

Hamige さん (tmsatoh@sys.civinfo.co.jp) 2000年 04月 27日 20時 27分 29秒

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

度々質問で申し訳ありませんが、ファイル操作について
質問があります。
任意の共有フォルダ内のファイルを複数のPCから、参照
操作するのですが、これには排他制御が必要になると思
います。そこで、最初にファイルにアクセスした人だけ
がファイルを操作できるようにファイルをロックしたい
のですが、これは可能でしょうか?
マイクロソフトのWSH、VBSのリファレンスページ等、
いろいろ探しては見たのですが、その方法が見つかりま
せん。
皆様、どうかお力を貸しては頂けないでしょうか。
お願いします。

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

window.location.pathname で HTA ファイルのフルパスを
取得できました。ただしこれも半角スペースは %20 に置換
されます。やっぱり %20 を半角スペースに逆置換してやら
ないと元のファイル名になりません。

では私が気にしていた HTA ファイルそのもののパスに最初
から %20 が含まれている場合とどうやって区別するかにつ
いては、どうも考える必要がないようです。

そもそもフルパス名に %20 という文字列が含まれる HTA
ファイルはエラーになり実行できません。

これって仕様?

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 27日 19時 03分 33秒
URL:http://homepage1.nifty.com/~tomiyama/

コマンドラインに与えられた文字列をクリップボードにコピーする
HTA を書いてみましたが、oHTA.CommandLine はコマンドラインに文
字列が与えられていなくても、先頭にダブルコーテーションで囲ま
れた HTA ファイル自身のフルパス名と、その後に半角スペースが1
個付きます。実際のコマンドライン文字列はその後に続きます。

与えられた文字列だけをクリップボードにコピーするためには、こ
の先頭部分を削除してやる必要がありますが、そのためには HTA フ
ァイル自身のフルパス名の文字数が必要になります。

window.document.URL で先頭に file:// は付くものの HTA ファイ
ルのフルパスは得られるのですが、困ったことにフルパス名に半角
スペースがあると window.document.URL はそのスペース1個を %20
に置換した文字列を返します。それでは %20 を半角スペース1個に
置換すれば良いかとなると、HTA ファイルが元々 %20 という文字列
を含んだパスである場合におかしなことになってしまいます。

window.document.URL 以外に HTA ファイル自身のフルパスを知る方
法はあるでしょうか。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 27日 14時 29分 19秒
URL:http://homepage1.nifty.com/~tomiyama/

管理人むたぐちさん

>SendToXに関しては、必要ない項目を削除することもできるので、
>「クリップボード」だけを残しておけばいいのではないでしょうか。

おっしゃる通りで普通はそうしますよね(^^;)。実際 Win98 では
そうしていましたし、日本語化差分にもむしろそうしなくてはな
らないような記載があります。今回は要するにそれを承知で作っ
てみるとしたらということで・・・・お騒がせしてすみません。

>そうですよねえ。まあ、アプリケーションには必須の機能でしょうから、
>ないと困りますが。
>WSHでは標準機能として欲しかったところです。

そうですよね。WSH の標準機能としてないわけがない、きっと私
の探し方が悪いのだと相当探してしまいました。HTA にショート
カットへのドラッグドロップがないのも残念。

管理人むたぐち さん 2000年 04月 27日 12時 34分 41秒

Wnn6はわりと賢いね。

To: 【おじさま】 さん

>この「クリップボードに名前をコピー」だけは欲しいなと思いまして

infファイルでこれだけインストールさせてはいかがでしょうか。
私も、Power Toysで必要なのはSendToXと、TargetContext
Menuくらいです。(Win2000で動作していますよ)
SendToXに関しては、必要ない項目を削除することもできるので、
「クリップボード」だけを残しておけばいいのではないでしょうか。
(というか、私もそうしています)

>むしろ HTA のほうが何で window が clipboardData 持ってるんだという気がする。

そうですよねえ。まあ、アプリケーションには必須の機能でしょうから、
ないと困りますが。
WSHでは標準機能として欲しかったところです。

To: RiffRaff さん

ありがとうございます。
これはRiffRaffさんの紹介されたコンポーネントでしたね(^^;

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

RiffRaff さん

コンポーネントのご紹介ありがとうございます。

数秒違いのメッセージに記載しましたように、今回は「クリップ
ボードに名前をコピー」相当のものを、WSH のみ、または HTA の
みで作ることができるだろうかということで質問させていただき
ました。

やはりスクリプトにこだわるならば WSH と HTA の組み合わせと
いうことになりますね。これでスクリプト版を作ってみることに
します。

また宜しくお願いします。

RiffRaff さん 2000年 04月 27日 02時 15分 35秒

【おじさま】 さん へ

> WSH でクリップボードの操作は可能でしょうか(HTA だと可能
> なのですが)。

以前この掲示板でCOMコンポーネントを紹介したことがあるのですが、
その中の一つにクリップボードの機能を持つものもあります。
よろしければ過去ログで RiffRaff[2000年 04月 03日 01時 50分 38秒]
を参照してみてください。

外部のコンポーネントを利用したくない場合は私も管理人さんの紹介している
方法が現状ではベストではないかと思います。

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

管理人むたぐちさん

レスありがとうございました。やはり WSH のみ、HTA のみだと
どちらかの機能が欠けてしまいますね。

PowerToys(ご存知ですよね)に Send To Extensions(SendToX)
というのがあり、その機能の中に「クリップボードに名前をコ
ピー」というのがあります。

SendToX の機能の多くは Win2000 では標準機能になっています
し、なにせ古いツールですので Win2000 にはあまりインストー
ルしたくないのですが、この「クリップボードに名前をコピー」
だけは欲しいなと思いまして、それなら自作で、しかも GUI は
全く不要だしプログラムとしては単純ですので WSH で作ろうと
思いました。

で、クリップボードを操作するくらい WSH なら(もしくは VBS
なら)持っているだろうと思ったらいくら探しても見つからず、
結局 VB でフォームを持たないプログラムとして作ってしまいま
した。

この時には HTA でクリップボードが操作できることを知らなか
ったのですが、たまたま管理人むたぐちさんのところのリンクか
らいくつかのサイトを見ていましたら HTA でクリップボードを
操作しているツールがありまして、しかも調べてみると今回管理
人むたぐちさんも書かれた CommandLine でコマンドラインオプ
ションも取得できるということで、それなら条件が揃うじゃない
かと(本当は GUI が不要なので HTA には不向きなのですが、そ
れは最小化で起動させることでごまかして)作ってみました。

ところが「ファイル名を指定して実行」ではちゃんとコマンドラ
インオプションを読み込んで動くのですが、SendTo にショート
カットを置いてそこに「送る」をしてもショートカットへのドラ
ッグドロップに対応していないために起動してくれません。

WSH だとクリップボードがダメで、HTA だとドラッグドロップで
はコマンドラインパラメータを拾ってくれず、その両方を組み合
わせることも考えましたが、何とかどちらかの機能のみでできる
んじゃないかと質問させていただきました(既に VB では作って
あるので、それなら敢えて WSH と HTA を組み合わせてまで作る
意味がない)。

クリップボードの操作なんて HTA というよりも、いかにも WSH
に似合っている機能のような感じがします。むしろ HTA のほうが
何で window が clipboardData 持ってるんだという気がする。

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

To: 【おじさま】 さん

> WSH でクリップボードの操作は可能でしょうか(HTA だと可能
> なのですが)。

何らかのCOMコンポーネントを使えば可能です。
うちのリンクページから探してみては?

もしくは、自作するというのもありですね。
VBでActiveXDLLを作成するなら、数行のコードでいけると思います。

また、クリップボードを操作するためだけに、HTAをWSHから実行する
という手もあるんじゃないかと思います。

> HTA ファイルのショートカットへのドラッグドロップはサポー
> トされていないのでしょうか。

これは、あったら便利ですよねえ。
IE5.5ではどうでしょう? > IE5.5をインストールしている方

というか、.htaファイルのアイコンはいつ作られるんでしょうね。

コマンドラインをHTAから読み込むには、oHTA.CommandLineを使えば可能です。
VBSから、HTAを起動させるようにしておき、VBSはドロップされたファイル名を
そのままHTAの起動パラメータにしHTA起動、そのファイル名をoHTA.CommandLine
から読み取れば、お望みの動作になると思います。

To: YAM さん

> さてタイムリーなところで高瀬さんの書きこみなんですが
> 省略とかあるので判断難しいところですが、こんなことがやりたいのかな?

どうもフォローありがとうございます。

高瀬さんがされたいことは、WSHからIEを立ち上げ、IEのHTMLドキュメントを制御する、
ということでして、直にHTMLにスクリプトを埋め込むということではないのです。

To: 高瀬重人 さん

> ひとつ前の投稿はゴミです。申し訳ありません。

私の書き込みはゴミですか(泣)
# と言ってみたりする。

> これだとUNIXが選択されず、初期画面のDOS/Vのままで、"Change!"も
> 表示されませんでした。
>
> ためしに
>
> document.all.Machine.Options(1).selected=True 'UNIX選択
> document.all.Machine.Options(1).Click
>
> とやると、なぜか DOS/V (これは option(0) )が選択されて終わります。

あれ、そうなりますか。
手持ちのMSDNライブラリには、optionオブジェクトにClickイベントがあるかないのか
すら、不明瞭なんですよね。

> document.all.Machine.Options(1).Click 
> document.all.Machine.Options(1).selected=True 'UNIX選択
>
> だと、UNIXが選択されますが、やはりonchangeにならない様です。

難しいですね…。
HTML中のスクリプトをWSHから実行する方法が必要なわけですね。
どうしたものでしょうか…。

> document.all.Machine.options(1).selected=true
> document.all.Machine.onchange
>
> だと"Change!"は表示されますが、 エラー: サーバーに例外が発生しました。
> というエラーが出てしまいます。

これは結構いいところまで行っていそうですね。
なんとなく、VBSでは駄目で、JSなら可能なコードのような気がします。
いわゆる、関数ポインタというやつですね。

JSでは、
オブジェクト.イベント名=関数名
で、イベントと関数を関連付けできるのです。
document.all.Machine.onchange=document.parentwindow.onchng();
かな? よくわかりませんけど。

# 全然はずしているかもしれません

To: まきの さん

> 「VB+一太郎」でまたみなさまにお尋ねしたいと思います。

一太郎が流行っていますね(^^;

> VBから文書中のカーソルの位置の「段落スタイル名」を取得することはできるのですが、「文字スタイル」を取得する方法がありません。

私にはわかりませんので、どなたかおわかりの方にフォローいただけると幸いです。

To: AKiOS さん

> でも、自分自身のフレームだとIEは立ち上がらず、
> リンク先の内容をフレーム内に表示することができるんです。

あ、そうなんですか。
ということは、いわゆる「限りなくバグに近い仕様」の一つかもしれませんね。

> eval("document.all.a"+x+".style.color = document.vlinkColor");

evalは、強力すぎるため、禁じ手として封印すべきものです(言い過ぎ)

evalを使わないでコーディングするには、

<a id="a" onClick="a(0)" style="color:blue; text-decoration:underline; cursor:hand">左側</a>
<a id="a" onClick="a(1)" style="color:blue; text-decoration:underline; cursor:hand">右側</a>

としておき、aオブジェクトをグループ化してはいかがでしょう?

document.all.a[x].style.color = document.vlinkColor

でいけると思いますよ。

AKiOS さん 2000年 04月 26日 14時 04分 19秒

管理人むたぐちさん、こんにちは。

>というか、HTAでは、他のページに移動したりすることを想定していないんじゃ
>ないかと思っています。

でも、自分自身のフレームだとIEは立ち上がらず、
リンク先の内容をフレーム内に表示することができるんです。

>クリックしたとき色を変えるコードを付加してはいかがでしょう?

最初、やり方がわからなくてあきらめかけていましたが、
コード1行追加するだけで色を変えられることがわかりました。
これで本物(?)の <a href="url" target="name"> に近づきました。
ありがとうございました。
--- menu.htm ---
<html>
<head>
<script language="JavaScript">
function a(x) {
parent.frames[x].document.location = "/C|/windows/readme.htm";
eval("document.all.a"+x+".style.color = document.vlinkColor");
}
</script>
</head>
<body lang="ja">
WindowsのReadmeを表示する
<a id="a0" onClick="a(0)" style="color:blue; text-decoration:underline; cursor:hand">左側</a>
<a id="a1" onClick="a(1)" style="color:blue; text-decoration:underline; cursor:hand">右側</a>
</body>
</html>
--- ここまで ---

まきの さん (smakino@utj.co.jp) 2000年 04月 26日 13時 18分 17秒

まきのです。
お世話になっております。
「VB+一太郎」でまたみなさまにお尋ねしたいと思います。

VBから文書中のカーソルの位置の「段落スタイル名」を取得することはできるのですが、「文字スタイル」を取得する方法がありません。

これは「段落スタイル」を取得してメッセージボックスに出すというソースです。
−−−−−−−−−−−−−−−−−
'TaroAppのアクティブ状態のドキュメントを取得
Set TaroAppLib = TaroApp.Application.TaroLibrary
'メッセージボックスに段落スタイルを表示する
MsgBox TaroAppLib.GetParagraphStyleName
−−−−−−−−−−−−−−−−−
これに対して「文字スタイル」を取得する方法が分かりません。
関数もないようです。
しかし「文字スタイル」の「設定」「解除」の関数は準備されています。
何か特別な方法でできるのでしょうか。

情報をお持ちの方、よろしくお願いいたします。

高瀬重人 さん (shigeto.takase@jp.compaq.com) 2000年 04月 26日 11時 48分 06秒

お世話になります。

document.all.Machine.options(1).selected=true
document.all.Machine.onchange

だと"Change!"は表示されますが、 エラー: サーバーに例外が発生しました。
というエラーが出てしまいます。
どうすれば回避できるでしょうか?

高瀬

YAM さん (yambe@zdnetmail.ne.jp) 2000年 04月 26日 11時 33分 30秒

はじめまして。YAMと申します。
WSHに関してかなりにつまってたのですごく助かるサイトです。
これから色々お世話になりますが、よろしくお願いします。

さてタイムリーなところで高瀬さんの書きこみなんですが
省略とかあるので判断難しいところですが、こんなことがやりたいのかな?

<SCRIPT LANGUAGE="JavaScript">
<!--
function onchng() {
var newWin=window.open("","_self");
newWin.document.open();
newWin.document.write("Change!");
newWin.document.close();
}
function clickEvent(){
document.AAA.Machine.options[1].selected=true
}
//-->
</SCRIPT>
<FORM NAME="AAA">
<SELECT NAME="Machine" onchange="onchng()">
<OPTION SELECTED>DOS/V
<OPTION>UNIX
<OPTION>Mac
</SELECT><br>
<input type=button value="select unix"onClick="clickEvent()">
</FORM>

JavaScriptはelementsを参照するときは()でなくて[]をつかうから・・・。
あと、selectタグはformタグに入れ子しないと動かないブラウザが多いですよね?

高瀬重人 さん (shigeto.takase@jp.compaq.com) 2000年 04月 26日 10時 52分 28秒

お世話になってます。高瀬です。
ひとつ前の投稿はゴミです。申し訳ありません。

>では、
>document.all.Machine.Options(1).Click
>ならどうなるでしょう?
>
>これだと、オプションボックスのクリックをエミュレートしているので、
>OnChangeイベントも起こるのではないでしょうか。

これだとUNIXが選択されず、初期画面のDOS/Vのままで、"Change!"も
表示されませんでした。

ためしに

document.all.Machine.Options(1).selected=True 'UNIX選択
document.all.Machine.Options(1).Click

とやると、なぜか DOS/V (これは option(0) )が選択されて終わります。

document.all.Machine.Options(1).selected=True 'UNIX選択

だけならもちろんoption(1)のUNIXが採用されて終わるのですが、前述した様に
onchange にならない様です。

さらに順番を反対にした

document.all.Machine.Options(1).Click 
document.all.Machine.Options(1).selected=True 'UNIX選択

だと、UNIXが選択されますが、やはりonchangeにならない様です。

高瀬


高瀬重人 さん (shigeto) 2000年 04月 26日 10時 27分 51秒

では、
document.all.Machine.Options(1).Click
ならどうなるでしょう?

これだと、オプションボックスのクリックをエミュレートしているので、
OnChangeイベントも起こるのではないでしょうか。


【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 25日 23時 12分 11秒
URL:http://homepage1.nifty.com/~tomiyama/

ふたつほど教えてください。

WSH でクリップボードの操作は可能でしょうか(HTA だと可能
なのですが)。

HTA ファイルのショートカットへのドラッグドロップはサポー
トされていないのでしょうか。

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

To: 高瀬重人 さん

> For Each tag In document.all
> ですべてのtagを検索しているので、
>
> document.all.Machine.Options(1).selected=True 'UNIX選択
>
> としてみたら、無事動作しました。

allを忘れていました(^^;
もしかすると、Machine.Options(1).selected=Trueだけでもいいかもしれません。

どちらにしてもこの場合、For Each tag In document.allは必要ないですね。

> 一連話の続きで恐縮なのですが、以下の様にonchange アトリビュートで
> java script を起動するような構成の場合は
>
> document.all.Machine.Options(1).selected=True 'UNIX選択
>
> を使って選択ボックスの表示内容を変化させても "Change!"
> が表示されないのですが、表示するにはどうすればよいのでしょうか?

この場合、OnChangeイベントは起こらないのですね。

では、
document.all.Machine.Options(1).Click
ならどうなるでしょう?

これだと、オプションボックスのクリックをエミュレートしているので、
OnChangeイベントも起こるのではないでしょうか。

できました。(感謝感激) さん (makihara@shibasoku.co.jp) 2000年 04月 25日 19時 15分 53秒

むたぐちさん、はじめまして。

>Function AddSpace(sString,iLength)
>AddSpace = Space(iLength - Len(sString)) & sString
>End Function

>sStringに、右揃えしたい文字列、iLengthに出力文字列の長さを指定します。
>この場合、iLengthは決め打ち(10)でもいいですね。

勉強になります。完璧でした。
見栄えの良いデータ作成が可能になりました。
本当にありがとうございました。


高瀬重人 さん (shigeto.takase@jp.compaq.com) 2000年 04月 25日 14時 16分 49秒

お世話になります。高瀬です。

一連話の続きで恐縮なのですが、以下の様にonchange アトリビュートで
java script を起動するような構成の場合は

document.all.Machine.Options(1).selected=True 'UNIX選択

を使って選択ボックスの表示内容を変化させても "Change!"
が表示されないのですが、表示するにはどうすればよいのでしょうか?

お手数ですがよろしくお願いします。

高瀬

<SELECT NAME="Machine" onchange="onchng()">
<OPTION SELECTED>DOS/V
<OPTION>UNIX
<OPTION>Mac
</SELECT>

<SCRIPT LANGUAGE="JavaScript">
<!--
function onchng() {
document.write("Change!");
}
//-->
</SCRIPT>




高瀬重人 さん (shigeto.takase@jp.compaq.com) 2000年 04月 25日 12時 33分 55秒

高瀬です。

For Each tag In document.all
ですべてのtagを検索しているので、

document.all.Machine.Options(1).selected=True 'UNIX選択

としてみたら、無事動作しました。

お騒がせしました。

高瀬



高瀬重人 さん (shigeto.takase@jp.compaq.com) 2000年 04月 25日 12時 17分 57秒

お世話になります。

残念ながら

>To: 高瀬 さん
>
><SELECT NAME="Machine">
><OPTION SELECTED>DOS/V
><OPTION>UNIX
><OPTION>Mac
></SELECT>

>document.Machine.Options(1).selected=True 'UNIX選択

だとオブジェクトでサポートされていないプロパティまたはメソッドです。'document.Machine'

となってしまいました。

高瀬 

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

某大学のLinuxは、TurboLinux6.0でした。
Wnn6、オフィス系アプリ(Applix Wareとか言ったっけ?)などの商用アプリに、
おなじみGIMP、Netscapeなどが入ってました。
# ネスケのメーラはやっぱり不安定だぞ! なんであんなものを使わせるか(^^;

それで、WindowマネージャとしてGnomeが動いてます。
だいぶ洗練されてきているね。

さすがPenIII500MHz、さくさく動きます。MO,ZIPまでついていたりする。欲しい…。

To: 高瀬 さん

<SELECT NAME="Machine">
<OPTION SELECTED>DOS/V
<OPTION>UNIX
<OPTION>Mac
</SELECT>

document.Machine.Options(1).selected=True 'UNIX選択

でいいのではないかと。
試してみてください。

To: まきの さん

> 何か処理を入れた方がよいのでしょうか。

よくわからないのですが、文書がオープン中であるのにもかかわらず、閉じようとして
おこるエラーかもしれませんね。
WScript.Sleepなどで適当にウェイトを取った場合はどうでしょうか。

To: arutai さん

情報ありがとうございます。

> win98SE、taro9、WSH2.0 :NT4.0sp6、taro8、WSHのVer?

私も一太郎8なんですが、このコードは動作しないんですよね。
今、一つ思いついたんですが、もしかすると一太郎オフィスをお使いなのでは?

なんとなく、JXW.Applicationというと一太郎(ワープロ)というより、全体的に
一太郎オフィスを制御するオブジェクトなんではないか、という気がします。

To: AKiOS さん

> でもIEが立ち上がるとセキュリティ警告の問題が解決できなくなりますよね。

というか、HTAでは、他のページに移動したりすることを想定していないんじゃ
ないかと思っています。

> なるほど! というわけで JavaScript で挑戦してみました。
> VBS とはやり方が違うのかもしれませんが、なんとか別フレームに
> 表示させることはできました。でもクリックしても色が変わらない…。

document.locationでよかったんですね。srcプロパティを変更する必要は
なかったですね。

クリックしたとき色を変えるコードを付加してはいかがでしょう?
そこまでする必要もないですか…。

To: 【おじさま】 さん

> お任せします。

では、次回の更新時に、「Windows・その他」カテゴリに移動させます。

> キーワードが DHTML だと日本語の文章がたくさんあるんですね

そうです。これがWebでも見られるといいのですが、ってしつこいですね、私。

> こうなっています。いずれもスクリプトから Netscape そのものを
> COM コンポーネントとして操作できるようなものではないようです。

そうですか。やはり…。
スクリプトから操れないWebブラウザなど、面白くもなんともないですね(暴言)

Netscapeは、ソース公開・マルチプラットフォーム展開なのが売りなので、
Windows特有の機能にこだわってはいられないんでしょう。
というか、MSは敵ですしね。

To: maki さん

> テキストファイルの結果です。
> \51,473,600 \51,473,600 \15,566,400 \15,566,400 \77,190,820
> \6,823,600 \6,823,600 \2,820,900 \2,820,900 \14,777,700
> \0 \0 \0 \0 \107,174,000
> \0 \0 \0 \0 \0
>
> これをこんな感じにしたいのです。
> \51,473,600 \51,473,600 \15,566,400 \15,566,400 \77,190,820
> \6,823,600 \6,823,600 \2,820,900 \2,820,900 \14,777,700
> \0 \0 \0 \0 \107,174,000
> \0 \0 \0 \0 \0

この掲示板では、スペースは無視されてしまうので、同じに見えますが、
ソースを見るとわかりました(^^;

> それで下記のようにしたのですが、型があわなくてエラーになります。
> SVline string * 50 '一行
> SVkoumoku string * 10 '一項目

これの意味がよくわからないんですが、固定長文字列(?)なんでしょうか?
# VBSではサポートされていない気が…。

> svkoumoku = formatcurrency(rsCustomersList("ordmo"))
> left(SVline,10) = svkoumoku

これもよくわからないですねえ…。
2行目、関数の結果に値を代入することはできないでしょう(^^;

こういう場合は、私はこうしています。

Function AddSpace(sString,iLength)
AddSpace = Space(iLength - Len(sString)) & sString
End Function

sStringに、右揃えしたい文字列、iLengthに出力文字列の長さを指定します。
この場合、iLengthは決め打ち(10)でもいいですね。

maki さん (makihara@shibasoku.co.jp) 2000年 04月 24日 16時 48分 54秒

会議室のみなさんこんにちは。WSHを使ってテキストファイルを作成する
スクリプトで質問があります、よろしくお願いします。

データベースからデータを持ってきて、テキストファイルを作っています。
しかし、左詰めになるため、ユーザに渡す時ちょっと見た目がよくありません。
このファイルを使ってメールの文章とするので、CSV形式というわけには
いきません。

Do Until rsCustomersList.EOF
mail.WriteLine CM & " " & CM & formatcurrency(rsCustomersList("ordmo")) & CM _
& " " & CM & formatcurrency(rsCustomersList("ordye")) & CM _
& " " & CM & formatcurrency(rsCustomersList("salmo")) & CM _
& " " & CM & formatcurrency(rsCustomersList("salye")) & CM _
& " " & CM & formatcurrency(rsCustomersList("rord")) & CM
rsCustomersList.MoveNext

テキストファイルの結果です。
\51,473,600 \51,473,600 \15,566,400 \15,566,400 \77,190,820
\6,823,600 \6,823,600 \2,820,900 \2,820,900 \14,777,700
\0 \0 \0 \0 \107,174,000
\0 \0 \0 \0 \0

これをこんな感じにしたいのです。
\51,473,600 \51,473,600 \15,566,400 \15,566,400 \77,190,820
\6,823,600 \6,823,600 \2,820,900 \2,820,900 \14,777,700
\0 \0 \0 \0 \107,174,000
\0 \0 \0 \0 \0

それで下記のようにしたのですが、型があわなくてエラーになります。
SVline string * 50 '一行
SVkoumoku string * 10 '一項目

svkoumoku = formatcurrency(rsCustomersList("ordmo"))
left(SVline,10) = svkoumoku
以下省略。

なにかいい方法はないでしょうか?

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 24日 16時 39分 48秒
URL:http://homepage1.nifty.com/~tomiyama/

管理人むたぐちさん

思い切り嘘を書いてしまいました。VB のフォームに貼り付けて
実行するとネットスケープのタイトルバーが出ると書きましたが
間違っていたようです。

ともかく Netscape がインストールされるフォルダ内にあるファ
イルで CLSID に登録されているのは Netscape.exe のみで

CLSID 481ED670-9D30-11ce-8F9B-0800091AC64E
ProgID なし

CLSID 60403D81-872B-11CF-ACC8-0080C82BE3B6
ProgID Netscape.Help.1

CLSID 61D8DE20-CA9A-11CE-9EA5-0080C82BE3B6
ProgID NetscapeMarkup

CLSID E328732C-9DC9-11CF-92D0-004095E27A10
ProgID Netscape.TalkNav.1

CLSID EF5F7050-385A-11CE-8193-0020AF18F905
ProgID Netscape.Network.1

こうなっています。いずれもスクリプトから Netscape そのものを
COM コンポーネントとして操作できるようなものではないようです。

Return