Gen さん 2003年 10月 25日 23時 46分 27秒

皆さん初めまして。Genと申します。

 ある一定の作業を自動化する手段はないものかと思っていたところ、WSHの
ことを知り、早速簡単なスクリプトを試行錯誤しながら作ってみました。
 その際にはこのサイトが大変役立ちました。

 さて、私の勤務先のパソコンにはセキュリティソフトがインストールされてお
り、ハードディスクのファイルを外付けのMOドライブへコピーしようとすると
以下のような手順を必要とします。

1 コピーしようとするファイルが入っているフォルダをエクスプローラで開く。
  (以下「ウインドウA」とします。)

2 MOドライブへコピーするための専用フォルダをエクスプローラで開く。
  (以下「ウインドウB」とします。)

3 ウインドウAから目的のファイルをウインドウBへドラッグ&ドロップする。

4 パスワードを設定する画面が表示されるので、パスワードを入力すると、MO
 ドライブへ目的のファイルがコピーされる。

 この一連の作業を自動化するためのスクリプトを作成しているのですが、上記の
3のところで行き詰まってしまいました。

 つまり、「特定のファイルをマウスを使って別のウインドウへドラッグ&ドロッ
プする」という作業をスクリプトで再現することはできるのでしょうか。

 ちなみに、クリップボードを使用してファイルをウインドウBへコピーすること
はソフトの仕様上不可能です。

 いろいろ検索してみたのですが、今のところ方法が見つかりません。

 どなたかご存知の方がいらっしゃったら、よろしくお願いします。


管理人むたぐち さん 2003年 10月 25日 00時 24分 19秒

To: 掲示板ご利用者の皆様

いつもありがとうございます。とくに回答者の皆様にはたいへん感謝してます。
少し空けてしまったのですが、その間の分で未解消の問題があったら
リストアップしていただけると幸いです。
可能な限り回答します。

管理人むたぐち さん 2003年 10月 25日 00時 16分 47秒

http://www.emeditor.com/jp/v4.htm
EmEditor v4で、WSHがマクロとして採用されたみたいです。
もちろんEmEditorがオートメーションで操作できるということになります。

個人的には、タブエディタとして使えるようになったのが嬉しいですね。

これは買いですねえ。正式版はいくらになるのかな?
しかしWin2000/XP専用というのは、思い切った切捨てだと感じました。

さん (sepia@s35.xrea.com) 2003年 10月 24日 22時 09分 33秒
URL:http://www.getx3.com/d.cgi/SSS666/

日本語版のリードメール「THE GET THREE」の紹介です。
週に1回のメールを読むことと、サイト訪問はしなくてはなりません。

私も最初は思いました。うさんくさい。ホームページに行って見ても同じでした。
まあでも、とにかく無料だから登録だけはしとこう。
どうせこんなのうまくいくはずがない、と思いながら・・・。

今も同じ思いですが、登録は無料だし、まあいいやという感じです。
お金がかかるならその時点でやめます。
(みなさんも辞めてください)

ほんまかいなの気持ちで登録にかかる時間を10分ほど取れる方は、登録だけしてみてください。

登録はコチラからです
http://www.getx3.com/d.cgi/SSS666/

いりや さん 2003年 10月 24日 13時 18分 09秒

実験の続き。WSH/JScript のコンストラクタを使って素の clipboardData オ
ブジェクトを少し包んでみました。

それから複数のプロセスからクリップボードへの依頼がなされた場合,先入
れ先出し (FIFO) で処理されますので,set() メソッドである値を一時的に
退避してあとで get() メソッドで取り出そうとしても他のプロセスが先に
set() すると中身がかわってしまうことに留意しなくてはなりません。

普段の使い道からすると心配しなくてもよいのでしょうけど一応念のため。

var clipboard = new Clipboard();

if (!clipboard.set('xxx'))
    WScript.quit();
WScript.echo('1: ' + clipboard.get());
WScript.sleep(1 * 1000);

clipboard.clear();
WScript.echo('2: ' + clipboard.get());
WScript.sleep(1 * 1000);

if (!clipboard.set('yyy'))
    WScript.quit();
WScript.echo('3: ' + clipboard.get());
WScript.sleep(1 * 1000);

function Clipboard() {
    var ie = new ActiveXObject('InternetExplorer.Application');
    ie.navigate('about:blank');
    while (ie.busy || ie.readyState != 4)
        WScript.sleep(0.1 * 1000);
    this.source = ie.document.parentWindow.clipboardData;
    this.clear = function () { this.source.clearData() }
    this.get = function () { return this.source.getData('TEXT') }
    this.set = function (aString) { return this.source.setData('TEXT', aString) }
}

いりや さん 2003年 10月 24日 11時 28分 34秒

bon さん,魔界の仮面弁士さん,

