お世話になります。
<SELECT NAME="Machine">
<OPTION SELECTED>DOS/V
<OPTION>UNIX
<OPTION>Mac
</SELECT>
のような選択ボックスから1つを選び出すためには、
WSH-VBS をどのように記述すればよいのでしょうか?
お手数ですがよろしくお願いします。
高瀬
管理人むたぐちさん
>そうですね。どちらかというとメーカー側としては、そういう風に使ってもらいたく
>ない、というのがあるんじゃないのかなあ、と思います。
確か一太郎がこういう形式になった時に、そんなことがどこかに書かれていた
ような記憶があります。内部的にはそうなっているけれどそういう使い方は保
証しませんみたいなことなんだろうと思います。
>そうそう。ずっと気になっていたのですが、ネットスケープは、オートメーション
>が使えるアプリなんでしょうか?
日本語版 4.7 については Netscape.exe が、
CLSID : {61D8DE20-CA9A-11CE-9EA5-0080C82BE3B6}
ProgID : NetscapeMarkup
で Netscape Hypertext Document という名称でレジストリに登録されています。
しかもこれは VB のフォームに貼り付けることができます。これを実行すると
URL が指定されていないといった内容のエラーは出るものの、ネットスケープ
と同じメニューバーを持ったフォームが起動します(メニューバーだけ)。で
このメニューバーの中の Communicator(C) -> Navigator(N) でネットスケープ
を起動できます。ただしオブジェクトブラウザを見てもファイルや URL を指定
してやるようなプロパティが見つかりませんし、メニューバーの中からメニュ
ーを選択するような項目も見つかりません。
>ちゃんと日本語なので、助かります。
えっ、日本語ですか。ということで見てみるとキーワードが HTA だと英語の文
章だけなのですが、キーワードが DHTML だと日本語の文章がたくさんあるんで
すね(ちゃんと読んでいませんが)。失礼しました。
>あ、そうなんですか。では、リンクページの【おじさま】さんのページのカテゴリを
>「Windows・その他」に移動しておきましょうか?
お任せします。ふさわしいカテゴリがなければリンクを消していただいても結
構です(ちょっと淋しいけど(^^;))。以前は WSH で書いた某レンタル BBS の
ログ整理ツールがあったのですが、私はこの BBS を使っておらず、この BBS
ユーザーに頼まれて書いたものだったんです。ところがこの BBS のログ形式が
大幅に変更になり、さらにこのユーザーが BBS との契約を解除しましたので、
敢えて変更に対応する意味がなくなってしまったんです。
管理人むたぐちさん
arutaiさん
情報ありがとうございました。
やはり一太郎Ver.8では無理のようですね。
結局今、一太郎Ver.10でテストを開始しました。(買ってしまいました(T_T)
Set obj = CreateObject("JXW.Application")
自体は成功しました。
そのあと
set doc = obj.document.open("C:\test.jtd")
MsgBox("SUCCESS")
を実行すると画面上にtest.jtdが表示されますが、
メッセージボックスを表示する前に
準備したエラールーチンに飛んでしまいます。
> Set obj = CreateObject("JXW.Application")
> obj.Visible = true
> obj.Documents.Add()
> obj.TaroLibrary.Insert("Hello, I'm Hidy Sano.")
このソースの場合のように新規作成(Add())は成功します。
しかし、この場合でも
closeを使うとエラー処理ルーチンに飛んでしまいます。
何か処理を入れた方がよいのでしょうか。
よろしくお願いします。
管理人むたぐちさん、こんにちは。 初めまして
主に一太郎を使っているarutaiといいます。
いつも参考にさせていただいています。
さて、以下の事象ですが
>To: まきの さん
>
> 例のソースを実行してみたのですが、やはり1行目でエラーが出ますね。
> JXW.ApplicationというProgIDがレジストリに登録されていないようです。
>
> 一太郎8でも、他の方法があるのかも知れませんが…。
は 以下のscriptでしょうか。
> Set obj = CreateObject("JXW.Application")
> obj.Visible = true
> obj.Documents.Add()
> obj.TaroLibrary.Insert("Hello, I'm Hidy Sano.")
> このソースです。
> この対象となる一太郎のヴァージョンは9でしょうか?
> 手元にVer.8があり、それで試してもエラーになってしまいます。
試してみましたが、一太郎が立ち上がって Hello, I'm Hidy Sano.
が書き込まれました。環境は以下の2通りです。
win98SE、taro9、WSH2.0 :NT4.0sp6、taro8、WSHのVer?
何かの参考になれば幸いです。
管理人むたぐちさん、こんにちは。
>私は仕様としてとらえていますけど、何か方法があるんでしょうかねえ?
でもIEが立ち上がるとセキュリティ警告の問題が解決できなくなりますよね。
><a>タグのリンクをクリックしたとき、<frame>のsrcプロパティを変更することで、
>それに近い動作は可能になりますが…。
>というか、その技法を作成中の新テキストファイルビューアで使っていたりします。
なるほど! というわけで JavaScript で挑戦してみました。
VBS とはやり方が違うのかもしれませんが、なんとか別フレームに
表示させることはできました。でもクリックしても色が変わらない…。
--- menu.htm ---
<html>
<head>
<script language="JavaScript">
function a(x) {
parent.frames[x].document.location = "/C|/windows/readme.htm";
}
</script>
</head>
<body lang="ja">
WindowsのReadmeを表示する
<a onClick="a(0)" style="color:blue; text-decoration:underline; cursor:hand">左側</a>
<a onClick="a(1)" style="color:blue; text-decoration:underline; cursor:hand">右側</a>
</body>
</html>
--- ここまで ---
○WMIでレジストリを操作する話
WMIによるレジストリ管理は、WshShellのものと比較にならないほど高機能です。
WshShellにはできないことを挙げてみますと…。
・サブキーや値の名前の列挙ができる。
・バイナリのリードとライト(1次元配列ByteArrayで指定できる!)が可能。
・アクセス権を設定できる。
・MultiSize/ExpandedStringが書き込める。
そして、WMIなのでもちろん
・ネットワーク上のどのマシンのレジストリも操作できる。
すごいですねー(笑)
Win2000では、WshShellは要らないかも。
*****
では、実際のコードを見て行きましょう。
Const HKEY_CURRENT_USER = &H80000001
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:StdRegProv")
oReg.enumkey HKEY_CURRENT_USER,"software\Microsoft\Windows\CurrentVersion\Explorer",sKeys
msgbox Join(sKeys,vbCrLf)
こいつは、HKEY_CURRENT_USER\software\Microsoft\Windows\CurrentVersion\Explorer配下の
サブキーを列挙するというものです。
まず、GetObjectのところを注意してみましょう。
StdRegProvクラスは、root/defaultの名前空間に属しているので、このように明示的に
示しておく必要があります。
Win32_????系のクラスは、root/cimv2に属しており、この名前空間は、デフォルトで
「既定の名前空間」になっているため、特に指定する必要がなかったのです。
ちなみに、スクリプトで利用する既定の名前空間は、
「コンピュータの管理」のツリーで、「サービスとアプリケーション」→「WMIコントロール」を
開きます。そして、「WMIコントロール」を右クリックしてプロパティを出し、「詳細設定」タブ
から設定できます。
次に、enumkeyメソッドを実行します。
引数として、レジストリのルートキー(HKEY_CURRENT_USERなど)を表す数値、レジストリのパス、
サブキーの一覧を格納する変数(sKeys)を指定します。
ここで注意すべき点は、sKeysは「値を指定する」ための引数ではなく、「結果を受け取る」ための
引数であることです。
enumkeyメソッドが実行されると、sKeysに、サブキーが格納された1次元配列が代入されます。
# 以前この掲示板で、どなたかが「引数に値を返すCOMコンポーネントはVBSから実行可能か?」
# という質問をされ、私はそれに対して、「そういうのはないんじゃないか?」と
# 答えてしまいましたが、これは大嘘でしたね(^^;
そして、最後にJoin関数で、改行をスプリットにして表示させているわけです。
*****
StdRegProvクラスの詳細については、SDKを参照してください。
というか、Win2000ユーザーの皆さんで、WshShell/FileSystemObjectを軸にした
スクリプトに限界や飽きを感じていらっしゃる方は、ぜひWMIのSDKを入手して
WMIの世界に足を踏み入れましょう。
# 管理者の皆さんは、WMIでラクをしましょう。
この掲示板でWMIのことをいろいろ書いていますが、ほんの一部しか述べられませんので…。
To: タック さん
> Windowsのタスクスケジューラって60分ごと実行ってできませんよね。
できますよ。「詳細設定」ボタンをクリックしてみてください。
To: まきの さん
例のソースを実行してみたのですが、やはり1行目でエラーが出ますね。
JXW.ApplicationというProgIDがレジストリに登録されていないようです。
一太郎8でも、他の方法があるのかも知れませんが…。
To: 【おじさま】 さん
> 折角 COM コンポーネントになっているツールでも、案外その説明が書かれ
> ていないものですね。もったいないように思います。
そうですね。どちらかというとメーカー側としては、そういう風に使ってもらいたくない、
というのがあるんじゃないのかなあ、と思います。
とくに一太郎なんかは、ちゃんとマクロ言語が付属していますしね。
# 一太郎Liteにはマクロはなかったですが、WSHから制御できるのかな?
# それができればすばらしいですね。
そうそう。ずっと気になっていたのですが、ネットスケープは、オートメーションが使える
アプリなんでしょうか?
だれかご存知のかた、いらっしゃいませんか?
# MSの提唱する技術だけに、それはないと思うんですけどね
> >DHTMLに関しては、VB6についていたMSDNライブラリが、私の唯一の参考書です。
>
> へぇ、そうなんですか。私のところには今年1月版の MSDN ライブラリが
> インストールされています。頑張れば何とかなるのかな。本日は午後から
ちゃんと日本語なので、助かります。
これがWebにもあればいいのですが。
> 了解。とりあえずインストールはやめときます。最初は手作業のほうが勉
> 強にもなりますし。
Win98側でインストールしておいたActiveX Control PadをWin2000で立ち上げてみると、
一応実行はされます。が、すぐに強制終了してしまいました。
このままでは駄目そう…。
> バナーができてたんですね。遅ればせながらうちのサイトからのリンクに
> 使わせていただきました。形式を GIF から PNG に変換していますので
バナーは去年作りました。
たぶん、バナー大は誰も使っていないでしょう(大きすぎるって)。
というか、あれはタイトル画像にするつもりで作ったんですが、ちょっと小さすぎたので
バナー扱いにしたのです。
ああ! GIFはまずいですよね(^^;
うちはそんなに画像はないですが、そのうち全部PNGにしときます。
> ご了承ください。それからいろいろ事情があって現在うちのサイトではス
> クリプトを使った自作ツールは配布してないんです。
あ、そうなんですか。では、リンクページの【おじさま】さんのページのカテゴリを
「Windows・その他」に移動しておきましょうか?
管理人むたぐち 様
>Set Ie = WScript.CreateObject("InternetExplorer.Application")
>IE.Visible=True
>IE.Navigate "URL"
>WScript.Sleep 10000 '10秒待つ
>IE.Quit
>のようなスクリプトを、タスクスケジューラなどに登録してはいかがでしょう?
ありがとうございます。
これで活用させていただきます。
Windowsのタスクスケジューラって60分ごと実行ってできませんよね。(確か最大1日1回かと。)
他のスケジューラを探さねば。
管理人むたぐちさん
># Acrobat Readerのオブジェクトモデルの公式リファレンスってあるんでしょうかねえ?
ヘルプを流し読みした限りは特に記載はないようです。製品版の Acrobat
ではどうなのかは存じませんが、フリーの Reader では探せませんでした。
今回はオブジェクトブラウザを使いました。
一太郎の話も出ていましたので、カミさんのマシンにインストールされて
いる一太郎 10 のヘルプも流し読みしましたが、こちらにもそういった場
合についての記載は見つけられませんでした(本当に流し読みですので良
く探せばあるのかもしれませんが)。カミさんのマシンには VB も Office
もインストールされてませんのでオブジェクトブラウザも使えません。
折角 COM コンポーネントになっているツールでも、案外その説明が書かれ
ていないものですね。もったいないように思います。
>DHTMLに関しては、VB6についていたMSDNライブラリが、私の唯一の参考書です。
へぇ、そうなんですか。私のところには今年1月版の MSDN ライブラリが
インストールされています。頑張れば何とかなるのかな。本日は午後から
学会で札幌へ行く予定ですので DHTML についての書籍を探してみるつもり
ではあるのですが(私が住んでいるのは田舎なのでこういった書籍はなか
なか書店では入手できない)。
>Win2000は、システムファイルの破損などには強い?らしいので、特に問題は
>起きないような気もしますが、こればかりはやってみなければわかりませんね。
了解。とりあえずインストールはやめときます。最初は手作業のほうが勉
強にもなりますし。
PS
バナーができてたんですね。遅ればせながらうちのサイトからのリンクに
使わせていただきました。形式を GIF から PNG に変換していますので
ご了承ください。それからいろいろ事情があって現在うちのサイトではス
クリプトを使った自作ツールは配布してないんです。むたぐちさんのとこ
ろからリンクをしていただくのが申し訳なくて・・・。
ちょっと、これからいろいろと忙しくなるので、レスや更新が控えめになるかも
しれません。
# という時期に、なぜか書き込みが増えていますね(^^;
あしからず、ご了承ください。
# いつの間にやら4万HIT。みなさまありがとうございます!
で、例の切断スクリプトですが、こんなのを試作してみました。
Win2000用です。
改良すれば、Win98でも使えるんじゃないかと思います。
ダイヤルアップネットワークは、Win98だと「マイコンピュータ」にありますから、
NameSpace(17)でいけると思います。Win98GetDetailsOfでは接続状況は取得できない
と思うので、そのあたりは変更をくわえないといけないでしょう。
Set Shell = WScript.CreateObject("Shell.Application")
For Each oItem In Shell.NameSpace(3).Items
If oItem.Name="ネットワークとダイヤルアップ接続" Then
Set oFolder=oItem.GetFolder
For Each oSubItem In oFolder.Items
If oFolder.GetDetailsOf(oSubItem,1)="ダイヤルアップ" Then
If oFolder.GetDetailsOf(oSubItem,2)="接続" Then
WScript.Sleep 500
oSubItem.InvokeVerb "切断(&O)"
WScript.Sleep 500
End If
Exit For
End If
Next
Exit For
End If
Next
To: まきの さん
> Set obj = CreateObject("JXW.Application")
> obj.Visible = true
> obj.Documents.Add()
> obj.TaroLibrary.Insert("Hello, I'm Hidy Sano.")
> このソースです。
> この対象となる一太郎のヴァージョンは9でしょうか?
> 手元にVer.8があり、それで試してもエラーになってしまいます。
どうなんでしょう? > Hidy佐野さん(読んでるかな?)
私もVer.8は持っていますが、Win2000ではセットアップしていません。
Win98を立ち上げて確認すればいいのでしょうが…。いろいろと面倒で(爆)
一太郎ユーザーは少ないでしょうけど、どなたかご確認いただけませんか?
どの行でどういうエラーが出るかを書いていただけると、ありがたいのですが…。
# もし1行目でエラーが出ているとすれば、そもそも一太郎8ではオートメーションを
# サポートしていない可能性もあります。
To: hiko さん
> で、出来るようになりました。ありがとうございました。
普通のHTMLと同じ感じでも記述できるんですね。
なるほど。
ASPの勉強もいつになることか…。
本業の方が…(^^;
To: AKiOS さん
> セキュリティ警告を出したくないのでHTAにしたところ、
> 別の問題が出てきました。
> リンク先の内容を指定したフレームに表示したいのですが、
> HTMLだと問題ないのにHTAだとなぜかIEが立ち上がってしまいます。
たしかにそうなりますね。
私は仕様としてとらえていますけど、何か方法があるんでしょうかねえ?
<a>タグのリンクをクリックしたとき、<frame>のsrcプロパティを変更することで、
それに近い動作は可能になりますが…。
というか、その技法を作成中の新テキストファイルビューアで使っていたりします。
# そろそろ公開しようかな? なんか、たいした機能はついていないですがそれなりに
# 使えるレベルにはなってきたので…。
To: 【おじさま】 さん
> 一応これが基本形となりそうです。これでは onload を使っていますが、
どうもありがとうございます。いつもすいません。
# Acrobat Readerのオブジェクトモデルの公式リファレンスってあるんでしょうかねえ?
> それにしても HTML の画面がここまで見事に ActiveX コントロールのコン
> テナになってくれるものなのですね。管理人むたぐちさんが VB に触れない
> 理由も何となく分かりますし、そもそも開発環境を買わなくても良いという
> のが凄いですね。ただ、私はやっぱりこれからもこういう時には VB を使っ
VBだと、たとえソースを公開しても、VBを持っていないと再利用できないという
デメリットがあります。
これがHTMLだと、IE5さえあれば、どこにでも適用可能という強みがあります。
そこが魅力の一つですね。
> てしまいますが(^^;)、DHTML の参考書の1冊くらいは買っておこうかなと
> いう気分になってきました。インターネット上には山程資料があるんでしょ
> うけれど、オンラインでしかもほとんどが英語というのはかなり辛いので。
まあ、英語の勉強にはなります(^^;
DHTMLに関しては、VB6についていたMSDNライブラリが、私の唯一の参考書です。
IE5以降に追加された機能は、ここからは調べられませんが。
MSDNライブラリ日本語版のWebページ公開は、されないんでしょうかねえ。
> 管理人むたぐちさんも書かれていますが、随分古いプログラムですね。
そもそもActiveXという言葉自体が、MS的に死語になりつつあったりしますね。
> 一応手元にありますがインストールしていません。Win2000 に入れて大丈夫
> ですか? 動く動かないよりも下手にファイルや設定を古いのに上書きされ
> てしまうと困る気がして。
どうなんでしょう。Win98に入れたときは、特に問題はなかったようですが。
Win2000は、システムファイルの破損などには強い?らしいので、特に問題は
起きないような気もしますが、こればかりはやってみなければわかりませんね。
管理人むたぐちさん
>では、HTAで使うという手もありますね。
これでOKのようです。
object タグというもの自体知らなかったのですが、管理人むたぐちさんの
ところや関連リンクや MSDN ライブラリなどを参考にしてちょっとだけ勉強
してみました。
<head>
<script language="VBScript"><!--
Sub Printout()
objPDF.PrintAll
End Sub
--></script>
</head>
<body onload="Printout()">
<object id="objPDF" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000">
<param name="src" value="読み込む PDF ファイルのフルパス">
</object>
</body>
一応これが基本形となりそうです。これでは onload を使っていますが、
はたして onload が PDF ファイルをすっかり読み込むまで待ってくれるか
どうかといったことは調べていませんし(サンプルでは小さな PDF ファイ
ルを使いましたので)、実際にはファイルの選択部分、ドラッグドロップの
処理、複数ファイルの処理、エラー処理、HTA 自体の画面設定、終了処理な
ども必要となりますが、とりあえずにゃんこさんのご参考になってくれると
良いのですが。なにせ慣れないことやってるもんで変な部分は添削してくだ
さい。
手元では印刷設定のダイアログが出ることもなく印刷してくれました。
それにしても HTML の画面がここまで見事に ActiveX コントロールのコン
テナになってくれるものなのですね。管理人むたぐちさんが VB に触れない
理由も何となく分かりますし、そもそも開発環境を買わなくても良いという
のが凄いですね。ただ、私はやっぱりこれからもこういう時には VB を使っ
てしまいますが(^^;)、DHTML の参考書の1冊くらいは買っておこうかなと
いう気分になってきました。インターネット上には山程資料があるんでしょ
うけれど、オンラインでしかもほとんどが英語というのはかなり辛いので。
>こんなとき、ActiveX Control Padが役に立ったりします。
管理人むたぐちさんも書かれていますが、随分古いプログラムですね。
一応手元にありますがインストールしていません。Win2000 に入れて大丈夫
ですか? 動く動かないよりも下手にファイルや設定を古いのに上書きされ
てしまうと困る気がして。
こんにちは。
セキュリティ警告を出したくないのでHTAにしたところ、
別の問題が出てきました。
リンク先の内容を指定したフレームに表示したいのですが、
HTMLだと問題ないのにHTAだとなぜかIEが立ち上がってしまいます。
これについてお分かりになる方いらっしゃいませんか?
以下はこの現象を確認するためのサンプルです。
よろしくお願いします。
--- test.hta ---
<html><head><title>test</title><hta:application></head>
<frameset cols="50%,*">
<frame src="menu.htm" name="left" application="yes">
<frame src="menu.htm" name="right" application="yes">
</frameset>
</html>
--- menu.htm ---
<html>
<body lang="ja">
WindowsのReadmeを表示する
<a href="/C|/windows/readme.htm" target="left">左側</a>
<a href="/C|/windows/readme.htm" target="right">右側</a>
</body>
</html>
>>これは出来るようになりました。どうもありがとうございました。
>どうやってできたか、を簡単でも結構ですので教えていただけると
>嬉しいですね…。なにしろ、ASPをこれから勉強する身ですので(^^;
結果報告の自己レスが抜けておりました。すみませんでした。m(__)m
管理人さんのおっしゃる通り、
<script language="vbscript">
<!--
function d()
dim objWSHShell, strVersion
Set objWSHShell = CreateObject("Wscript.Shell")
strVersion = objWSHShell.RegRead("レジストリ")
alert strVersion
end function
-->
</script>
で、出来るようになりました。ありがとうございました。
最初は Wscript.CreateObject としていましたので。
>>また教えて頂きたいのですが、現在AcrobatのバージョンがPC毎に 3.0 と 4.0
>>という様に違っており、レジストリを見ると
>>3.0: HKEY_LOCAL_MACHINE\SoftWare\Adobe\Acrobat Reader 3.0J
>>4.0: HKEY_LOCAL_MACHINE\SoftWare\Adobe\Acrobat
>>という具合にバージョンによって変わっています。
>>この場合、〜\Adobeの下は何になっているか(この場合 Acrobat Reader 3.0J
>>なのか Acrobat なのか)を知る方法というのはあるのでしょうか。
>このようにキー名がわかっている場合は、割と簡単に実現可能です。
>RegReadメソッドは、引数のキー名が存在しない場合はエラーを返すので、
>エラーの有無で該当キーの存在を調べることができます。
>On Error Resume Next
>WshShell.RegRead "HKLM\SoftWare\Adobe\Acrobat Reader 3.0J\"
>If Err.Number<>0 Then
> '3.0じゃない
> Err.Clear 'エラーのクリア
>Else
> '3.0である
>End If
こちらはこのソースをそのまま使わせて頂きました。
はじめまして まきの と申します。
一太郎の制御でいきづまっています。
お力を!
以前、この掲示板で一太郎をVB?で制御している一文を拝見しました。
Set obj = CreateObject("JXW.Application")
obj.Visible = true
obj.Documents.Add()
obj.TaroLibrary.Insert("Hello, I'm Hidy Sano.")
このソースです。
この対象となる一太郎のヴァージョンは9でしょうか?
手元にVer.8があり、それで試してもエラーになってしまいます。
Ver.10であればSuperPlayRiteを使ってVBで制御ができるようであれば
この際Ver.10を購入しようと考えています。
よろしくお願いいたします。
IISをインストールしてみました。
後はASPを勉強するだけ。
# ってこんなにお手軽なものなのか?
全然関係ありませんが、ダイヤルアップの切断方法を開発中です。
実験がうまくいき次第、公開します。
To: タック さん
> もどい、aspでなくてもいいでんす。たんにURLを開くでもいいんですが。
> 定期的にURLを開いて閉じたいだけなんです。
うーん。私の返事ではご不満でしたか?
それでは、
Set Ie = WScript.CreateObject("InternetExplorer.Application")
IE.Visible=True
IE.Navigate "URL"
WScript.Sleep 10000 '10秒待つ
IE.Quit
のようなスクリプトを、タスクスケジューラなどに登録してはいかがでしょう?
To: ザッキー さん
> はじめまして。大阪大学の野崎と申します。
はじめまして。大阪大学のむたぐちと申します(^^;
> さて本題ですがど賊,離轡好謄爐賄纏劵・襯謄轡好謄爐砲覆辰討・蠅泙垢・
> このソフトウェアをマクロで動かせてその結果をテキストファイルに出力
> させたいのです。
肝心のところが文字化けしています…。
半角カナ等は、使わないようにお願いします。
> そのために、必要としている情報は、リストボックスの5番目をI択し、さらに
> コンボボックスの2つ目を選択して、得られた結果を日付をつけて出力
> させたいのです。
> そのようなレコード機能はWindows Scripting Hostではできないでしょうか?
WSH2.0では、SendKeysメソッドを利用して、アクティブウィンドウ(AppActivateメソッドで、
任意のタイトルを持つウィンドウをアクティブにできます)に任意のキーコードを
送ることができます。
Windows用のアプリは、キーボードのみで運用ができるように設計されていることが多いので、
SendKeysで適当なコードを送ってやることで、レコード機能のような使い方が
できると思います。
たとえば、リストボックスをアクティブにするアクセスキー(Alt+下線付きアルファベット一文字)
を送り、5番目を選択(Homeを送り、↓*5を送る)し、それからコンボボックスも
同様に選択してやるといいでしょう。
処理がもたつく可能性があるなら、WScript.Sleepで適当にウェイトを取ってやると
いいでしょう。
問題は、結果の出力です。
どのような形式で結果が表示されるのでしょうか?
もし、テキストファイルで出力する機能がアプリ側にあれば、出力された
ファイルを適当にコピー・編集してやればいいのですが、
ただテキストボックスなどに表示されるだけならば、その文字列をコピー(CTRL+C)して
クリップボードを読み取るしかないでしょう。
しかも、WSHは標準機能としては、クリップボードにアクセスすることはできませんので、
クリップボードを扱えるCOMコンポーネントを探してきて、それを利用するか、
SendKeysを駆使してクリップボードの中身をテキストエディタに貼り付けて保存して
ファイル化するという、極めて面倒くさい方法を取る必要があるでしょう。
一番いいのは、アプリ自体をオートメーションでスクリプトから制御するという
方法です。
ただ、それができるアプリは限られています。(主にMS製アプリ)
とりあえず、アプリ名をお知らせください。
医療情報システムというと、専用に設計されたデータベースのようなものなのでしょうか…。
> アップルスクリプトならばできるらしいのですが。
アップルスクリプトですか。
スクリプトと名がつくものは、一応調べておくべきかな?
To: RiffRaff さん
> います。そういうときの切り変え用に「通常の設定」と「カスタムで
> ActiveXやスクリプトをオフにした設定」をスクリプトで簡単に切りかえ
> れればなあと思ったわけです。インターネットオプションから変更しよう
> とすると何項目もチェックボックスの切り替えをしないといけなくなるの
> で大変かなあと。
あ、なるほど。そういうシチュエーションは確かにありますね。
IEのオブジェクトに、何かそういう機能はなかったかな?
PutPropertyとかは関係あるのだろうか?
そのうち、このあたりも調べておかなくては。
私は、もとからActiveX,JAVA,スクリプト関係は全部オフにしているので
そういう点は問題がありません。
どうしてもスクリプトを動かさないといけないページを見る必要がある場合は、
制限付きサイトゾーンに追加してから見ます。
MSのページやWindowsUpdateなどは、信頼済みサイトゾーンに入れています。
スクリプト ActiveX
インターネットゾーン × ×
制限付きサイトゾーン ○ ×
信頼済みサイトゾーン ○ ○
てな具合にしています。「制限付き」サイトゾーンを本来の用途とは別な使い方を
していますが(^^;
> 最近はスクリプトを書くことが楽しくネタ探しから始まることが多いので
> すが、どうも贅沢な機能を求めすぎてしまっているのかも知れません。
> でもやっぱりああだこうだと格闘しながら作っていくのは楽しいですね。
よーくわかります。
はじめにネタありき、で、あとはそれをいかにして実現するかが、スクリプトの
醍醐味であります。
To: 【おじさま】 さん
> Acrobat Reader 4.0J をインストールしていますので調べてみました。
わざわざすいませんです。
Acrobat ReaderはWin98用パーティションにあることはありますが、
Win2000には未導入でした。
ただ実行するだけではファイルタイプの登録がされず、ちゃんとインストーラを
使ってインストールする必要があるみたいです。
> 困ったことに標準では DDE を使っています。Run に渡す文字列しては不適当
> なようです。試しに DDE ではなく /p を付けてみましたが(大概はこれなの
> で)、これは半分正解で印刷してくれますが、その前にプリンタの設定画面が
> 出ます。ですから自動で勝手に印刷してくれるという訳にはいきません。/pt
> はエラーでした。
DDEですか…。
これをスクリプトから処理するのはなかなか至難の業でしょう。
まあ、ちょっとイレギュラーな方法かもしれませんが、
C:\test.pdfというファイルを印刷するなら
Set Shell = WScript.CreateObject("Shell.Application")
Shell.NameSpace("C:\").ParseName("test.pdf").InvokeVerb("印刷(&P)")
のようにして、エクスプローラの右クリックメニューを実行させることは一応可能です。
> これ以外に Pdf.ocx というのが「Acrobat Control for ActiveX」という名前で
>
> CLSID {CA8A9780-280D-11CF-A24D-444553540000}
> PrgID PDF.PdfCtrl.1
>
> として登録されています。これはコンポーネントとして追加することで VB で
> 使えますし(画面は Acrobat Reader そのもの)、オブジェクトブラウザで
> 見ますと、Src プロパティが文書名で、Print というメソッドもあるようです。
> しかし残念なことに VB のフォームに貼り付けて使うことはできても、スクリ
> プトからアプリケーションとして使えるものではないようです。
では、HTAで使うという手もありますね。
<object>タグでコントロールを埋め込んでやれば、VBで扱うのと同じような
感覚でいけると思います。(HTMLの知識が必要ですが)
こんなとき、ActiveX Control Padが役に立ったりします。
(<param>タグによる、デフォルトプロパティが自動的に作成される)
> あくまで WSH にこだわるならば、SendKeys 以外に IE をオブジェクトとして
> 取得して、Navigate に PDF 文書を指定すると IE の内部に Acrobat Reader
> が起動して PDF を表示します。この画面で Acrobat Reader のではなく、IE
> のほうでプリントアウトしても Acrobat Reader のプリントアウトと同じ動作
> をします。でも IE をオブジェクトとして取得した際にどうやってプリントア
> ウトさせるかがいろいろメソッドを見ても分かりませんでした。きっとできそ
> うな気もしますし、ここいらへんは管理人むたぐちさんがお詳しいのでは(^^;)、
なるほど、それはいいアイデアですね。
この場合PDF文書は、いわゆるActiveXドキュメントというやつで、IEをコンテナとして
ドキュメントを表示させています。
ですので、IEのオブジェクトの機能が使えるはずです。
ExecWBメソッドで、OLECMDID_PRINT を指定してやると印刷ダイアログが出ると思います。
が、これも完全な自動化は無理なんじゃないかなあ…。
DHTMLの印刷系コマンドは多分使えないでしょうね。なにしろ、表示させているのは
HTMLではないのですから。
というわけで、あまりズバリな回答ではありませんでしたが、何かの参考になれば幸いです。
To: hiko さん
> これは出来るようになりました。どうもありがとうございました。
どうやってできたか、を簡単でも結構ですので教えていただけると嬉しいですね…。
なにしろ、ASPをこれから勉強する身ですので(^^;
> また教えて頂きたいのですが、現在AcrobatのバージョンがPC毎に 3.0 と 4.0
> という様に違っており、レジストリを見ると
> 3.0: HKEY_LOCAL_MACHINE\SoftWare\Adobe\Acrobat Reader 3.0J
> 4.0: HKEY_LOCAL_MACHINE\SoftWare\Adobe\Acrobat
> という具合にバージョンによって変わっています。
> この場合、〜\Adobeの下は何になっているか(この場合 Acrobat Reader 3.0J
> なのか Acrobat なのか)を知る方法というのはあるのでしょうか。
このようにキー名がわかっている場合は、割と簡単に実現可能です。
RegReadメソッドは、引数のキー名が存在しない場合はエラーを返すので、
エラーの有無で該当キーの存在を調べることができます。
たとえば…
On Error Resume Next
WshShell.RegRead "HKLM\SoftWare\Adobe\Acrobat Reader 3.0J\"
If Err.Number<>0 Then
'3.0じゃない
Err.Clear 'エラーのクリア
Else
'3.0である
End If
4.0についても同様に調べておくといいでしょう。
ただ、3.0から4.0にアップグレードした場合など、二つのキーが同時に存在する
状況というのもありえるでしょう。
そういう場合も考えておく必要があると思います。
>>会社で各クライアントPCにインストールされているソフトのバージョンを
>>レジストリからの情報取得
>バージョン情報をmsgboxで表示する所までは出来たのですが
>(ファイル名は xxxxx.vbs)、これをファイル名 xxxxx.asp の中にどうやって
>取り込んで実行させてやればよいのかが分かりません。
>WSHのソースをASPで実行するにはどのようにすればよいのでしょうか。
これは出来るようになりました。どうもありがとうございました。
また教えて頂きたいのですが、現在AcrobatのバージョンがPC毎に 3.0 と 4.0
という様に違っており、レジストリを見ると
3.0: HKEY_LOCAL_MACHINE\SoftWare\Adobe\Acrobat Reader 3.0J
4.0: HKEY_LOCAL_MACHINE\SoftWare\Adobe\Acrobat
という具合にバージョンによって変わっています。
この場合、〜\Adobeの下は何になっているか(この場合 Acrobat Reader 3.0J
なのか Acrobat なのか)を知る方法というのはあるのでしょうか。
にゃんこさん、管理人むたぐちさん
Acrobat Reader 4.0J をインストールしていますので調べてみました。
>何らかのコマンドラインオプションが使えませんか?
困ったことに標準では DDE を使っています。Run に渡す文字列しては不適当
なようです。試しに DDE ではなく /p を付けてみましたが(大概はこれなの
で)、これは半分正解で印刷してくれますが、その前にプリンタの設定画面が
出ます。ですから自動で勝手に印刷してくれるという訳にはいきません。/pt
はエラーでした。
>あと、Acrobat ReaderはActiveXドキュメントとして、Webブラウザからも参照できる
>ところを見ると、スクリプトからも何らかの方法(CreateObject)で機能を呼び出せるん
>じゃないかとも思います。これについては、Acrobat Readerをインストールして、
>オブジェクトブラウザ等で調べてみないとわかりませんけど。
AcroRd32.exe は「Abobe Acrobat文書」という名前で
CLSID {B801CA65-A1FC-11D0-85AD-444553540000}
PrgID AcroExch.Document
として登録されていますが、これは名前の通り PDF 文書そのものを規定する
もののようで VBScript のみならず VB でもうまく使えません。Acrobat Rea
der がアプリケーションとして起動するようなものではないようです。
これ以外に Pdf.ocx というのが「Acrobat Control for ActiveX」という名前で
CLSID {CA8A9780-280D-11CF-A24D-444553540000}
PrgID PDF.PdfCtrl.1
として登録されています。これはコンポーネントとして追加することで VB で
使えますし(画面は Acrobat Reader そのもの)、オブジェクトブラウザで
見ますと、Src プロパティが文書名で、Print というメソッドもあるようです。
しかし残念なことに VB のフォームに貼り付けて使うことはできても、スクリ
プトからアプリケーションとして使えるものではないようです。
ということで
>もしくは、SendKeysメソッドで、Alt+何か、というキーコードを送ってやり、
>印刷メニューを実行させてやるなど、工夫してください。
これしかないかなぁという気がしますし、これならば別に WSH でなくても、
エクスプローラなどで PDF ファイルの右クリックメニューから印刷を選んだ
ほうが良いのではないかという気もします。
あくまで WSH にこだわるならば、SendKeys 以外に IE をオブジェクトとして
取得して、Navigate に PDF 文書を指定すると IE の内部に Acrobat Reader
が起動して PDF を表示します。この画面で Acrobat Reader のではなく、IE
のほうでプリントアウトしても Acrobat Reader のプリントアウトと同じ動作
をします。でも IE をオブジェクトとして取得した際にどうやってプリントア
ウトさせるかがいろいろメソッドを見ても分かりませんでした。きっとできそ
うな気もしますし、ここいらへんは管理人むたぐちさんがお詳しいのでは(^^;)、
やはりちょっと無理そうですね。
理由というのは大したことではないんですが、サイトをブラウジング中に
スクリプトやアプレットなどあまりに凝ったページに出会うとマシンの
性能が悪いのか回線スピードが遅いのか、とにかく処理が重くなってしま
います。そういうときの切り変え用に「通常の設定」と「カスタムで
ActiveXやスクリプトをオフにした設定」をスクリプトで簡単に切りかえ
れればなあと思ったわけです。インターネットオプションから変更しよう
とすると何項目もチェックボックスの切り替えをしないといけなくなるの
で大変かなあと。
最近はスクリプトを書くことが楽しくネタ探しから始まることが多いので
すが、どうも贅沢な機能を求めすぎてしまっているのかも知れません。
でもやっぱりああだこうだと格闘しながら作っていくのは楽しいですね。
乏しい頭でわからないことはつい質問してしまいますが...。
WSHは私のちょっとした趣味になってきています。
管理人さん、お返事有難うございました。
はじめまして。大阪大学の野崎と申します。
このたび貴方のページを拝見し、大学病院の医療情報システムを個人的に
カスタマイズし、データーをテキストファイルで取り出そうと考えました。
さて本題ですがど賊,離轡好謄爐賄纏劵D襯謄轡好謄爐砲覆辰討「蠅泙垢「
このソフトウェアをマクロで動かせてその結果をテキストファイルに出力
させたいのです。
そのために、必要としている情報は、リストボックスの5番目を選択し、さらに
コンボボックスの2つ目を選択して、得られた結果を日付をつけて出力
させたいのです。
そのようなレコード機能はWindows Scripting Hostではできないでしょうか?
アップルスクリプトならばできるらしいのですが。
よろしくお願いいたすます。
> 60分ごとにaspのスクリプトを動かし、ブラウザを開き、10秒程度待ってブラ>ウザを終了するというものを作りたいのですが・・・。
もどい、aspでなくてもいいでんす。たんにURLを開くでもいいんですが。
定期的にURLを開いて閉じたいだけなんです。
どなかた、わかるかたがいらっしゃったら。
To: hiko さん
> >会社で各クライアントPCにインストールされているソフトのバージョンを
> >レジストリからの情報取得
> バージョン情報をmsgboxで表示する所までは出来たのですが
> (ファイル名は xxxxx.vbs)、これをファイル名 xxxxx.asp の中にどうやって
> 取り込んで実行させてやればよいのかが分かりません。
> WSHのソースをASPで実行するにはどのようにすればよいのでしょうか。
ASPですか…。私にはよくわかりません…。
# ただいま、導入準備中。うまくいくのかな?
# だいたい、スタンドアローンで、どうやって実行環境を整えればいいのだろうか。
ファイルの埋め込みは、きっと、<!--#include -->を使うんでしょう。
というよりも、レジストリを読み込むコードを.aspに直接記述すればいいのではないでしょうか。
WshShellを利用するなら、Server.CreateObjectでいけると思うのですが…。
To: RiffRaff さん
> 兼ねてからの疑問なのですが、コントロールパネルにある各種設定のように
> レジストリのデータを変更しただけでは設定が反映されないものをスクリプト
> から反映させることは出来るのでしょうか。
基本的に、できないと考えたほうがいいと思います。
API関数を使って、何らかのメッセージを送ればいいのでしょうが、WSHでは
そういう芸当は(何らかのCOMコンポーネントを使わない限り)できませんからね。
レジストリを、アプリケーションの正式なインターフェースを利用しないで変更する
ことは、かなりリスクの大きいことであると考えておいたほうがいいです。
というか、
> 内容としてはインターネットオプションのセキュリティの設定を変更したいの
> ですが
この目的がよくわかりません(^^;
To: にゃんこ さん
> WSHで、PDFファイルを自動的に印刷させる方法を探しています。
> Runメソッドを使って、Acrobat Readerを起動させるところまでは
> 行くのですが、印刷できないんですよね....
何らかのコマンドラインオプションが使えませんか?
今確認できないのですが、*.pdfファイルを右クリックしたとき、「印刷」という
メニューがあるならば、そのコマンドラインをまねしてやるといいでしょう。
実際のコマンドラインは、「フォルダオプション」→「ファイルタイプ」で
確認できます。
もしくは、SendKeysメソッドで、Alt+何か、というキーコードを送ってやり、
印刷メニューを実行させてやるなど、工夫してください。
あと、Acrobat ReaderはActiveXドキュメントとして、Webブラウザからも参照できる
ところを見ると、スクリプトからも何らかの方法(CreateObject)で機能を呼び出せるん
じゃないかとも思います。これについては、Acrobat Readerをインストールして、
オブジェクトブラウザ等で調べてみないとわかりませんけど。
WSHで、PDFファイルを自動的に印刷させる方法を探しています。
Runメソッドを使って、Acrobat Readerを起動させるところまでは
行くのですが、印刷できないんですよね....
いい方法ご存知の方いませんか〜?
兼ねてからの疑問なのですが、コントロールパネルにある各種設定のように
レジストリのデータを変更しただけでは設定が反映されないものをスクリプト
から反映させることは出来るのでしょうか。
内容としてはインターネットオプションのセキュリティの設定を変更したいの
ですが、レジストリを変更してもインターネットオプション上のダイアログで
OKボタンを押さないとだめなのです。IE4ではリロードで出来てたはずなのですが
IE5ではリロードしても反映されません。
もし何らかの情報を持っている方がいらっしゃいましたら教えていただけると
助かります。
よろしくお願いします。
自己レスです。
>会社で各クライアントPCにインストールされているソフトのバージョンを
>レジストリからの情報取得
バージョン情報をmsgboxで表示する所までは出来たのですが
(ファイル名は xxxxx.vbs)、これをファイル名 xxxxx.asp の中にどうやって
取り込んで実行させてやればよいのかが分かりません。
WSHのソースをASPで実行するにはどのようにすればよいのでしょうか。
はじめまして。
会社で各クライアントPCにインストールされているソフトのバージョンを
ASP,VbScript、JavaScriptで調べることが出来ないかと
言うことになり、方法を調べています。
テクニック集のところを見たのですが、レジストリからの情報取得の方法がまだ
アップされていませんでしたので、こちらに質問させて頂きました。
環境はNT4.0+IE5です。
よろしくお願いします。
To: ショウキチ さん
> 今日、会社のパソコン(WIN98)で試しても同じ現象でした。私にはよくわかりませんが
> たしかにShell32.dllのバージョンは、4.72でWHSも2.0です。
Win95に、IE4をシェル統合モードでインストールすると、4.72というバージョンに
なります。(Win98ではデフォルトで4.72)
シェルの機能がWSHから利用できるのは、このバージョン以上であることが条件になります。
> 結局ホルダーの名前を英字に変えます。やっぱ日本語は何かと引っかかりますね(笑い)。
ですねえ。
私も、ファイル名やフォルダ名は、極力日本語を使わないようにしています。
8+3も原則として守っています。その方が、いろいろと都合がいいので…。
To: タック さん
> 60分ごとにaspのスクリプトを動かし、ブラウザを開き、10秒程度待ってブラウザを終了するというものを作りたいのですが・・・。
ASPですか…。苦手な分野です(^^;
# パーソナルウェブサーバーなどを使えば、Win2000Pro単独環境でも、実験が可能なんでしょうか?
# こんなサイトをやっている手前、ちょっと勉強しておこうかな、と思っています。
ASP固有の機能についてはよくわからないですが、HTML+VBSに限って言うと、
windowオブジェクトのSetTimeoutメソッドあたりが使えるんじゃないかと思います。
window.setTimeout "window.close",10000
のような感じでしょうか。
60分ごと、というのは、タスクスケジューラなどで設定しておくといいんじゃないでしょうか。
# 誰かフォローしてください(^^;
こんにちは。
初歩的な質問(?)かも知れませんが、教えていただけますか。
60分ごとにaspのスクリプトを動かし、ブラウザを開き、10秒程度待ってブラウザを終了するというものを作りたいのですが・・・。
よろしくお願いいたします。
管理人さん、こんばんは。
>シェルのバージョンの違いに起因するのかもしれませんね。
今日、会社のパソコン(WIN98)で試しても同じ現象でした。私にはよくわかりませんが
たしかにShell32.dllのバージョンは、4.72でWHSも2.0です。
今回いろいろとアドバイスをいただきありがとうございました。
結局ホルダーの名前を英字に変えます。やっぱ日本語は何かと引っかかりますね(笑い)。
またわからない事があったらこのページに来ますのでお願いします。
このHPを”お気に入り”に追加しておきます。ではでは。
To: Hamige さん
> OS:WindowsNT 4.0 Workstation(Service Pack6a)
> IE:IE5.5β
> WSH:Version2.0
>
> 他で試した環境は
>
> OS:WindowsNT 4.0 Workstation(Service Pack5)
> IE:IE5.01
> WSH: Version2.0
>
> です。推測ですが、IE5.5が原因でしょうか。他に私の環境と同じに
> できるマシンがありませんでしたので、なんとも言えませんが・・・
こちらの環境は、
IE5.0+Win98+WSH2.0
IE5.01+Win2000Pro+WSH2.0
ともに駄目でした。
とすると、IE5.0x系のバグである可能性が大ですね。
IE4ではどうだったかな?
ところで、ショウキチさんのところでおきている不具合も、シェルのバージョンの
違いに起因するのかもしれませんね。
Shell32.dllのバージョンは、Win98では4.72、Win2000では5.00です。
5.00では、IShellDiapatch2オブジェクトなど新機能が追加されている上、
バグも修正されているようです。
# ファイルの右クリックメニューをあらわすverbs,verbオブジェクトが、
# 事前型宣言(という言い方であってます?)しないと使えないという
# 例のバグのことです。VBSでは型宣言ASが使えないので、結局使用できなかったのです。
To: 三浦 さん
> htmlの中にWSHを書き実行をすると「Axtivxコントロールのいくつかは安全でないかのせいが・・・」という警告がでます。この表示が出ないようにするため「スクリプトから実行しても安全」、「初期化しても安全」といったフラグをレジストリに登録したいのですが、登録するソースの書き方を教えてもらいたいのですが。
「スクリプトから実行しても安全」、「初期化しても安全」というのは嘘(事実、
WshShellやFileSystemObjectなどは危険極まりない)ですから、
そのような情報をスクリプトから勝手に登録するのはどうかと思います。
それがWWWで公開するWebページなら、なおさらですね。
# で、レジストリの書き込みにはWshShellを利用しないといけないので、
# 結局警告は出てしまいますし。
セキュリティ設定は、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones
以下のキーにありますが、内容は私にもよくわかりません。値の名前が「記号」なので、
詳細不明です。
やはり、手動でセキュリティ設定をするのがいいでしょう。
ローカルなHTMLファイルに対するセキュリティ設定をおこなえるようにする方法は、
最近この掲示板にも書きました。(レジストリをいじる)
ただ、ローカルのHTML中にスクリプトを記述するのであれば、HTAにすることを
おすすめします。(IE5が必要ですが)
その理由も以前からいろいろ書いているので省略させていただきます。
htmlの中にWSHを書き実行をすると「Axtivxコントロールのいくつかは安全でないかのせいが・・・」という警告がでます。この表示が出ないようにするため「スクリプトから実行しても安全」、「初期化しても安全」といったフラグをレジストリに登録したいのですが、登録するソースの書き方を教えてもらいたいのですが。
よろしくお願いします。
To:管理人むたぐちさん
ご返答が遅れてすみません。
>実は、実際に試してみるとわかりますが、このコードは正常に動作しません。
>framesコレクションの各要素が、なぜかオブジェクトではなくEmpty値に
>なっているのが原因です。
私のマシンではうまくいっていたのですが、他のマシンで試したところ、
だめでした。私の環境は
OS:WindowsNT 4.0 Workstation(Service Pack6a)
IE:IE5.5β
WSH:Version2.0
他で試した環境は
OS:WindowsNT 4.0 Workstation(Service Pack5)
IE:IE5.01
WSH: Version2.0
です。推測ですが、IE5.5が原因でしょうか。他に私の環境と同じに
できるマシンがありませんでしたので、なんとも言えませんが・・・
>msgbox typename(IE.document.frames(1))を試してみるとわかります。
>(frames.lengthで、総フレーム数を取得することは可能です)
>これはバグとしか思えませんが…。もしくは、セキュリティ上の問題?
># Win2000のIEでも直っていない。
自分のマシンでは試していませんが、他のマシンで試したところ、
何も記述されていないメッセージボックスが表示されました。
ともかく、現状では私のマシンのみが動作するだけですので、他の方法での
対処を考えています。
ご指導ありがとうございました。
To: ショウキチ さん
> エラーなんですが。”ファイルをコピーできません。ファイルシステムのエラーです。(1026)”
> と言うメッセージボックスが出ます。OKボタンを押すと
> その後、WHSの実行エラーメッセージが表示します。エラーの行は"oFolder.CopyHere sFile"です。
> 説明の内容は"Win32エラー0x80070402"です。
普通にエクスプローラでドラッグアンドドロップでコピーした場合は、
このエラーは出ませんよね?
もしエラーが出るとしたら、それは文字通りファイルシステムの異常なんでしょう。
スキャンディスクをかけてみてはいかがでしょうか。
ショウキチです。何度もすみません。
エラーなんですが。”ファイルをコピーできません。ファイルシステムのエラーです。(1026)”
と言うメッセージボックスが出ます。OKボタンを押すと
その後、WHSの実行エラーメッセージが表示します。エラーの行は"oFolder.CopyHere sFile"です。
説明の内容は"Win32エラー0x80070402"です。
当方のOSはWin98SEです。ファイルは何度も確認して存在しています。すごくくだらないことに
付き合ってもらいすみません。
To: ショウキチ さん
私のところでは問題なく動作します。
A:\NIIS日報というフォルダ、C:\NIIS日報\kintaidb.mdbというファイルは
ちゃんと存在しますか?
いったい、どういうエラーが出るのでしょうか。
○EmEditor、Unicode対応
EmEditorがついにUnicode対応しました。
が、これは不安定で使い物になりません(T_T)
(開こうとすると必ず強制終了するファイルがある)
泣く泣く前バージョンに戻しました。
# まあ、β版なので仕方がない面もあるのでしょう。
しかも、設定がうまく引き継がれないので大変です。
VBS定義ファイルも、なぜかUnicodeでないと受け付けてくれなかったり…。
○更新情報
・RiffRaffさんに教えていただいたコンポーネントのリンクを張りました。
各種コンポーネントをうまく使えば、WSHに足りない機能を補って、より機能的な
スクリプトを作ることができるでしょう。
(というか、もともとそういう目的で開発されたものが大半でしょうけど)
私は頑なに標準機能だけでスクリプトを書きますが(笑)
ところでVB5 CCE(Control Creation Edition)はまだダウンロード
できるんでしょうかねえ。
これを使うと、タダでActiveXコントロールを作れるんですが。
・Sakakibaraさんからのご指摘で、スクリプトのサンプルについての
説明を補足しました。
サンプルは、WSHのパッケージによって、ついてたりついてなかったり
するのです。ややこしいことですね。
Win98付属のものは、日本語なんですが、今手に入るのは英語のものしか
ないと思います。
・ディレクトリ構造を出力するスクリプトを公開しました。
これはニュースに投稿したものです。ちょっと改良しましたが。
ツリー構造をツリーっぽく表示させる方法をずっと考えていたのですが、
案ずるより生むが安しで、ちょこっと工夫するだけでできてしまいました。
ソースはいつものとおり公開なので、何か応用して使ってみてください。
# 私は、ActiveDirectoryに応用しようと目論んでいますが(^^;
いつも使っている再帰サーチですが、これにも改良を加えました。
FolderオブジェクトをSubプロシージャの引数に渡すようにしました。
というか、なぜこの方法を思いつかなかったのか、自己嫌悪に陥っています。
今までの手法では、
sFolder=oFolder.Path→Set oFolder=Fs.GetFolder(sFolder)のように
無駄がありました。ずっと前に参考にしたあるサンプルが
こうなっていて、その方法を何の疑いもなく利用していたのです(爆)
To: チャブーン さん
> chabnetへのご参加、いつもありがとうごさいます。
感謝するのはむしろこちらのほうです(^^;
本当に勉強になります。
他の方々のためにフォローしておくと、私はチャブーンさんが主催(管理というべき?)する、
chabnetというドメインに、VPN(仮想プライベートネットワーク)を通じて参加させて
もらっています。
そこで、私の書いたADSIやWMIのスクリプトをいろいろ試してみているのです。
chabnetドメインは、Active Directoryを構築しているので、ADSIの動作確認が
おこなえるのです。今までの実験は、おおむね成功を収めているようです。
いずれ、成果をみなさまにもご報告したいと思っています。
> さて、例のネットワークインストールの件ですが、どうも再ログオン
> しないと有効にならなかったようです。こちらで試したところ、分か
> った次第です。すみませんでした。
やはりそうでしたか。
またフォローしておくと、Win2000 Serverのある管理ツールを、ネットワークを
通じて私のPCにインストールする、という話です。
> ここで、下の書き込みのような内容の設定がGUIで行えます。アプリケー
> ションについても同様です。
# 4/12の私の書き込み(WMIでシャットダウン)です。
そうですか。やはりGUIでもできるんですね。というか、できて当たり前ですか(^^;
WMIは、サービスとして常時動作しており、管理ツールの中でも多用されています。
(ディスクの管理なども該当します)
それをスクリプトからも利用できる、というわけです。
Win2000のWindowsインストーラでインストールされたアプリは、WMIによって
リモートで制御できるようです(まだよくわかっていないが)。
WMIのSDKでいうと、"Installed Applications Classes"参照のこと。
VBでも対応モジュール(無償で配布されているらしい)をいれることで、このインストーラを
使ってアプリを配布できるようです。
管理人さん、ありがとうございました。
サンプルを参考にいろいろやってみてみました。コピーはうまくいったのですが
一つ問題なのかどうかわからないのですが、教えてください。
>Dim sFolder,sFile
>sFolder="A:\NIIS日報\"
>sFile="C:\NIIS日報\kintaidb.mdb"
>Set Shell = WScript.CreateObject("Shell.Application")
>Set oFolder=Shell.NameSpace(sFolder)
>oFolder.CopyHere sFile
今、私がやろうとしている事なんですが、sFileのフォルダーに日本語がある
場合エラーになるんです?、因みに英数字(半角)だと問題ないんです。
oFolderは日本語でもOKです。もう少し教えてください。
チャブーンです。
chabnetへのご参加、いつもありがとうごさいます。
さて、例のネットワークインストールの件ですが、どうも再ログオン
しないと有効にならなかったようです。こちらで試したところ、分か
った次第です。すみませんでした。
あと、リモートコンピュータからのシャットダウンなんですが、GPOでも
設定できます。操作ができる権限(セキュリティグループ)を選択して
おくと、その権限でログオンしているユーザーが以下の操作でリモート
コンピュータやアプリケーションのリモート強制終了ができますね。
コンピュータの管理から、コンピュータの管理(ローカル)を右クリック
して他のコンピュータの管理画面を呼び出してから、その画面で
コンピュータの管理(コンピュータ名)を右クリック>詳細設定タブ
起動/回復を選択すると右下にシャットダウンボタンが現れます。
ここで、下の書き込みのような内容の設定がGUIで行えます。アプリケー
ションについても同様です。
#マイコンピュータのプロパティ(システム)からでは、このボタンは
#みえません
動作原理は、ご指摘のとおりで行ってるのだと思います。
今後ともどうぞよろしく(^^;
To: ショウキチ さん
> たとえば
> >Shellオブジェクトを利用する(ファイルのコピーなどは、エクスプローラと同じ
> >経過ダイアログが表示される))
> の定義のしかたを。当方まったくの若葉マークなんです。(>_<)
言うのを忘れていましたが、この方法はWin95(IE4未インストール)では
実行できません。
Dim sFolder,sFile
sFolder="A:\"
sFile="C:\test.txt"
Set Shell = WScript.CreateObject("Shell.Application")
Set oFolder=Shell.NameSpace(sFolder)
oFolder.CopyHere sFile
ショウキチさんの例でいくと、このようになりますね。
sFileには、ワイルドカードを使用して、複数ファイルのコピーも可能です。
また、フォルダを指定することもできます。
既存ファイルの上書きなどの処理は、CopyHereメソッドの引数で制御できます。
「オブジェクトの解説」-「Shellオブジェクト」「Folderオブジェクト…」あたりを
参考になさってください。
WSHでシェル(エクスプローラ)の機能を利用すると、絶大な効果が見られるのですが、
なぜどこの本も取り上げないのだろうか!
HTAの場合は、HTMLとHTML上でのスクリプトの知識がいるので、ちょっと
大変かもしれません。(IE5が必要)
「ダウンロード」にいくつかHTAのサンプルをおいてありますので、どんなものか
はわかると思います。
管理人さん、回答ありがとうございました。
>残念ながら、マウスポインタを変更する機能はありません。
そうなんですか。でっ!妥協案を具体的に教えてもらえないでしょうか?
たとえば
>Shellオブジェクトを利用する(ファイルのコピーなどは、エクスプローラと同じ
>経過ダイアログが表示される))
の定義のしかたを。当方まったくの若葉マークなんです。(>_<)
よろしくお願いします。
To: ショウキチ さん
> 下記の方法では実際コピーはしますが、コピーの実行中はマウスが
> 通常形状(矢印)のままです?どうすれば砂時計になるのですか?
残念ながら、マウスポインタを変更する機能はありません。
WSHで「実行中であることを示す方法」については、過去にも話題となりました。
・Shellオブジェクトを利用する(ファイルのコピーなどは、エクスプローラと同じ
経過ダイアログが表示される))
・WshShell.Popupで時限ダイアログを表示させる
・WScript.Echoを使い、cscript.exeで実行させる
・外部のコントロールを利用する
・WSHをやめて、HTAでスクリプトを書く
今のところ、このような妥協案があります。
はじめまして、Yahooで検索してここを探しました。
VBスクリプトで今悩んでます。よかったらお力を貸してください。
すごく単純なことなんですが、CのドライブからAのFDドライブに
コピー中にマウスポインターを砂時計(待機中)にしたいのですが
下記の方法では実際コピーはしますが、コピーの実行中はマウスが
通常形状(矢印)のままです?どうすれば砂時計になるのですか?
<サンプル>
'マウスを砂時計に
Set ObjFile = CreateObject("Scripting.FileSystemObject")
ObjFile.CopyFile "C:\Test.txt","A:\Test.txt"
'マウスを元に戻す
To: fenix さん
> HTMLでWSHを埋め込む(VBscriptになるんでしょうか)ことができると
> 思いますが、この際、レジストリを変更するようなことはできるのでしょうか。
VBScriptやJScriptの基本機能だけでは、レジストリの変更は不可能です。
> FileSystemObject(?)はIEのセキュリティレベルを上げれば使用できませんが
> レジストリ変更ならできるような?気がします。
レジストリの変更をおこなうには、WshShell(WSH付属のCOMコンポーネント)などを
使う必要があります。
WshShellは、「スクリプトを実行しても安全だとマークされていない」
コントロールなので、この実行を不許可にしてしまえば、レジストリに
アクセスされることはありません。
もちろん、アプリの実行やファイルの読み書き(cookie除く)もです。
逆にいうと、これらの実行は、インターネットゾーンに対しては、
絶対に許可してはいけないということになります。
> じゃあ、HTMLメールウイルスのBobbleBoyのように読むだけでレジストリが
> 変更されてしまうようなものができてしまうのでは?と思ってしまいます。
Bubble Boyは、私もよく仕組みはしらないのですが、WSHとHTAが関係している
らしいです。
HTMLでWSHを埋め込む(VBscriptになるんでしょうか)ことができると
思いますが、この際、レジストリを変更するようなことはできるのでしょうか。
FileSystemObject(?)はIEのセキュリティレベルを上げれば使用できませんが
レジストリ変更ならできるような?気がします。
じゃあ、HTMLメールウイルスのBobbleBoyのように読むだけでレジストリが
変更されてしまうようなものができてしまうのでは?と思ってしまいます。
To: Hamige さん
> 上記のHTMLのtest2.html内のテキストボックス(text1)のvalueを
> 3に変更するスクリプトは以下のようになります。
>
> IE.document.frames(1).document.forms(0).elements(0).value=3
>
> 同様に、
>
> IE.document.right.document.form1.text1.value=3
>
> でも同じ処理になります。
実は、実際に試してみるとわかりますが、このコードは正常に動作しません。
framesコレクションの各要素が、なぜかオブジェクトではなくEmpty値に
なっているのが原因です。
msgbox typename(IE.document.frames(1))を試してみるとわかります。
(frames.lengthで、総フレーム数を取得することは可能です)
これはバグとしか思えませんが…。もしくは、セキュリティ上の問題?
# Win2000のIEでも直っていない。
もちろん、HTMLにスクリプトを記述した場合は、正常に動作します。
管理人むたぐちさん
すみません、この前は"むだぐちさん"と書いてしまいました…
ご返答ありがとうございます。
おかげさまで、「Tab」で目的のテキストボックスまでたどり着き、
値を入力する、というださい方法から開放されました。
>キック、って攻撃じゃないですよね(^^;
違います、違います(^^;
ある箱型の負荷分散装置がありまして、その設定状況及及び現在の
ステータスが見れるのがWebブラウザのみで、それらの情報の収集
を自動的に行いたいと思っていましたので。
>ただし、フレーム内のFormを扱う方法は見出せていないので、フレーム内のウィンドウに
>直接navigateするようにしてください。
フレーム内のFormを扱う方法がわかりました。
ただし、あまり文章がうまいほうではないので、実例を使ってその方法を
説明したいと思います。
以下のHTMLファイルがあるとします。
・フレーム親(<html>タグ部分等、大幅に省略させて頂きます)
<frameset cols="72,30">
<frame src=test1.html name=left>
<frame src=test2.html name=right>
</frameset>
・test2.html
<form name=from1 action=/cgi-bin/hoge.cgi method=get>
<input type=text name=text1 value=1>
<input type=text name=text2 value=1>
<input type=submit name=submit1 value=OK>
</form>
上記のHTMLのtest2.html内のテキストボックス(text1)のvalueを
3に変更するスクリプトは以下のようになります。
IE.document.frames(1).document.forms(0).elements(0).value=3
同様に、
IE.document.right.document.form1.text1.value=3
でも同じ処理になります。
これにより、HTML内に埋め込むVBScriptと同じ操作がローカルで
行えてしまうということが分かりました。
ご参考までに。
WMIでWindowsをシャットダウンさせる方法がわかりました。
Set oSystemSet=GetObject ("winmgmts:{impersonationLevel=impersonate,(Shutdown)}") _
.InstancesOf("Win32_OperatingSystem")
For Each oSystem In oSystemSet
oSystem.Win32Shutdown 0
'0 ログオフ
'1 シャットダウン(電源は切れない…)
'2 再起動
'3 休止状態?
Next
ポイントは、(Shutdown)と指定することで、シャットダウン権限を与えることです。
(デフォルトでは、シャットダウン権限はないので、この指定をしないと、エラーが出てしまう)
# このようなオブジェクトパスの指定の仕方は、SDKのObject Creation and Monikersを参照。
# ちなみに、SDKのWin32ShutdownメソッドのFlag Value対応表は間違っていると思われるので注意。
To: うえき さん
> 早速、で申し訳ないのですがダウンロードにある「IE自動操縦」にダイアルアップ
> 接続と切断を追加したいのですが<B>切断</B>のやり方が分かりません。
切断の方法は、いまだに確立していません…。
現状では、R-Disconnectなどのアプリを併用して、切断するしか思いつきません。
Win2000なら、WMIでなんとかする方法もあるかもしれませんが、まだ見つけていません。
管理人さん、はじめまして
最近、Windowsスクリプトに興味を持ち検索したらこのホームページに
たどりつけました。
早速、で申し訳ないのですがダウンロードにある「IE自動操縦」にダイアルアップ
接続と切断を追加したいのですが<B>切断</B>のやり方が分かりません。
是非、教えてください。
いきなりで申し訳ございませんがよろしくお願いします。
To: Hamige さん
> 結局フリーのリブート&自動ログオンツールを使って作成しました。
たぶんやり方はあると思うんですが、勉強不足で申し訳ないです。
Win2000なら、WMIにそういう機能があるのですが、試してみたところ、
ローカルマシンには無効のようです。
まあ、WMIは管理ツールなんだから、管理者自身がシャットダウンされてはまずいため、
そういう実装になっているのでしょうが…。
リモートコンピュータのシャットダウンならできそうです。
といっても、実験は私には不可能ですが。
> ローカルで実行されるWSH(Cscript)から他のサイトのCGIをキックする
> ことは可能でしょうか。
キック、って攻撃じゃないですよね(^^;
> これでも十分可能ですが、HTMLに埋め込まれているスクリプトのように
> FORMオブジェクトに情報を入力し、それを対象サイトのCGIに渡す処理
> が可能であれば、そちらにしたいと思っています。
できます。
やり方は、このサイトの「ダウンロード」ページにある、「WSHLab.掲示板書き込み
スクリプト」が参考になるのではないかと思います。
あのスクリプトは、もともと自分専用に作ったものですが、手直しすれば
他のページのFormにも使えるでしょう。
ただし、フレーム内のFormを扱う方法は見出せていないので、フレーム内のウィンドウに
直接navigateするようにしてください。
あのスクリプトはちょっとわかりにくいと思うので、概略を書きます。
・CreateObjectメソッドでIEのオブジェクト作成。第二引数にイベント名のプレフィックス(接頭語)指定。
・IE.Visible=Trueを入れればブラウザが表示されるが、見えなくても構わないなら入れなくて良い。
・IE.Navigate "URL" で、指定URLをロード
・DocumentCompleteイベント(ロード完了)が発生するまで、Wscript.Sleepのループをいれて待つ。
・Set document=IE.Documentで、documentオブジェクト取得。
・Set Form=document.forms("フォームの名前")、もしくはforms(number)で、Formオブジェクト取得。
・For Each element In Form.Allで、Form内の全要素を検索
・element.tagname="INPUT" And element.Name="email" Then element.Value="email@address"
のように、タグ名とNameが一致すれば、Value(実際のテキスト)をセット。
・Form.Submit で送信
・再度DocumentCompleteイベント(ロード完了)が発生するまで、Wscript.Sleepのループをいれて待つ。
・IE.Quit でIEの終了
だいたいこんなところでしょうか。何かわからない点があれば、またおっしゃってください。
# ちなみに、あのスクリプトはいくつか改良を施して、今でも使っています。
管理人むたぐち さんへ
改行の件でご面倒をかけ申し訳ございませんでした。
結果を求めすぎて何について質問をしているのかを書くのを抜かしていました。
で、私のおこないたかったのはVBSでの改行変換だったのでアドバイスを受けたやり方でうまく改行できました。
>str=<書き込みの内容>
>str=Replace(str,vbCrLf,"<br>")
以後、書き込みをするときには注意しておこなうようにします。
管理人むだぐちさん
ご回答ありがとうございます。
結局フリーのリブート&自動ログオンツールを使って作成しました。
またまた質問で申し訳ないのですが、下記の件で悩んでいます。
ローカルで実行されるWSH(Cscript)から他のサイトのCGIをキックする
ことは可能でしょうか。
下記の方法では成功しました。
1.IEで対象のサイトのWebページをロードする。
2.SendKeysを使って、テキストボックス等に情報を入力する。
3.「送信(Submit)」ボタンをクリックする。
4.IEを終了する。
これでも十分可能ですが、HTMLに埋め込まれているスクリプトのように
FORMオブジェクトに情報を入力し、それを対象サイトのCGIに渡す処理
が可能であれば、そちらにしたいと思っています。
上記のことが可能なのかどうか、お知恵を貸して頂ければ幸いです。
また、もし可能であればTips等が載っているサイトも併せて教えて
頂ければ幸いです。
よろしくお願いします。