普段は UWSC (http://www002.upp.so-net.ne.jp/umiumi/) でクリップボード
アクセスの面倒をみているので Dynamic HTML にそんなオブジェクトがある
なんて知りませんでした。

ということでさっそく WSH/JScript で実験。WinXP で
c:\windows\system32\clipbrd.exe を開いて実行すると中身の変化がウイン
ドウ表示されてわかりやすい。


[ 実行例 (表示結果を得るために cscript で実行) ]

C:\Documents and Settings\iriyak>cscript //nologo clipboard-access.js
1: xxx
2: null
3: yyy

C:\Documents and Settings\iriyak>


[ WSH/JScript Source code (全角スペースは半角スペースに変更のこと) ]

var clipboardData = gen();

if (!clipboardData.setData('TEXT', 'xxx'))
    WScript.quit();
WScript.echo('1: ' + clipboardData.getData('TEXT'));
WScript.sleep(1 * 1000);

clipboardData.clearData();
WScript.echo('2: ' + clipboardData.getData('TEXT'));
WScript.sleep(1 * 1000);

if (!clipboardData.setData('TEXT', 'yyy'))
    WScript.quit();
WScript.echo('3: ' + clipboardData.getData('TEXT'));
WScript.sleep(1 * 1000);

function gen() {
    var waitUntilLoadingHasCompleted = function (ie) {
        var waitSecs = 0.1;
        do {
            WScript.sleep(waitSecs * 1000);
            var b1 = ie.busy == false;
            var b2 = ie.readyState == 4; // 4 = READYSTATE_COMPLETE
            var breakCondition = b1 && b2;
        } while (! breakCondition)
        return true;
    }
    var ie = new ActiveXObject('InternetExplorer.Application');
    ie.navigate('about:blank');
    //waitUntilLoadingHasCompleted(ie);
    while (ie.busy || ie.readyState != 4)
        WScript.sleep(0.1 * 1000);
    return ie.document.parentWindow.clipboardData;
}

魔界の仮面弁士 さん 2003年 10月 24日 09時 57分 47秒

> クリップボード操作が。。。
操作したい内容にもよりますが、テキストデータ程度であれば、
clipboardDataオブジェクトを利用する事ができます。
http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/clipboarddata.asp

*.HTAや*.HTML上からではなく、*.wsfなどから使うときは、
InternetExplorerオブジェクトをオートメーション操作して、
windowオブジェクトを取得すればOKです。


> ここは、VC or VB 等でそれようのコマンド作るしか無いのでしょか?
JScript.NETを使う、という選択肢もありますよ。
その場合は、System.Windows.Forms.Clipboard クラスを使って操作できます。

bon さん 2003年 10月 24日 07時 58分 30秒

こんにちわ、初めましてです。

WSH5.6は強力ですね〜。慣れれば慣れるほどに、その威力に魅せられらます。

で、そんな強力なWSHですが、あれが無いようです。
クリップボード操作が。。。
てっきり、有るものだと思いHELP探しまくりましたが、無いみたい。
これ出来ると、すっごく便利になるのですが。。。てんてん

ここは、VC or VB 等でそれようのコマンド作るしか無いのでしょか?

mukoubuti さん 2003年 10月 21日 02時 24分 16秒

どの言語でもかまわないのですが(できれば、vbs,js,wsfすべて)
起動中の最小化されている指定のアプリケーションにsendkeyのように
キーコード(tabやctlやshiftなど)を送りたいのですが、該当する
メソッドはありますか?
また、そのようなメソッドはどうやって見つければよいのでしょうか?
sendkeyだとアクティブのアプリケーションにキーを送ってしまうため
困っています。

どうかよろしくお願いします。


とんぼ さん 2003年 10月 20日 20時 25分 46秒

いりや殿、レスありがとうございます。

member.domainの値は取得できませんでしたが、これを手がかりに
他のプロパティを調べて見たところmember.Parentが使えることが
わかりました。member.Parentの出力は、

ローカルPCのuser1は、「WinNT://DomainName/ComputerName」
ドメインユーザーのuser1、「WinNT://DomainName」

となるため、これで識別できそうです。もっとマシな方法があれば
どなたかよろしくお願いします。

いりや さん 2003年 10月 19日 12時 24分 36秒

トンボさん、

member.name 以外に member.domain などは利用できませんか??

Win32_UserAccount クラスのメンバ変数をながめてみるといけそうな
気がします。(気がしますレベルですが)

msdn, Platform SDK: Windows Management Instrumentation, Win32_UserAccount
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_useraccount.asp


トンボさん さん 2003年 10月 17日 18時 05分 18秒

ドメインに参加しているWinNTプロフェッショナルのPC上に作成した
「東京営業所」というグループのユーザーを列挙したいのです。
しかし、ローカルPCに作成したuser1もドメインアカウントである
Domain\user1も同じ、「user1」として表示されてしまいます。
両者を区別するにはどのようにすればよいのでしょうか。
試したコーディングは次の通りです。

Dim Group
Dim GroupName
Dim GroupDomain
GroupName = "東京営業所"
GroupDomain = "mylocalpc"

Set Group = GetObject("WinNT://" & GroupDomain & "/" & GroupName & ",group")
For Each Member in Group.Members
Wscript.echo Member.Name
Next


Luna さん 2003年 10月 15日 13時 55分 13秒

はじめまして。
VBSでのエラーに困っていろいろネット検索をしていたところ、こちらにたどり着
きました(T_T)
WindowsNT Serverを起動した際に.vbsからORACLEデータベースを起動するプログ
ラムを作成してみした。
.vbsは初めて触った言語なので、恥ずかしいソースになっていますが^^;
** ソース ********************************************************
'このプログラムは30秒起きにデータベース起動コマンドを発行し、合計6回行う。
'変数定義
Dim oShell, WS, args
Dim iCount
Dim cDBSTART

'値設定
cDBSTART = "C:\ORANT\BIN\svrmgr23.exe @C:\Temp\DBScript\DB_start.sql"

'宣言
Set WS = WScript.CreateObject("WScript.Shell")
Set oShell = WScript.CreateObject ("WSCript.shell")
Set args = WScript.Arguments

'ループ処理(30秒毎に起動を行い、合計3回実行)
For iCount = 1 To 3
'データベース起動
oShell.run cDBSTART,,True

'Sleep設定(30Sec)
WScript.Sleep 30000
Next
******************************************************************
この.vbsファイルをスタートアップに登録しておくとPC起動時に実行されるのです
が、.vbsが実行された際にイベントビューアに以下のメッセージが表示されて異常
終了してしまいます。
<エラーメッセージ>
Windows Script Hostが無効にされている状態で実行しようとしました。

但し、PCを立ち上げた後に、ログオフ → ログインで再度.vbsを実行させると普通
にプログラムが実行されてデータベースが立ち上がります。
どこに原因があるのか分からず、困り果てています・・・。
どなたか分かる方がいましたら、ご教授頂けると助かります;;
宜しくお願い致します m(_ _)m

マサノ さん 2003年 10月 15日 08時 41分 44秒

魔界の仮面弁士さん>ありがとうございます。
NET USEコマンドで一度テストしてみます。
Shellで、コマンドが実行できるのですね。
ありがとうございました。

けけ さん 2003年 10月 14日 12時 04分 14秒

御世話になります。
OSがWindows2000の英語版、日本語版が混在する
環境でレジストリから英語版、日本語版の区別をつけたいと思っています。
OSのバージョン、サービスパックなどの情報は取得できるのですが
日本語、英語版の情報がどこに存在するのか解りません。
どこに情報が格納されているのか教えてください。
宜しくお願いします。

魔界の仮面弁士 さん 2003年 10月 14日 11時 58分 16秒

≫ マサノ さん 2003年 10月 13日 22時 27分 19秒
共有ドライブにマッピングした方が手軽かと思いますが、
どうしてもマッピングしたくなければ、NET USEコマンドを
WshShell.Run / BASP.Execute / WshShell.Exec などで
実行すれば、マッピング無しで(UNCパスでの)ログインが可能です。

シナプス さん 2003年 10月 14日 00時 03分 10秒

http://sinapusu.rocket3.net/asp/AllTests/ancate2/UserIsAncateADDTest/newpage1.htm

複数の質問ができるアンケートを
ユーザーが自由に作成できるアンケート掲示板を作ろうと思ってます。
ユーザーインターフェースを作る時点で困ってしまいました。

どのような形式でデータを保存してサーバーに送ればいいのか
色々考えたんですがどういう方法がいいのかわからないのです。

構造体に入れてそれを送信(出来るのかな?)とか
隠しTextAreaとかに入れて送信するのか?
それともXML形式(出来るのかな?)
色々考えました。
でも素人考えなので良く分かりません。
どんな方法をとればいいのかご指導ください。
サーバー側はASP3.0です。

マサノ さん 2003年 10月 13日 22時 27分 19秒

御世話になります。
ネットワークにログイン(ログオン)してファイル転送をしたいのですが、
共有ドライブにしてから転送をする方法は上手くいきましたが、
共有ドライブにせずに、ユーザー、パスワードを設定し、ログイン(ログオン)してから、ファイル転送する事はできないませんか?
宜しくお願いします。


いりや さん 2003年 10月 12日 17時 52分 58秒

はぅ,さらに readAll() メソッドを読み込んだ後に close() メソッドでストリームを閉じるのを忘れておりました。。すみません。。

いりや さん 2003年 10月 12日 15時 05分 56秒

あぅ、contetnsOfFile のスペル間違えました。t と n が逆さですね。

いりや さん 2003年 10月 12日 15時 04分 01秒

#include のように別ファイルを取り込む方法

昨晩ふっと思いついた方法です。WSH/JScript で有効です。(既出でしたらご
めんなさい)


[ 方式 ]

スクリプトのトップレベル、つまり一番外のスコープで eval() グローバル
メソッドを実行すると、それはそこに書き出されているものを実行している
のと同じ効果が得られる。

この特徴を利用します。


[ 制約 ]

eval() を実行する場所をトップレベル以外、たとえば関数定義部の中にする
と、その関数定義の中でしか利用できません。これは eval() の仕様が、

``The code passed to the eval method is executed in the same context
as the call to the eval method.'' (msdn eval() メソッドの解説より引用)

だからです。

関数を呼び出すときに用意された実行コンテクストは関数を抜けたときに捨
てられます。eval() を通じて実行コンテクストに登録された束縛対 (名前と
関数の本体など) は運命を実行コンテクストとともにします。そのため、関
数を抜けると使用できなくなります。

トップレベルはスクリプトの実行が完了するまでずっと存在していますので、
そこで eval() メソッドを実行するわけです。


[ 方法 ]

トップレベルで、

eval(contetnsOfFile(<ファイルパス>);

と書きます。それ以降、<ファイルパス> で定義された関数をあたかも定義済
みがごとく呼び出し可能です。

<ファイルパス> は、例えば '.\\stdio.js' のように設定します。

雰囲気は、C 言語の

#include <stdio.h>

っぽいでしょ。:-)


[ 実行例 ]

・main.js (後述する contetnsOfFile() などは省略しています)

eval(contetnsOfFile('.\\mylib.js'));

WScript.echo(globalVar1);
WScript.echo(globalVar2);
func1();
func2();

・mylib.js

var globalVar1 = 'mylib.js';
var globalVar2 = 2;

function func1() {
    WScript.echo('func1 is defined by mylib.js.');
}

function func2() {
    WScript.echo('func2 is defined by mylib.js.');
}

・実行結果 (出力結果をまとめられるので cscript で実行)

D:\Program Files\uwsc\scripts\load stuff>cscript //nologo main.js
mylib.js
2
func1 is defined by mylib.js.
func2 is defined by mylib.js.

D:\Program Files\uwsc\scripts\load stuff>


[ ソースコード ]

※あらかじめ全角スペースを半角スペースに変換して取り除いておいてくだ
さい。

function contetnsOfFile(scriptfile) {
    var readStream = file→readStream(filepath→file(scriptfile));
    return readStream.readAll();
}

function filepath→file(filepath) {
    var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
    if (!aFileSystemObject.fileExists(filepath))
        aFileSystemObject.createTextFile(filepath, true); // 2nd arg : overwrite
    return aFileSystemObject.getFile(filepath);
}

function file→readStream(file) {
    var ForReading = 1;
    var TristateUseDefault = -2;
    return file.openAsTextStream(ForReading, TristateUseDefault);
}

すなはら さん 2003年 10月 10日 00時 22分 57秒

過去ログを見てたら皆さんすごいレベルの会話ばかりでなんか申し訳ないです〜

>いりやさん
すいません、過去ログ及び検索プログラムをダウンロードさせてもらいました。
莫大な量に目まいがしますが(^^;)コツコツ調べてみます〜
よく見れば一番上に検索方法なども詳しく書いてましたね・・・

>あんのうんさん
どうもです!とてもスマートなデザインですね〜
タスクバーに現れていないのも僕ごときには理解できない謎ですが、
少しずつ改造(改悪?)させてもらいます!
あとネーミングが関西人としてツッコみたくてしょうがないです(^^;


とり さん 2003年 10月 09日 16時 27分 44秒

流れ流れてここにたどり着いてしまいました。
わたし、フォルダの作成をまとめてやりたいのですが、共有設定、パスワードが出来なくて、というか全然見当も付かなくて、、、どなたか、ご存知の方おいでになりませんか?


Rui さん 2003年 10月 09日 15時 12分 14秒

いりやさん

ありがとうございました。
本当に助かりました。



あんのうん さん 2003年 10月 09日 13時 14分 08秒


To すなはら さん

私が自分のPCで常駐させている自作HTAを紹介します。
調べものや、簡易電卓として使っています。(XP Pro+IE6)
入力フィールドの名前やボタンの名前がわかれば大抵対応できるので
試行錯誤しながら頑張って下さい〜

To 魔界の仮面弁士さん

なるほど!Googleのクエリ文字列はヘキサだったんですね〜
勉強になります。

-----------------------以下を切り取り、任意の名前.hta で保存-------
<html>
<head>
<HTA:APPLICATION
applicationName="Google君VER1.00"
version=1.00
maximizeButton=no
border=none
innerborder=no
showintaskbar=no
Scroll=no
>
<title>Google検索 Google君 Ver 1.0</title>
<script language="vbscript">
Option Explicit
Sub SearchGoogle(Question)
strURL = "http://www.google.co.jp"
Dim strURL, objIE,strMsg
Execute "Set objIE = CreateObject(""InternetExplorer.Application"")"
objIE.Visible = False
If Question = "" Then Exit Sub
Call objIE.Navigate2( strURL )
Do While objIE.Busy Or objIE.ReadyState<>4
Loop
objIE.document.all.q.value = Question
objIE.document.all.btnG.Click
objIE.Visible = True
Set objIE = Nothing
txtQuestion.Value = ""
txtQuestion.Focus

End Sub
Sub CheckKeyCode(Question)
If window.event.keyCode = 13 Then
Call SearchGoogle(Question)

End If
End Sub
</script>
</head>
<body bgcolor="navy" onload="window.ResizeTo 250,60:window.MoveTo window.screen.availWidth-250,0:txtQuestion.Focus">
<input type="text" name="txtQuestion" value="" onkeypress="CheckKeyCode(txtQuestion.value)">
<input type="button" name="btnSearch" value="検索!" onclick="SearchGoogle(txtQuestion.value)">
<input type="button" name="btnEnd" value="終了" onclick="window.close()">
</body>
</html>

いりや さん 2003年 10月 09日 13時 04分 42秒

すなはらさん,

過去ログの以下の記事も参考になるかもしれません。Internet Explorer の Component
Object Model (COM) を利用した方法に関する議論がなされています。(89-39 には
WSH/JScript を利用した自動操舵の例が紹介されています。)

[list89.shtml]

89-38 いりや さん     2003/08/05 16:47
89-36 かば さん      2003/08/05 15:29
89-35 かば さん      2003/08/05 15:03
89-22 いりや さん     2003/08/04 13:24
89-15 管理人むたぐち さん 2003/07/31 21:14
89-05 かば さん      2003/07/30 11:05
89-01 かば さん      2003/07/30 09:05

[list88.shtml]

88-46 かば さん      2003/07/29 17:56
88-45 管理人むたぐち さん 2003/07/29 17:11
88-44 かば さん      2003/07/29 15:36


[list87.shtml]

87-41 いりや さん     2003/07/13 20:41
87-37 かば さん      2003/07/11 17:48
87-33 管理人むたぐち さん 2003/07/11 01:51
87-30 いりや さん     2003/07/10 17:38
87-28 かば さん      2003/07/10 14:50
87-27 かば さん      2003/07/10 14:44

また Internet Explorer 以外のウェブ・ブラウザに関する話題については,

[list91.shtml]

91-16 管理人むたぐち さん 2003/09/17 08:32


補足

なお上記の記事の採番は,AKiOS さんの作られた「WSH Lab. 掲示板 記事検索 Version
1.2.4」の出力結果を利用しています。こちらの検索プログラム (HTA) はこの掲示板の
トップにダウンロード・リンクをとおして入手可能です。

いりや

すなはら さん 2003年 10月 09日 10時 31分 19秒

>魔界の仮面弁士さん
レスありがとうございます!しかもプログラムまで組んでいただけるとは(^^;
やりたいことはいろいろあるんですが、何ができるのかも分からない状態で・・・
ちなみに前述した方法でやりたいことは、

・ファミコンのゲームを列挙したテキストファイルを用意して
http://village.infoweb.ne.jp/~fwbc0697/search/index.htm
↑この検索エンジンの検索ボックスにテキストの一行目のゲーム名を流し込み、
『ファミコン』のボタンを押し、検索結果を確認したら二行目を流し込み・・・

というようなことです。


いりや さん 2003年 10月 08日 13時 21分 12秒

Rui さん,

Function GetKeyValue() を拝見しました。

ini ファイルのセッション名はセクション名じゃないかな?? とい
うコメントはさておき,ini ファイルのパスからストリーム
(objTs) を得て,readline() メソッドで一行ずつ読みながら分解
をおこなうという解析の流れそのものはこれでいいんじゃないかな,
と思いました。

分解は,trim(), left(), right(), len() などを駆使しておこな
われていますがここをもう少し改善するならば,正規表現を導入す
る方法があります。

例えば,msdn の VBScript
http://www.asia.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vtoriVBScript.asp
の RegExp, Matches, SubMatches, Match オブジェクトを使います。
詳細については,同 msdn の,
http://www.asia.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vtoriVBScript.asp
からたどってゆくか,
http://www.asia.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vsobjregexp.asp
をみれば具体的な説明があります。(サンプルスクリプトあり)

正規表現を使うことで,文字列そのものから文字列のパターンに操
作の対象をひろげることができます。

では,この「文字列のパターン」の表現にはどんなものがあるのか?
パターンを扱えると何がそんなにうれしいのか?,それには「正規
表現とは何か?」を知る必要があります。

こちらについては,同 msdn の
http://www.asia.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/js56reconIntroductionToRegularExpressions.asp
に丁寧な解説がありますのでじっくり読んでみてください。使用言
語は WSH/JScript で WSH/VBScript ではありませんが,背景を知
るには十分な記述があります。

正規表現はポピュラーな存在ですから,近くにいる同僚にきいてみ
ると案外「これはね」と知っているかもしれません。


ところで,前回の投函で AKiOS さんのスクリプトを紹介しました。
使用言語は JScript ですが,行の分解は,RegExp オブジェクトの
match() メソッド,replace メソッドそして,(, ) を利用した部
分文字列の切り出し,などを駆使して,ini ファイルから
key=value の解析をおこなっている格好の例題といえます。

魔界の仮面弁士 さん 2003年 10月 08日 13時 11分 32秒

> 指定したurlを開き、文字列を送信するってできますか?

可能です。

ただ、「文字列の送信」と一口に言っても、送信メソッド(GET/POSTなど)に
何を使うのか、また、文字のエンコード方法はどうするのか、そして、
送信結果はIEに表示させるのか、それともデータだけ得られれば良いのかなど、
具体的に「やりたい事」が何であるかによって、手順は異なってくるでしょう。
Webページによっては、(googleなどのように)SOAPを利用できるものもありますし。


> 例えば”http://www.google.co.jp/”を開き、”発声法(ENTER)”と
例えばこんな感じですかね。保存するファイル名を「sample.wsf」にして下さい。

<?xml version="1.0" encoding="Shift_JIS"?>
<package xmlns="http://schemas.microsoft.com/WindowsScriptHost">
<job id="VBScriptSample"><script language="VBScript">
'<![CDATA[
Option Explicit

Call Main()

Sub Main()
Dim Word
Word = InputBox("検索したい単語を入力", "サンプル", "発声法")
If IsEmpty(Word) Then
WScript.Quit 0
Else
With WScript.CreateObject("InternetExplorer.Application")
.Navigate2 getURL(Word)
.Left = 0
.Top = 0
.Visible = True
End With
End IF
End Sub

Function getURL(ByVal Word)
Dim URL
Dim Index
For Index = 1 To Len(Word)
URL = URL & getHex(Mid(Word, Index, 1))
Next
getURL = "http://www.google.co.jp/search?hl=ja&ie=Shift_JIS&q=" & URL
End Function

Function getHex(ByVal Char)
Char = Right("0000" & Hex(Asc(Char)), 4)
If Left(Char, 2) = "00" Then
getHex = "%" & Left(Char, 2)
Else
getHex = "%" & Left(Char, 2) & "%" & Right(Char, 2)
End If
End Function
']]>
</script>
</job>
</package>

Rui さん 2003年 10月 08日 11時 40分 12秒

Ruiです。
この前書き込んだプログラムのコーディングをやり始めて、
VBScriptを本格的にやりたいと思っているのですが、
VBScriptの本で、なにかよい本はないでしょうか。
参考になりそうなものがあれば教えていただきたいのですがゥゥ・

よろしくお願いします。

すなはら さん 2003年 10月 08日 01時 17分 08秒

はじめまして、昔VBのプログラムをちょっとかじっただけの者です。
久々にパソコンを買い、プログラムの勉強を始めようと思っています(^^;
デフォルトで入っているWSHは、なんだかいろいろできそうですね〜
サンプルを見ながら色々覚えていきたいです。

#質問
指定したurlを開き、文字列を送信するってできますか?
例えば”http://www.google.co.jp/”を開き、”発声法(ENTER)”と
いう文字列を流すというような。
自力でいろいろ試しているんですが、なかなかうまくいきません〜

Rui さん 2003年 10月 07日 13時 58分 04秒

いりやさん

遅くなってしまってすみませんでした。
宜しくお願いします。

いりや さん 2003年 10月 07日 13時 42分 42秒

Rui さん,

スクリプトありがとうございます。ちょっとみてみます。

CLOWN さん 2003年 10月 07日 13時 09分 05秒

魔界の仮面弁士 さん レス有難う御座います.

>> WSHでOSがなんであるか取得する方法は
>> ありますでしょうか?
>WMIのWin32_OperatingSystemクラスを使ってみては如何でしょう。

下記のようにしたら取得できました.
WMIはまだ良く読んでいないので情報をもとに
やってみます.

Option Explicit
Dim WshShellEnv
Set WshShellEnv = CreateObject("WScript.Shell").Environment("process")
WScript.Echo WshShellEnv("OS")

※検索の件ありましたね.失礼しました.

魔界の仮面弁士 さん 2003年 10月 07日 12時 36分 11秒

> WSHでOSがなんであるか取得する方法は
> ありますでしょうか?
WMIのWin32_OperatingSystemクラスを使ってみては如何でしょう。

> ※あと、こちらの掲示板内の検索は可能でしょうか?
この掲示板の先頭に、検索方法が掲載されていますよ。

CLOWN さん 2003年 10月 07日 11時 48分 41秒

こんにちは、

WSHでOSがなんであるか取得する方法は
ありますでしょうか?
例:Windows 2000、 Windows ME

※あと、こちらの掲示板内の検索は可能でしょうか?

宜しくお願い致します.

Rui さん 2003年 10月 07日 10時 05分 31秒

いりやさん、ご返答ありがとうございます。

INIファイルの読み込みはこんな感じになっています。

<job id="Gridmaker">
<comment>
'****************************************************************************
'* ファイル名 : Gridmaker.wsf
'* 概要 : 表枠組みの処理
'* 作成者 : FSIDIS
'* 作成日 : 2003/10/01
'* 履歴 :
'* 備考 :
'****************************************************************************
</comment>
<script language="VBScript" src="./Gridmaker_conf.inc"/>

<script language="VBScript">
Option Explicit

'****************************************************************************
' 定数 定義
'****************************************************************************
'--- Gridmaker_conf.incで定義 ----

'****************************************************************************
' Main
'****************************************************************************

'On Error Resume Next

Dim bool_rtn 'Function戻り値用
Dim bool_ErrFlg
Dim strWkMsg
Dim strErrMsg

'初期化
bool_ErrFlg = GRIDMAKER_OK
strWkMsg = ""
strErrMsg = ""

'■処理開始ログ出力■
Call writeLog(LOG_FILEPATH, INFO, MSG0001_I, "")

'■INIファイルの読込み&解析■
bool_rtn = ReadIniFilePath(INI_FILE_DIRPATH, INI_FILE_NAME_MISYU, strErrMsg)
If bool_rtn = False Then
Call writeLog(LOG_FILEPATH, ERROR, strErrMsg, "")
bool_ErrFlg = GRIDMAKER_NG
End If

'■処理終了ログ出力■
Call writeLog(LOG_FILEPATH, INFO, MSG0002_I & Chr(13) & Chr(10), "")

'■終了処理■
'正常終了の場合
If bool_ErrFlg = GRIDMAKER_OK Then

Wscript.Quit(0)

'異常終了の場合
Else

Wscript.Quit(1)
End If


'****************************************************************************
' 関数
'****************************************************************************
'============================================================================
' INIファイル関連
'============================================================================
'****************************************************************************
'* 関数名 : ReadIniFilePath()
'* 処理 : INIファイルの読込
'* 引数 : ARG1 - [IN] 対象ディレクトリパス
'* : ARG2 - [IN] INIファイル名
'* : ARG3 - [OUT] エラーメッセージ
'* 戻り値 : True/False
'* 作成者 : FSIDIS
'* 作成日 : 2003/10/01
'* 履歴 :
'* 備考 :
'****************************************************************************
Function ReadIniFilePath( _
in_str_DirPath, _
in_str_FileName, _
ByRef out_err_msg _
)

'On Error Resume Next

Dim bool_rtn 'Function戻り値用
Dim strValue
Dim strWkMsg
Dim str_IniFilePath

ReadIniFilePath = False
out_err_msg = ""
strValue = ""
strWkMsg = ""
str_IniFilePath = ""

'ファイルの存在チェック
bool_rtn = CheckFilePath(in_str_DirPath, _
in_str_FileName, _
str_IniFilePath, _
out_err_msg)
If bool_rtn = False Then
'処理中断
Exit Function
End If

'値の取得
bool_rtn = GetKeyValue( in_str_DirPath, _
in_str_FileName, _
INI_SESSION_TABLE, _
INI_KEY_BGCOLOR, _
strValue, _
out_err_msg)
If bool_rtn = True Then
strWkMsg = "値:" & strValue
Call writeLog(LOG_FILEPATH, INFO, strWkMsg, "")
End If

ReadIniFilePath = bool_rtn

End Function


'****************************************************************************
'* 関数名 : CheckFilePath()
'* 処理 : INIファイルパスの存在チェック
'* 引数 : ARG1 - [IN] 対象ディレクトリパス
'* : ARG2 - [IN] ファイル名
'* : ARG3 - [OUT] 処理対象ファイルパス
'* : ARG4 - [OUT] エラーメッセージ
'* 戻り値 : True/False
'* 作成者 : FSIDIS
'* 作成日 : 2003/10/01
'* 履歴 :
'* 備考 :
'****************************************************************************
Function CheckFilePath(in_str_DirPath, _
in_str_FileName, _
ByRef out_str_FilePath, _
ByRef out_err_msg)

'On Error Resume Next

Dim objFlSys ' ディレクトリオブジェクト
Dim objFile ' オブジェクト
Dim objFileName ' ファイルオブジェクト
Dim strDefFileName ' ファイル名
Dim strDefFilePath ' ファイルパス
Dim strWkFileName ' ファイル名(作業用)

CheckFilePath = False
out_str_FilePath = ""
out_err_msg = ""
strDefFilePath = ""

'ファイル名の取得
strDefFileName = Replace(in_str_FileName,"\","")

'ファイルシステムオブジェクト
Set objFlSys = CreateObject("Scripting.FileSystemObject")

'ディレクトリの取得
Set objFile = objFlSys.GetFolder(in_str_DirPath)
'ディレクトリが存在しない
If Err.Number <> 0 Then
out_err_msg = MSG3003_E
' オブジェクトの破棄
Set objFlSys = Nothing
Exit Function
End If

'ファイルがなくなるまでループする
For Each objFileName In objFile.Files
'ファイル名を取得
strWkFileName = objFileName.Name
'存在するファイルが指定のファイル名と一致するとき
If strWkFileName = strDefFileName Then
strDefFilePath = objFileName.Path
Exit for
End If
Next

' オブジェクトの破棄
Set objFlSys = Nothing
Set objFile = Nothing

' デフォルトファイル名のファイルが存在する場合
If strDefFilePath <> "" Then
' 返り値にデフォルトファイルパスを返す
out_str_FilePath = strDefFilePath
'上記以外の場合、エラー
Else
out_err_msg = MSG3002_E
Exit Function
End If

CheckFilePath = True

End Function

'****************************************************************************
'* 関数名 : GetKeyValue
'* 処理 : セッション名およびキー名から設定された値を取得する
'* 引数 : ARG1 - [IN] INIファイルのディレクトリパス
'* : ARG2 - [IN] INIファイル名
'* : ARG3 - [IN] セッション名
'* : ARG4 - [IN] キー名
'* : ARG5 - [OUT] 設定値
'* : ARG6 - [OUT] エラーメッセージ
'* 戻り値 : True/False
'* 作成者 : FSIDIS
'* 作成日 : 2003/10/01
'* 履歴 :
'* 備考 :
'****************************************************************************
Function GetKeyValue( _
in_str_DirPath, _
in_str_FileName, _
in_str_Session, _
in_str_Key, _
ByRef out_str_Value, _
ByRef out_err_msg _
)

'On Error Resume Next

Dim bool_rtn 'Function戻り値用
Dim objFs 'FileSystemオブジェト
Dim objTs 'TextStreamオブジェクト
Dim strSession 'セッション名
Dim strKey 'キー名
Dim strWkBuf '読み込み用変数
Dim bool_Session_flg '該当のセッションに相当するかどうか
Dim strIniFilePath 'Iniファイルパス

GetKeyValue = False
out_str_Value = ""
out_err_msg = ""
strWkBuf = ""
bool_Session_flg = False
strIniFilePath = ""

' 前後の空白を除く
strSession = Trim(in_str_Session)

' セッション名が定義されているかどうかのチェック
If strSession = "" Then
' セッション名が定義されていません。
out_err_msg = MSG3004_E
Exit Function
End If

' セッション名(取得用)の設定
strSession = BRACKET_START & LCase(strSession) & BRACKET_END
' キー名の設定
strKey = Trim(in_str_Key)
If strKey <> "" Then
strKey = LCase(strKey) + STR_EQUAL
End If

'ファイルの存在チェック
bool_rtn = CheckFilePath(in_str_DirPath, _
in_str_FileName, _
strIniFilePath, _
out_err_msg)
If bool_rtn = False Then
'処理中断
Exit Function
End If

Set objFs = Wscript.CreateObject("Scripting.FileSystemObject")

'ファイルオープン
Set objTs = objFs.OpenTextFile(strIniFilePath, OPEN_MODE_READ, True)

bool_rtn = False
'ファイルから一行ずつ読み出す
Do While Not objTs.AtEndOfStream
'一行読み込み
strWkBuf = objTs.ReadLine
'
' セッション定義行かどうかの判断
'
If Left(Trim(strWkBuf),1) = BRACKET_START Then
'
' 該当のセッションの場合
'
If LCase(strWkBuf) = strSession Then
'
' フラグを立てる
'
bool_Session_flg = True
'
' 該当のセッションではない
'
Else
'
' 既に該当のセッションのフラグがたっていた場合は
'
If bool_Session_flg = True Then
Exit Do
End If
End If
Else
'
' 該当のセッションに該当する場合
'
If bool_Session_flg = True Then
'
'指定されたキー名と一致する場合
'
If Left(LCase(strWkBuf), Len(strKey)) = strKey Then
'
' 値の取得
'
out_str_Value = Trim(Replace(Right(strWkBuf, Len(strWkBuf) - Len(strKey)), """",""))
bool_rtn = True
Exit Do
End If
End IF
End If
Loop

'該当のセッションが存在しなかった場合
If bool_Session_flg = False Then
'
'指定されたセッションがない
'
out_err_msg = MSG3006_E & _
"(INIファイルパス:" & strIniFilePath & _
", セッション名:" & in_str_Session & ")"
'該当のキーが存在しなかった場合
ElseIf bool_rtn = False Then
'
'検索は終了しているとみなす
'
out_err_msg = MSG3005_E & _
"(INIファイルパス:" & strIniFilePath & _
", セッション名:" & in_str_Session & _
", キー名:" & in_str_Key & ")"
End If

'ファイルクローズ
objTs.Close

Set objFs = Nothing

GetKeyValue = bool_rtn

End Function

'****************************************************************************
'* FileUtil
'****************************************************************************
'****************************************************************************
'* 関数名 : CombineFilePath
'* 処理 : ディレクトリパスとファイル名の結合
'* 引数 : ARG1 - [IN] ディレクトリパス
'* ARG2 - [IN] ファイル名
'* 戻り値 : ファイルパス
'* 作成者 : FSIDIS
'* 作成日 : 2003/06/04
'* 履歴 :
'* 備考 :
'****************************************************************************
Function CombineFilePath(in_str_DirPath, in_str_FileName)
On Error Resume Next
CombineFilePath = ""

Dim strDirPath
Dim strFileName

strDirPath = Trim(in_str_DirPath)
strFileName = Trim(in_str_FileName)

'ディレクトリパスの最後が\でない場合
If Left(strDirPath, 1) <> "\" Then
' \を追加する
strDirPath = strDirPath & "\"
End If

'ファイル名に\が含まれてるといけないのでリプレースをかける
strFileName = Replace(strFileName,"\","")

' ファイルパスの作成
CombineFilePath = strDirPath & strFileName

End Function

'****************************************************************************
'* 関数名 : GetFileName
'* 処理 : ファイル名(拡張子なし)の取得
'* 引数 : ARG1 - [IN] ファイル名
'* 戻り値 : ファイル名(拡張子なし)
'* 作成者 : FSIDIS
'* 作成日 : 2003/06/18
'* 履歴 :
'* 備考 :
'****************************************************************************
Function GetFileName(in_str_FileName)
On Error Resume Next
GetFileName = ""

Dim strFileName
Dim intPlace

strFileName = Replace(Trim(in_str_FileName),"\","")
'拡張子までの文字位置を返す
intPlace = InStrRev(strFileName,".")
'拡張子までの文字位置を返す
If intPlace > 0 Then
'ファイル名の取得
strFileName = Mid(strFileName, 1, intPlace - 1)
End If

GetFileName = strFileName

End Function

'****************************************************************************
'* 関数名 : GetFileExt
'* 処理 : ファイルの拡張子を取得
'* 引数 : ARG1 - [IN] ファイル名
'* 戻り値 : ファイルの拡張子
'* 作成者 : FSIDIS
'* 作成日 : 2003/06/18
'* 履歴 :
'* 備考 : 拡張子が見つからない場合、NULLを返す
'****************************************************************************
Function GetFileExt(in_str_FileName)
On Error Resume Next
GetFileExt = ""

Dim strFile
Dim intPlace

strFile = Replace(Trim(in_str_FileName),"\","")
'拡張子までの文字位置を返す
intPlace = InStrRev(strFile,".")
If intPlace > 0 Then
'拡張子の取得
strFile = Mid(strFile, intPlace + 1, Len(strFile))
Else
strFile = ""
End If

GetFileExt = strFile

End Function

'****************************************************************************
'* 関数名 : deleteFile
'* 処理 : ファイルの削除
'* 引数 : ARG1 - [IN] 削除するファイルのフルパス
'* :ARG2 - [OUT] エラーメッセージ
'* 戻り値 : True/False
'* 作成者 : FSIDIS
'* 作成日 : 2003/05/23
'* 履歴 :
'* 備考 :
'****************************************************************************
Function deleteFile(in_str_FilePath, out_errMsg)

On Error Resume Next
Dim objFileSys
Dim objFile

deleteFile = False
out_errMsg = ""

'ファイルシステムオブジェクト
Set objFileSys = CreateObject("Scripting.FileSystemObject")

'削除ファイルのセット
Set objFile = objFileSys.GetFile(in_str_FilePath)
'ファイルの削除
objFile.Delete

If Err.Number <> 0 Then
out_errMsg = Err.Description
Else
deleteFile = True
End If

'オブジェクトの破棄
Set objFile = Nothing
Set objFileSys = Nothing

End Function

'****************************************************************************
'* DateUtil
'****************************************************************************
'****************************************************************************
'* 関数名 : isDate
'* 処理 : 日付妥当性チェック
'* 引数 : ARG1 - [IN] 年ゥ・YYYY形式
'* : ARG2 - [IN] 月ゥ・MM形式
'* : ARG2 - [IN] 日ゥ・DD形式
'* 戻り値 : なし
'* 作成者 : FSIDIS
'* 作成日 : 2003/06/20
'* 履歴 :
'* 備考 :
'****************************************************************************
Function CheckDate(strYear,strMonth,strDay)
On Error Resume Next
Dim dteTmp

On Error Resume Next
CheckDate=DateValue (strYear & "/" & strMonth & "/" & strDay)

End Function


'****************************************************************************
'* その他
'****************************************************************************
'****************************************************************************
'* 関数名 : sub_wait
'* 処理 : Wait処理
'* 引数 : ARG1 - [IN] 待ち時間
'* 戻り値 : なし
'* 作成者 : FSIDIS
'* 作成日 : 2003/06/18
'* 履歴 :
'* 備考 :
'****************************************************************************
Sub sub_wait(intWaitSec)
Dim time1
Dim time2

time1 = Now

Do
time2 = Now
If time1 + TimeSerial(0,0,intWaitSec) <= time2 then
Exit Do
End If
Loop

End Sub

'****************************************************************************
'* ログ関連
'****************************************************************************
'****************************************************************************
'* 関数名 : writeLog
'* 処理 : ログファイルを出力します。
'* 引数 : ARG1 - [IN] ログファイルパス
'* : ARG2 - [IN] ログ種別
'* : ARG3 - [IN] ログメッセージ
'* : ARG4 - [IN] ログ詳細情報
'* 戻り値 : なし
'* 作成者 : FSIDIS
'* 作成日 : 2003/06/02
'* 履歴 :
'* 備考 :
'****************************************************************************
Sub writeLog( _
ByVal strLogFile, _
ByVal strKind, _
ByVal strMessage, _
ByVal strDetail _
)

Dim objFs 'FileSystemオブジェト
Dim objTs 'TextStreamオブジェクト
Dim strLogFormat 'ログフォーマット

Set objFs = Wscript.CreateObject("Scripting.FileSystemObject")

'ファイルオープン
Set objTs = objFs.OpenTextFile(strLogFile, 8, True)

'ログ文字列の生成(YYYY/MM/DD HH:MM:SS strKind strMessage)
strLogFormat = Right("0000" & CStr(Year(Now)), 4) & "/" & Right("00" & CStr(Month(Now)), 2) & "/" & Right("00" & CStr(Day(Now)), 2) & " " & _
Right("00" & CStr(Hour(Now)), 2) & ":" & Right("00" & CStr(Minute(Now)), 2) & ":" & Right("00" & CStr(Second(Now)), 2) & " " & _
strKind & " " & _
strMessage

'詳細情報がある場合
If strDetail <> "" Then

strLogFormat = strLogFormat & vbCrLf & Space(28) & strDetail
End If

'ログ種別がErrorの場合
If strKind = Error Then

If Err.Number <> 0 Then

' strLogFormat = strLogFormat & vbCrLf & Space(28) & "Err.Number:" & Err.Number & " " & _
' "Err.Description:" & Err.Description & " " & _
' "Err.Source:" & Err.Source
strLogFormat = strLogFormat & vbCrLf & Space(28) & "エラー番号:" & Err.Number & _
vbCrLf & Space(28) & "エラー内容:" & Err.Description & _
vbCrLf & Space(28) & "エラーソース:" & Err.Source
End If
End If

'ログ書き込み
objTs.WriteLine strLogFormat

'ファイルクローズ
objTs.Close

Set objFs = Nothing

End Sub


</script>
</job>

まだ、読み込みの途中までしか出来ていないのですが、
カンマ区切りで定義されたキー列の読み込みは未作成なのですが、
読み込みまでは出来るようになっています。

魔界の仮面弁士 さん 2003年 10月 06日 23時 46分 25秒

> 前田 さん 2003年 10月 06日 22時 01分 47秒
# ここって、WSH以外のネタもOKなのかな…。

> レコードを追加した直後にサブフォームにデータを表示
> する、うまい方法はありませんでしょうか?
サブフォーム.Form.Recordsetに対してAddNew操作すれば問題ないかと思います。
クエリで実行しているのであれば、以下の事に気を付けてみてください。
http://www.canalian.com/workshop/access/JetCache.html

いりや さん 2003年 10月 06日 23時 00分 39秒

前田さん,

Access関係であれば,T'sWare さんのホームページの Message
Board に投函するのも一つの手です。

http://homepage1.nifty.com/tsware/bbs.htm
http://homepage1.nifty.com/tsware/

前田 さん 2003年 10月 06日 22時 01分 47秒

こんばんは。

現在、ACCESS95&DAO2.1の資産をACCESS2000&DAO3.6に
焼きなおしております。

メインフォームにてテーブルへレコードを追加し、
その内容をサブフォームにて表示する、というものを
作成しているのですが、更新が遅いせいかサブフォーム
をRequeryしても、追加したレコードを表示できません。
時間を置いて再度Requeryをかけると表示されます。

レコードを追加した直後にサブフォームにデータを表示
する、うまい方法はありませんでしょうか?

よろしくお願いします。

いりや さん 2003年 10月 06日 17時 54分 41秒

INI ファイルの読み込み書き込みについては,この掲示板の先頭にも説明があります AKiOS さんのプログラム (JScript で書かれています) も参考になるでしょう。

WshLab.hta というファイルの 605 行目からとなります。

function load_inifile()
function get_value(name, default_value)
function get_ini_regexp(name)
function save_inifile()
function set_value(s, name, value)
function load_file(path)
function save_file(path, s)
function delete_file(path)

いりや さん 2003年 10月 06日 17時 47分 02秒

Rui さん,

いったんデータを吸い上げられて変数に入ると,ソースの書き出しは
おもったよりスムーズにいきそうな印象をうけました。

ちなみに ini ファイルの読み込みはどのような感じに書き進めていら
っしゃるのでしょう。ちらっと見せてはいただけませんか??

Rui さん 2003年 10月 06日 17時 32分 40秒

はじめまして。

INIファイルを読み込み、HTMLの一文をテキストファイルに出力するプログラムを教えてください。

INIファイルの定義です。

[TABLE]
waku=none
BORDER=1
WIDTH="500"
HEIGHT=100
CELLPADDING=5
CELLSPACING=20
ALIGN=right
BGCOLOR=#rrggbb

上のINIファイルを読み込んで、下のようなHTMLのソースを出力したいのです。

<TABLE BORDER=1 WIDTH="500" HEIGHT="100" CELLPADDING="5" CELLSPACING="20" ALIGN="right" BGCOLOR="#rrggbb">
<TR>
<TD>
</TD>
</TR>
<TR>
<TD>
</TD>
</TR>
</TABLE>

INIファイル読み込みの定義は、
@大文字、小文字に関わらず文字が一致すれば定義されているものとみなす
Aダブルクォート(")で囲まれている値についてはダブルクォート(")を除く
です。

宜しくお願いします。

いりや さん 2003年 10月 06日 13時 42分 02秒

tomo さん,

msdn (jpn):
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/sgworkingwithdrives.asp

msdn (us):
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/sgworkingwithdrives.asp

こちらにすぐ実行できるスクリプトが紹介されています。

CLOWN さん 2003年 10月 06日 11時 44分 52秒

こんにちは、CLOWNです.

魔界の仮面弁士 さん
返答遅くなりましたが回答有難う御座います.

>構文から察するに、それは HTA か HTML での記述ですよね。
>であれば、WScriptオブジェクトは使えません。
そうですか、判りました.

>WScript.CreateObject の 替わりに、CreateObject を利用してください。
>また、WScript.Echo に関しては、textareaエレメントへの出力や、
>MsgBoxでの表示を使うことで、代用する事ができるでしょう。
直接HTMLにその内容を記述したかったのですが、
少し勉強してみます.(textareaの使い方がいまいちわからないので)

>> やりたい内容は、セキュリティ対策のため
>> サービスパックなどが最新のものか
>本題とは離れますが、HFNetChkでは不十分でしょうか?

HFNetChkを入れいろいろ試してみました.Windows系の
ものであればこれで大変助かるのですが、その他ウイルスソフトの
バージョンなども同時に行いたかったので、
直接レジストリのキーを参照し、それぞれのPC上で
HTML表示させたかったのです.

いろいろと勉強になりました.また何かありました
宜しくお願い致します.

tomo さん 2003年 10月 05日 17時 52分 05秒

魔界の仮面弁士 さん
ご返答ありがとうございました。
ただなにぶん初心者だけに分からないことが多々あります。
もう少し詳しく教えて頂けないでしょうか?

魔界の仮面弁士 さん 2003年 10月 04日 19時 39分 18秒

》 tomo さん 2003年 10月 04日 16時 30分 35秒

FileSystemObjectの「Driveオブジェクト」を利用してみてください。
AvailableSpaceプロパティ … 利用可能な残ディスク容量
FreeSpace プロパティ … ディスクの空き容量
TotalSize プロパティ … ディスクの総容量

あるいは、WMIの Win32_DiskDriveクラスを使う事もできると思います。

# 詳細は、SDKを参照してみてください。

tomo さん 2003年 10月 04日 16時 30分 35秒

初めまして。
お世話になります。

ドライブ毎のディスク容量を
調べることはできるのでしょうか??
もし出来るのであれば教えて頂きたいです。

いりや さん 2003年 10月 04日 15時 10分 53秒

[ WSH/JScript interpret.js ]

///
/// Awk を参考にしたパターン処理言語の翻訳器
///

var inputFilePath = '.\\input.txt'; // file path
var outputFilePath = '.\\output.txt'; // file path
var program = prog_ex18();
interpret(inputFilePath, outputFilePath, program);

///
/// Interpretation of programs
///

function interpret(inputFilePath, outputFilePath, program) {
    var readStream = file→readStream(filepath→file(inputFilePath));
    var writeStream = file→writeStream(filepath→file(outputFilePath));
    if (readStream == null || writeStream == null)
        WScript.quit(1);
    try {
        interpret2(program, gen_env(readStream, writeStream));
    } finally {
        readStream.close();
        writeStream.close();
    }
}

function interpret2(program, env) {
    var eval_part = function (part) {
        for (var i = 0; i < part.length; i++) {
            var pattern = part[i].pattern;
            var action = part[i].action;
            if (pattern(env))
                action(env);
        }
    }
    var implicit_proc = function (s) {
        env.NR++;
        env.$0 = s;
        if (s == '')
            env.NF = 0;
        else {
            // Note that String>>split() method returns an array which has at
            // least one element even if an argument is null string. Hence
            // env.NF == stringArray.length doesn't hold when if s is ''.
            var stringArray = s.split(env.FS);
            env.NF = stringArray.length;
            for (var i = 0; i < stringArray.length; i++)
                env['$' + (i + 1)] = stringArray[i];
        }
    }
    var begin = program.begin;
    var body = program.body;
    var end = program.end;
    if (begin != null)
        eval_part(begin);
    while (! env.readStream.atEndOfStream) {
        implicit_proc(env.readStream.readLine());
        if (body != null)
            eval_part(body);
    }
    if (end != null)
        eval_part(end);
}

function gen_env(readStream, writeStream) {
    var env = new Object();
    env.readStream = readStream;
    env.writeStream = writeStream;
    env.NR = 0;
    env.FS = /( |\t)+/;
    env.OFS = ' ';
    return env;
}

///
/// A utility functions to help with building the program.
///

function gen_assoc(pattern, action) {
    var assoc = new Object();
    assoc.pattern = pattern;
    assoc.action = action;
    return assoc;
}

function gen_prog(begin, body, end) {
    var program = new Object();
    program.begin = begin;
    program.body = body;
    program.end = end;
    return program;
}

function awk_print(env) {
    // Note that at this moment we don't support a side effect of $0 for
    // an assignment to a variable $(i) where 1 <= i <= NF. In Awk, print
    // is the the same as print $0. Hence we will break down and change the
    // semantics like below. env.writeStream.writeLine(env.$0) can be
    // used when there is no side effect for $(i).
    if (env.NF == 0)
        env.writeStream.writeBlankLines(1); // env.$0 is null string.
    else {
        for (var i = 1; i < env.NF; i++) {
            env.writeStream.write(env['$' + i]);
            env.writeStream.write(env.OFS);
        }
        env.writeStream.writeLine(env['$' + env.NF])
    }
}

///
/// File/Stream related functions
///
function filepath→file(filepath) {
    var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
    if (!aFileSystemObject.fileExists(filepath))
        aFileSystemObject.createTextFile(filepath, true); // 2nd arg : overwrite
    return aFileSystemObject.getFile(filepath);
}

function file→readStream(file) {
    var ForReading = 1;
    var TristateUseDefault = -2;
    return file.openAsTextStream(ForReading, TristateUseDefault);
}

function file→writeStream(file) {
    var ForWriting = 2;
    var TristateUseDefault = -2;
    return file.openAsTextStream(ForWriting, TristateUseDefault);
}

///
/// Building program to interpret
///

///
/// An example of programs introduced in ``The AWK Programming Language''
///

/// [ 注釈 ]
///
/// 以下のプログラムは「プログラミング言語 AWK」の 1-8 節 (便利な「一行野郎」たち)
/// で紹介された 20 個の Awk プログラムを変換したものです。オリジナルの Awk プログ
/// ラムとその解説を抜粋させて頂きました。


// 1. 入力行の総数を印字する
//
// END { print NR }
//

function prog_ex1() {
    var end = new Array();
    var p = function (env) { return true };
    var a = function (env) { env.writeStream.writeLine(env.NR) };
    end.push(gen_assoc(p, a));
    return gen_prog(null, null, end);
}

// 2. 10行目の入力行を印字する
//
// NR == 10
//

function prog_ex2() {
    var body = new Array();
    var p = function (env) { return env.NR == 10 };
    var a = function (env) { env.writeStream.writeLine(env.$0) };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 3. すべての入力行の最後の欄を印字する
//
// { print $NF }
//

function prog_ex3() {
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) { env.writeStream.writeLine(env['$' + env.NF]) };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 4. 最後の行の最後の欄を印字する
//
// { field = $NF}
// END { print field }
//

function prog_ex4() {
    var field = null;
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) { field = env['$' + env.NF] };
    body.push(gen_assoc(p, a));

    var end = new Array();
    var p = function (env) { return true };
    var a = function (env) { env.writeStream.writeLine(field) };
    end.push(gen_assoc(p, a));
    return gen_prog(null, body, end);
}

// 5. 4個より多い欄を持つすべての入力行を印字する
//
// NF > 4
//

function prog_ex5() {
    var body = new Array();
    var p = function (env) { return env.NF > 4 };
    var a = function (env) { env.writeStream.writeLine(env.$0) };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 6. 最後の欄が 4 より大きいようなすべての入力行を印字する
//
// $NF > 4
//

function prog_ex6() {
    var body = new Array();
    var p = function (env) { return env['$' + env.NF] > 4 };
    var a = function (env) { env.writeStream.writeLine(env.$0) };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 7. すべての入力行の欄の総数を印字する
//
// { nf = nf + NF }
// END { print nf }

function prog_ex7() {
    var nf = null;
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) { nf = nf + env.NF };
    body.push(gen_assoc(p, a));
    var end = new Array();
    var p = function (env) { return true };
    var a = function (env) { env.writeStream.writeLine(nf) };
    end.push(gen_assoc(p, a));
    return gen_prog(null, body, end);
}

// 8. Beth を含む行の総数を印字する
//
// /Beth/ { nlines = nlines + 1 }
// END { print nlines }
//

function prog_ex8() {
    var nlines = null;
    var body = new Array();
    var p = function (env) { return /Beth/.test(env.$0) };
    var a = function (env) { nlines = nlines + 1 };
    body.push(gen_assoc(p, a));
    var end = new Array();
    var p = function (env) { return true };
    var a = function (env) { env.writeStream.writeLine(nlines) };
    end.push(gen_assoc(p, a));
    return gen_prog(null, body, end);
}

// 9. 最も大きい第 1 欄とそれを含む行を印字する ($1 のどれかは正であると
// 仮定する)
//
// $1 > max { max = $1; maxline = $0 }
// END { print max, maxline }
//

function prog_ex9() {
    var max = null;
    var maxline = null;
    var body = new Array();
    var p = function (env) { return env.$1 > max };
    var a = function (env) { max = env.$1; maxline = env.$0 };
    body.push(gen_assoc(p, a));
    var end = new Array();
    var p = function (env) { return true };
    var a = function (env) {
        env.writeStream.write(max);
        env.writeStream.write(env.OFS);
        env.writeStream.writeLine(maxline)
    }
    end.push(gen_assoc(p, a));
    return gen_prog(null, body, end);
}

// 10. 少なくとも一つの欄を持つすべての行を印字する
//
// NF > 0
//

function prog_ex10() {
    var body = new Array();
    var p = function (env) { return env.NF > 0 };
    var a = function (env) { env.writeStream.writeLine(env.$0) };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 11. 80 文字以上の長さを持つすべての行を印字する
//
// length($0) > 80
//

function prog_ex11() {
    var body = new Array();
    var p = function (env) { return env.$0.length > 80 };
    var a = function (env) { env.writeStream.writeLine(env.$0) };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 12. それぞれの行の欄の数とその行自体を印字する
//
// { print NF, $0 }
//

function prog_ex12() {
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) {
        env.writeStream.write(env.NF);
        env.writeStream.write(env.OFS);
        env.writeStream.writeLine(env.$0)
    }
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 13. 任意の行の最初の二つの欄を逆順で印字する
//
// { print $2, $1 }
//

function prog_ex13() {
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) {
        env.writeStream.write(env.$2);
        env.writeStream.write(env.OFS);
        env.writeStream.writeLine(env.$1)
    }
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 14. すべての行を最初の二つの欄を交換して印字する
//
// { temp = $1; $1 = $2; $2 = temp; print }
//

function prog_ex14() {
    var temp = null;
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) {
        temp = env.$1;
        env.$1 = env.$2;
        env.$2 = temp;
        awk_print(env)
    }
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 15. すべての行を最初の欄を行番号に置き換えて印字する
//
// { $1 = NR; print }
//

function prog_ex15() {
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) { env.$1 = env.NR; awk_print(env) };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 16. すべての行を二つ目の欄を消去して印字する
//
// { $2 = ""; print }
//

function prog_ex16() {
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) { env.$2 = ''; awk_print(env) };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 17. すべての行の欄を逆順で印字する
//
// { for (i = NF; i > 0; i = i - 1) printf("%s ", $i)
//  printf("\n")
// }
//

function prog_ex17() {
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) {
        for (var i = env.NF; i > 0; i--) {
            env.writeStream.write(env['$' + i]);
            env.writeStream.write(env.OFS);
        }
        env.writeStream.writeBlankLines(1)
    };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 18. すべての行の各欄の合計を印字する
//
// { sum = 0
//  for (i = 1; i <= NF; i = i + 1) sum = sum + $i
//  print sum
// }
//

function prog_ex18() {
    var sum = null;
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) {
        sum = 0;
        // Note that type conversion rule differs from the one in Awk.
        for (var i = 1; i <= env.NF; i++)
            sum = sum + new Number(env['$' + i]);
        env.writeStream.writeLine(sum)
    };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

// 19. すべての行のすべての欄を合計して、その値を印字する
//
//   { for (i = 1; i <= NF; i = i + 1) sum = sum + $i }
// END { print sum }
//

function prog_ex19() {
    var sum = null;
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) {
        // Note that type conversion rule differs from the on in Awk.
        for (var i = 1; i <= env.NF; i++)
            sum = sum + new Number(env['$' + i]);
    };
    body.push(gen_assoc(p, a));
    var end = new Array();
    var p = function (env) { return true };
    var a = function (env) { env.writeStream.writeLine(sum) };
    end.push(gen_assoc(p, a));
    return gen_prog(null, body, end);
}

// 20. 各欄の値を絶対値に置き換えてからすべての行を印字する
//
// { for (i = 1; i <= NF; i = i + 1) if ($i < 0) $i = -$i
//  print
// }
//

function prog_ex20() {
    var body = new Array();
    var p = function (env) { return true };
    var a = function (env) {
        for (var i = 1; i <= env.NF; i++)
            if (env['$' + i] < 0)
                env['$' + i] = - env['$' + i];
        awk_print(env);
    };
    body.push(gen_assoc(p, a));
    return gen_prog(null, body, null);
}

///
/// end of script
///

いりや さん 2003年 10月 04日 15時 08分 58秒

いりやです。

WSH/JScript でこんなスクリプトを製作中ということで掲示板で紹介させていた
だきます。


[ Awk を参考にしたパターン処理言語の翻訳器 (製作中) ]

皆さんは Awk というプログラムをご存知でしょうか。生まれがなんと 1977 年
頃とたいへん長生きしているパターン処理言語のプログラムです。わたしはこの
Awk が大好きで学生の時に知ってからもうかれこれ 11 年くらいつきあっていま
す。

WSH と出会った時に (CYGWIN の gawk ではなくて) Awk のようなパターン処理
を簡単に書ける道具が JScript で書けないかなと思っておりました。

それで、字句解析と構文解析の二つはひとまず置いておいて、構文解析を終えて
出来上がる構文解析木 (パースツリー) をユーザが :-) 作ってそれを与えてやっ
て翻訳をおこなう翻訳器 (インタープリタ) のところを書いてみました。

構文解析木を自分でおこすのは大変そうですが、実は書いてみると行数でいうと
そうでもありません。例題をみていただければ分かりますが数行でかけます。

ただ、Awk のことを前提に書いているところが多数あり Awk に慣れ親しんでい
る人でないと振る舞いがつかみにくい難点があることは否めません。また
JScript 言語に特有の関数オブジェクト (function closure) の性質を多用して
プログラム自身をデータとして扱っています。ここもちょっとややこしいかもし
れません。


[ プログラムの動かし方 ]

(1) 入力ファイルを用意する

スクリプトを格納しているディレクトリに input.txt というファイル名で用意
します。

(2) スクリプトファイルを保存する

添付スクリプトの全角スペースを半角スペース 2 つに変換して保存します。ファ
イル名は interpret.js とします。

(3) 翻訳するプログラムを設定する

3 行目に program = prog_ex1() という箇所があります。このプログラムは前述
の通り、プログラムを動的に作成します。このプログラムを生成するプログラム
(関数) をかえてやります。例題として「プログミング言語 AWK 」の 20 個の
Awk プログラムを変換したものを用意しています。適宜、プログラムに貼り付け
て、program = prog_ex20() のように書き換えて実行してください。

(4) プログラムを実行する

スクリプトファイルをダブルクリックして起動します。そうすると出力結果がス
クリプトを格納しているディレクトリに output.txt というファイル名で格納さ
れます。適宜開いてご確認ください。


[ Awk との共通点 ]

違いはきりがありませんが共通点ならば話しやすい :-)

Awk は複数の入力ファイルをサポートしますがこのプログラムは 1 個の入力ファ
イルのみサポートします。このあたりのユーザ・インタフェースは後でいかよう
にもできるので気にしていません。

Awk と同様、組込み変数として $0, $1, ... と NF, NR, FS, OFS をサポートし
ます。

[ 実行例 ]

prog_ex18() を program に与えて実行します。

// 18. すべての行の各欄の合計を印字する
//
// { sum = 0
// for (i = 1; i <= NF; i = i + 1) sum = sum + $i
// print sum
// }
//

input.txt
-------------
1 -10 3 4.3
2 -2
33 4 5 -0.33

5

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

output.txt
-------------
-1.7
0
41.67
0
5
0
--------------

[ 動作確認環境 ]

WinXP Pro SP1, IE 6.0 SP1


Return