管理人むたぐち さん 2004年 01月 18日 18時 40分 32秒

久しぶりにスクリプトをアップしてみました。
(更新ですが)

手元に、自分用に作ったけど割と公開する価値がありそうな
スクリプトが溜まっています。
が、説明を書いたりするのが面倒で止まってます。

他にも、サイト(ログ)移転、FAQ集、WSH関連新情報の追加、リンク集更新、
古い文書の更新…。

どうしましょうかねw

coopie さん 2004年 01月 17日 19時 15分 16秒

いりや さん、

回答ありがとうございました。

ちょっと感動しています。

これから、解析して理解しようと思います。

いりや さん 2004年 01月 17日 12時 14分 02秒

おださん、

こういう時は海外の通販サイトの運営会社(カスタマ・サポート部)に問い合わせるのが一番です。以前うまくいっていて途中からうまくいかなくなったのですから途中なにかあったのは間違いない。ただそれがサイト側にあったとしてもこちらでは分からないからです。その切り分け作業をカスタマ・サポートのスタッフが支援してくれます。

おだ さん 2004年 01月 17日 02時 04分 56秒

はじめまして。
いきなりすいません。。僕は海外で通販で買い物しようとおもったのですが、今まで購入ボタンを押したら、普通にかいものできたのに、
今回はなんかエラーメッセージがでてしまいました。

Active Server Pages error 'ASP 0113' こんなメッセージです。
下のタスクバーには鍵のマーク(ssl保護付き)ていうマークがでます。

場違いなのはわかってるのですが、どうしたらよいのかわからないので、だれか教えてくれたら嬉しいです。
PC初心者なもので、いきなりこんな書き込み申し訳ありません。

管理人むたぐち さん 2004年 01月 16日 20時 10分 46秒

@IT:運用 Windows管理者のためのWindows Script Host入門 http://www.atmarkit.co.jp/fwin2k/operation/wsh01/wsh01_01.html

というのが始まっているようです。

ъ( ゚ー^) WSH補完クンのページ
http://www.geocities.co.jp/SiliconValley-Oakland/4672/

バージョンアップしてます。
…ぬるさんところの受け売りですが。

そういや2ちゃんねるでもトラックバックが試験的に実装されたみたい
ですね。私のここでの書き込みは、どっちかというとブログ向きだったなぁ
と今更ながら思います。が、今後WSH関係の話題だけでやっていくのも
あれですし、スクリプト関係の記事/ブログなら他にもいいサイトが
増えてきましたし、やっぱりここはWSH掲示板として、2chWindows板の
スレの避難所的に、細々と続けていくのがいいのでしょうかね。

とかなんとか言ってますが、実は今、他のことにハマっていて、
WSH Lab.に手が回っていないだけの私でした。

SA さん 2004年 01月 16日 18時 58分 25秒

セキュリティの関係でログオンスクリプトを作成することになりました。
グループポリシーとの併用である程度までは出来たのですが、
2つばかり実現できなくて困ってるものがございます。

1.ログオンスクリプトでクイックランチャの表示を消す方法
2.ログオンスクリプトで[スタート]→[プログラム]のプログラムフォルダを
  隠しフォルダに設定する方法

上記2点で、何か解決策や参考スクリプト等ございましたら
ご教授願えませんでしょうか?
よろしくお願い致します。

いりや さん 2004年 01月 16日 14時 06分 45秒

インデントつけるのを忘れていました・・・。すみません。

いりや さん 2004年 01月 16日 14時 06分 14秒

coopie さん、

例えばこんな書き方が WSH/JScript でできます。ご参考まで。

// ここから

var path = 'e:\\a\\b\\c\\d\\e\\f';
createFolder(path);

function createFolder(path) {
var fs = new ActiveXObject('Scripting.FileSystemObject');
var pathArray = path.asPathArray();
var vol = pathArray[0];
if (fs.driveExists(vol))
createFolder2(fs, path);
else
throw new Error('Drive Not Found');
}

function createFolder2(fs, path) {
if (!fs.folderExists(path)) {
var pathArray = path.asPathArray();
var parentPathArray = pathArray.slice(0, pathArray.length - 1);
createFolder2(fs, parentPathArray.asPathString());
fs.createFolder(path);
}
}

function String.prototype.asPathArray() {
return this.asArray('\\');
}

function String.prototype.asArray(separator) {
return this.split(separator);
}

function Array.prototype.asPathString() {
return this.asString('\\');
}

function Array.prototype.asString(separator) {
return this.join(separator);
}

// ここまで

coopie さん 2004年 01月 15日 21時 05分 06秒

はじめまして。

WSH初心者のcoopieといいます。

フォルダ作成の関数を作ろうとしているのですが、うまくいきません。

例えば、"c:\a\b\c\d\e"のようなパスを渡すと、
フォルダが存在していなければ、a,b,c,d,eの全てのフォルダが作成されるように
したいと思っています。
初めから、行き詰まっています。
基本的な考え方だけでも知りたいと思っています。

できれば、JScriptがいいのですが、VBScriptでもかまいません。

よろしくお願いします。

いりや さん 2004年 01月 15日 12時 35分 49秒

くまさん、

特殊文字の削除については、実行される文脈 (与えるデータの文字コードや、そのデータが後々使われる箇所 (HTML を生成する一部をなすなど)) によって、こうすればよい、というのはかわってくると思います。

例えばロボ亭さんの CGI 集にその指針を得てはいかがでしょうか。
http://coco.wcn.to/

豊富な CGI が提供されておりまたスクリプトのサイズも適当であり調べる価値はあります。

rika さん 2004年 01月 15日 11時 52分 43秒

はじめまして。rikaと申します。
WSHを使い始めたばかりなのですが、行き詰まっています。

クライアントPCに設定されている、プリントサーバ上のプリンタとの接続を解除したいのに、
削除できません。

以下の記述で実行しています。
----------------------------------------------------------------------
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set oPrinters = WshNetwork.EnumPrinterConnections
For i = 0 to oPrinters.Count - 1 Step 2
on error resume next
WshNetwork.RemovePrinterConnection oPrinters.Item(i+1), true, true

Next
----------------------------------------------------------------------

・OSはWindows2000Proです。
・クライアントに登録されているネットワークプリンタの情報は下記の通りです。
   ・ポート:IP_172.*.*.* (Standard TCP/IP Port)
   ・プリンタ名 LBP2810-1
   ・Active Directoryの一覧に追加されています。


ご教授のほど、どうぞ宜しくお願いいたします。


くま さん 2004年 01月 14日 15時 29分 22秒

perlについて質問です。

下記のように文字の置き換えを行いたいのですが、
カタカナのリなども、変換対象となってしまいます。
このような場合どうのように対処すればいいのですか?
<置き換え処理>
$mes =~ tr/&;`'"*?<>^$\/\n\r//d; #~

宜しく御願いします。

AA さん 2004年 01月 13日 01時 11分 07秒

はじめまして知り合いに顔文字をIMEに辞書としてついかするやり方を教えたいのですが、高齢者のためうまく説明できません。こんなことを可能にすることはスクリプト上可能でしょうか?

hoge さん 2004年 01月 12日 20時 31分 16秒

bookmarklet を使うという魔界の仮面弁士さんの案を使わせていただくことにします。

できれば、他のプログラム(エディタ等)をアクティブにしたまま、
WSH を使って、IE をアクティブにすることなく、
「奥」にある IE の複数のウィンドウのうちの「一番手前」 から
タイトルとURL情報を得たかったんですけどね。

しかし、それは WSH では無理だという、つちやさんの意見を入れて妥協します。
Sleipnir は使う気ないのですが、参考として頭の隅に入れておきます。

ともかく、違ったアプローチを知ることができて良かったです。
ありがとうございました。

魔界の仮面弁士 さん 2004年 01月 12日 19時 03分 21秒

≫ hoge さん
WScriptからの操作でなくても良いのであれば、お気に入りに

javascript:alert(window.clipboardData.setData('text',document.title+'\n'+document.location.href)?'コピーしました。':'コピー失敗');

というURLへのショートカットを置いておく、という手もありますよ。

IEでこのショートカットを開くと、現在開いているページのタイトルとURLが、
クリップボードに取り込まれます。

つちや さん 2004年 01月 12日 16時 37分 39秒

アクティヴなウィンドウの操作は、WSH自体の機能としてはサポートされていないと思います。
WindowsAPIを操作できるCOMの助けを借りるか何かしないとできないのではないでしょうか。

ちなみに、Sleipnirなどの、IEのコンポーネントを利用したタブブラウザなら、そういうことができるのがあります。
というか、Sleipnirのスクリプト(WSHを利用しています)に、「URLとタイトルのコピー」という、そのままのものがあったりします。

参考までに、選択範囲をURL・タイトルとともにファイルに保存したいときや、開いているページのリンク一覧が欲しいときや、開いているページの画像をみんなまとめてダウンロードしたいときは、Sleipnirを使っています。

hoge さん 2004年 01月 12日 14時 07分 13秒

>> 魔界の仮面弁士さん
「一番上」というのは、私の書き方がまずかったですね。
「一番手前にあるもの」(アクティブなもの)が求めるものです。
WSH では無理なのかな。

魔界の仮面弁士 さん 2004年 01月 12日 13時 14分 59秒

≫ hoge さん
「一番手前にあるもの」ではなく、「一番上にあるもの」で良いのならば、
列挙したオブジェクトの中で、Topプロパティが一番小さい物を抽出すればOKかな。

hoge さん 2004年 01月 11日 14時 51分 02秒

現在開いている IE のウィンドウから、ページのタイトルと URL を得て、
クリップボードにコピーしようと試みてます。

で、IE のウィンドウが一つのときは、とりあえずできたんですが、
複数の IE ウィンドウがあるときに、一番上にあるものを選び出す方法が
分からず困ってます。

// 現在開いている IE のウィンドウ(?)を得る。
var Shell = WScript.CreateObject("Shell.Application");
var WindowsShell = Shell.Windows();
for (var i = 0; i < WindowsShell.Count; i++) {
if (WindowsShell.item(i).FullName.match(/iexplore.exe$/i)) {
var ie = WindowsShell.item(i);
break;
}
}

こうすると、一番最初に開いたウィンドウが得られてしまい、目的がかないません。

どうすればいいのか分かる方、助言をください。

KURO さん 2004年 01月 09日 17時 00分 00秒

魔界の仮面弁士様

ありがとうございました。
無事解決いたしました。

魔界の仮面弁士 さん 2004年 01月 09日 16時 15分 06秒

≫ KURO さん
SDKのサンプルを参考にしてみるとか。
http://msdn.microsoft.com/library/en-us/adsi/adsi/winnt_user_must_change_password_at_next_logon.asp


[Directory Services]
└[Directory Access Technologies]
 └[Active Directory Service Interfaces]
  └[Active Directory Service Interfaces Reference]
   └[ADSI Service Providers]
    └[ADSI WinNT Provider]
     └[WinNT User Object]
      └[WinNT User Account Management Examples]
       └[User Must Change Password at Next Logon (WinNT Provider)]

KURO さん 2004年 01月 09日 15時 32分 39秒

初めまして。
宜しくお願い致します。

WSH(VBS)を使用し「ユーザーアカウント」の設定を行っていたのですが、
一箇所どうしても設定出来ないところがありご質問させていただきます。

現在、以下の様に組んでいます。
Dim WSHShell
Dim WSHEnv
Dim hostname
Dim myUser

Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WSHEnv = WSHShell.Environment("PROCESS")

hostname = WSHEnv.Item("USERDOMAIN")

Const UF_DONT_EXPIRE = &H0002
Const UF_MASK = &HFFFFFFFF

Set myUser = GetObject("WinNT://" & hostname & "/Manager,user")
myUser.Put "UserFlags", myUser.UserFlags and (UF_MASK xor UF_DONT_EXPIRE)

myUser.SetInfo

上記のものの「Const UF_DONT_EXPIRE」へ入れる値により設定を行っているのですが、「ユーザーは次回ログオン時にパスワードの変更が必要」の項目の設定用の
フラグコードが分かりません。
どなたかご存知の方がいらっしゃいましたらお教えください。

※例の[0002]は「アカウントを無効にする」のコードです。

Thomas Borjeson さん (thomas.borjeson@telia.com) 2004年 01月 06日 00時 19分 41秒
URL:http://www.winfeedback.com

A New Testing Tool

WinFeedback is a Windows Scripting extension for testing, monitoring and automation purposes,
like response timing, up-timing, functional testing, stress testing, health monitoring, task automation.

Shareware, company license $65

www.winfeedback.com

Best regards,
Thomas Borjeson

Thomas B モjeson
Skonaren 1:3:3
SE-444 30 STENUNGSUND
Tel +46 303 72 67 00
Fax +46 303 72 66 07
Mobile +46 705 72 67 31
E-mail thomas.borjeson@telia.com
Site www.winfeedback.com

つちや さん 2004年 01月 05日 21時 15分 21秒

Dear toki さん

すでに開かれているExcelファイルのマクロの実行は、

Set XL = GetObject(,"Excel.Application")
XL.Run "Macro1"

でできます。またはマクロの実行だけであれば、

GetObject(,"Excel.Application").Run "Macro1"

と記述することもできます。
これを、.vbsの拡張子で保存して、FileMakerから「メッセージを送信」スクリプトで実行します。

toki さん (toki@macsys-jp.com) 2004年 01月 05日 18時 09分 00秒

こんにちわ、今日からWSHを使い出したばかりの初心者ですが
よろしくお願いいたします。
現在Win2000環境で、FileMaker6とExcel2003を使用しています。
1.FileMakerからWSHのファイルを開き(現在自動化可能です。)
2.WSHからExcelのマクロを実行したい(これが分かりません・・。)
(Excelのファイルはひらいたままマクロを実行したいのです。)
いろいろGoogle等で検索してみましたが見つからず、
最後の手段でこの掲示板に書き込ませていただきました。

まとめますと、WSHから 現在開かれているEXCELの マクロを実行したい。
のです。
ご教授よろしくお願い致します。

管理人むたぐち さん 2004年 01月 01日 00時 50分 42秒

あけましておめでとうございます。
今年も当サイトをよろしくお願いします。

お返事&更新できなくてスミマセン。
そして早く移転しないと容量が…!

しげ さん 2003年 12月 24日 18時 32分 41秒

いりやさん、
おかげでなんとかなりそうです(^^;
ありがとうございました。

いりや さん 2003年 12月 23日 20時 16分 31秒

一つ補足です。実行にあたっては wscript.exe よりも cscript.exe の方がよいです。

c:\> cscript //nologo test.js

というような感じで実行します。

いりや さん 2003年 12月 23日 19時 48分 55秒

しげさん、

| VBスクリプトからDosコマンドを実行する際の質問
| 1)結果(stdIO)を取得する
| 2)窓を表示しない
| 以上2点を同時にできないでしょうか?
|
| WshShell.Exec(***)ならば、1)は可能
| WshShell.Run(***,0,true)ならば、2)は可能

結果をファイルにリダイレクトして、そのファイルの中身を WshShell>>run()
メソッドを終えて確認する方法ならば、1) と 2) 両方達成可能です。

論よりコード。ちょっとやってみましょう。VBScript ではなく JScript で書い
ています。

大きな流れは、リダイレクトされたファイルのパス情報をもとに File オブジェ
クト、TextStream オブジェクトを得て、1行ずつ内容を読んでいくという処理
になります。

サンプルでは、試験するコマンドは DIR コマンドとし、実行後に標準出力の結
果から意味のある情報を抽出しています。(filter0, 1, 2, 3 四つのフィルタを
用意しています。Awk とかやったことのある人ならば同等なスクリプトを数行で
構築できるでしょう。) 動かして実行結果を確認すれば動きはすぐ把握できます。


[ 実行の仕方 ]

//process(readStream, filter0);
//process(readStream, filter1);
//process(readStream, filter2);
//process(readStream, filter3);

のどれか一行のみコメントを外して保存します。.js ファイル名で。ダブルクリッ
クすれば実行が始まります。


[ WSH/JScript ソースコード ]

new ActiveXObject('WScript.Shell').run('cmd.exe /c DIR > C:\\OUTPUT.LOG', 0, true);
var readStream = file→readStream(filepath→file('C:\\OUTPUT.LOG'));

//process(readStream, filter0);
//process(readStream, filter1);
//process(readStream, filter2);
//process(readStream, filter3);

function process(readStream, filter) {
    try {
        filter(readStream);
    } finally {
        readStream.close();
    }
}

function filepath→file(filepath) {
    var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
    return aFileSystemObject.fileExists(filepath) ? aFileSystemObject.getFile(filepath) : null;
}

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

// filter0 : 入力内容をそのまま出力する

function filter0(readStream) {
    while (!readStream.atEndOfStream)
        WScript.echo(readStream.readLine());
}

// filter1 : 2003/03 で始まる行を出力する

function filter1(readStream) {
    while (!readStream.atEndOfStream) {
        var aString = readStream.readLine();
        if (/^2003\/03/.test(aString))
            WScript.echo(aString);
    }
}

// filter2 : ファイルのサイズの合計を表示する。DIR コマンドの出力結果と一致するはず

function filter2(readStream) {
    var sum = 0;
    var nRecords = 0;
    while (!readStream.atEndOfStream) {
        var aString = readStream.readLine();
        var anArray = aString.split(/ +/);
        if (/^[0-9]/.test(aString) && !/\<DIR\>/.test(anArray[2])) {
            nRecords++;
            sum += new Number(anArray[2].replace(/,/g, ''));
        }
    }
    WScript.echo('sum: ' + sum + ' バイト');
    WScript.echo('nr: ' + nRecords + ' 行');
}

// filter3 : 通称 tail コマンドで提供される機能。最後の 5 行を出力 (tailSize で指定)

function filter3(readStream) {
    var tailSize = 5;
    var tailArray = new Array(tailSize);
    var nRecords = 0;
    while (!readStream.atEndOfStream) {
        var aString = readStream.readLine();
        nRecords++;
        for (var i = 0; i < tailSize - 1; i++)
            tailArray[i] = tailArray[i + 1];
        tailArray[tailSize - 1] = aString;
    }
    if (nRecords < tailSize)
        for (var i = tailSize - nRecords; i < tailSize; i++)
            WScript.echo(tailArray[i]);
    else
        for (var i = 0; i < tailSize; i++)
            WScript.echo(tailArray[i]);
}

// ここまで

しげ さん 2003年 12月 23日 15時 07分 24秒

はじめませてVBS初心者ですのでどうかよろしく。

VBスクリプトからDosコマンドを実行する際の質問
1)結果(stdIO)を取得する
2)窓を表示しない
以上2点を同時にできないでしょうか?

WshShell.Exec(***)ならば、1)は可能
WshShell.Run(***,0,true)ならば、2)は可能

よろしくお願いします。


YZN さん 2003年 12月 22日 15時 47分 46秒

>たかこ さん

'==== パスワード変更処理 =====
Public Sub ChangeCurrentUserAccountPassword(sOldPassword As String, sNewPassword As String)
With CreateObject("WScript.Network")
Call CreateObject("WinNT://" & .UserDomain & "/" & .UserName & ",user").ChangePassword(sOldPassword, sNewPassword)
End With
End Sub

Sub Main()
Dim sNewPass, sOldPass
sOldPass = InputBox("今のパスワードを入力してください。")
sNewPass = InputBox("新しいパスワードを入力してください。")
Call ChangeCurrentUserAccountPassword(sOldPass, sNewPass)
End Sub

こんな感じかな?
エラー処理等は加えてください。

たかこ さん 2003年 12月 19日 11時 26分 48秒

はじめまして、プログラムはほとんど初心者です。

現在ユーザーにログオン時にパスワードの
変更を強制するプログラムを作成したいと
考えております。
Userflagsを利用するという話はきいたのですが
その属性の扱い方がわかりません。
これをVBScriptで作成したいのですが
何かアドバイスがありましたらどうぞ
よろしくお願いいたします。

魔界の仮面弁士 さん 2003年 12月 18日 18時 24分 26秒

>> cmd.exe /c notepad.exe
IISは「サービス」なので、デスクトップとの対話が必要なアプリの起動は、
ご法度です。サーバ上でメモ帳が起動されても、それを閉じる人は居ませんし。


> Executeメソッドちゃんとありますね。
ですます。

機能としては同等ですが、Execute2はJScript用、ExecuteはVBScript用ですね。

take さん 2003年 12月 18日 17時 06分 38秒

>>魔界の仮面弁士 さん
すいません勘違いしていました。
Executeメソッドちゃんとありますね。

take さん 2003年 12月 18日 15時 20分 37秒

>>魔界の仮面弁士 さん
basp21のExecuteメソッドの実績はありますでしょうか?
ExecuteだとProで有償なのでnon pro を使用しました。
メソッドはExecute2になります。
下記スクリプトでやると何分たっても戻ってきません。
Execute2をコメントし、StrConvを復活すると
正常に動作します。

<SCRIPT LANGUAGE="VBScript" RUNAT="SERVER"></SCRIPT>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body>
<%
Set bobj = Server.CreateObject("basp21")
' stdout = bobj.StrConv("あああ", 16)
stdout = bobj.Execute2("cmd.exe /c notepad.exe",1)
If bobj.Result > 0 Then
Response.Write "<B>" & stdout & "<B><BR>"
End If
%>
</body>
</html>

魔界の仮面弁士 さん 2003年 12月 18日 13時 29分 22秒

≫ takeさん
> web環境(IIS)から.bat等起動したい場合は
basp21のExecuteメソッドを使ってみては如何でしょう。

ユーコン さん 2003年 12月 18日 12時 05分 01秒

takeさん、魔界の仮面弁士 さん 割り込み失礼します。
やっとわたしと同じ事で悩んでいる人を発見しました。

私の場合VBScriptですが、takeさんと同様のことを行おうとしています。
症状としては、「起動される場合と起動されない場合がある。」です。
"待ちなし起動"していますので、WShell.Runでは何が起こったか捕らえられていません。

IISからの起動ができない(たまたま出来てる?)のであれば、皆さんはどの様に解決してるんでしょう?
何か別の方法があるという事であればご教示ください。

(IISサーバーの環境は、OS:Windows2000 WSH5.6です。)

take さん 2003年 12月 18日 11時 42分 02秒

>>魔界の仮面弁士 さん 返信ありがとうございます
web環境(IIS)から.bat等起動したい場合は
どのように実現しているものなのでしょうか?

魔界の仮面弁士 さん 2003年 12月 18日 11時 33分 08秒

≫ takeさん
WScriptオブジェクトは、ホストがWSHの場合のみ使用できます。
IE、ASP、ScriptControl等がホストの場合には使用できません。

take さん 2003年 12月 18日 11時 07分 42秒

.jsファイルをfunctionなしで実行する分にはうまくいくのですが
htmlから呼び出した場合、「WScriptは宣言されていません」
というエラーになってしまいます。
何か設定等ひつようなのでしょうか?
ASP(HTML)からWSHを使用する例がみあたりません。

/* hello.html */
<SCRIPT LANGUAGE="VBScript" RUNAT="SERVER"></SCRIPT>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<script src="c:\asp\hello.js" language="JavaScript"></script>
</head>
<body>
<center>
<table border="0" width="660">
<tr>
<td><input readonly type="text" name="yukokigen_e" size="20" maxlength="10" onfocus="f_hello()" value="">
</td>
</tr>
</table>

</body>
</html>

/* hello.js */
function f_hello(){
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var WShell = WScript.CreateObject("WScript.Shell");
var stream = fs.CreateTextFile("a.bat");
stream.WriteLine("sqlplus srhcp/srhcp@srhcp");
stream.WriteLine("exit");
stream.Close();
WShell.Run("a.bat", 1, true);
}

小西 さん 2003年 12月 18日 06時 33分 33秒

結果報告が大変遅くなってしまいました。
2003年 11月 27日 22時 22分 55秒 に書き込みをしました、小西です。

Windows95にWSH5.5(scr55jp.exe)をインストールしてみました。すると、Windowsの起動時に以下のメッセージが出て起動しなくなってしまいました。
-----------------------------------------------------------
デバイスIOSを初期化中:
エラー:I/Oサブシステムドライバを読み込めませんでした。
.\iosubsysサブディレクトリのファイルが壊れているかメモリが不足しています。
-----------------------------------------------------------

やっぱりWSH5.5はWindows95には対応していなかったのでしょうか。
その後、セーフモードでは立ち上がるのですが、通常起動にすると何度やっても同じエラーが出て起動できませんでした。
WSHってアンインストールが出来ないんですね。コントロールパネルのアプリケーションの追加と削除でWSH5.5をアンインストールすればいいさ、なんて最初は気楽に思っていたのですが、結局問題の解決は出来ませんでした。

最終的にはWindows98をインストールしてWSHを使えるようにしたので、仕事上問題は無かったのですが・・・とりあえず結果の報告でした。

いりや さん 2003年 12月 17日 22時 10分 30秒

akinon さん、

AKiOSさんご提供のWSH Lab. 掲示板 記事検索プログラムが便利です。こちらで Adodb.Stream を検索語として入力すると一杯でてきます!

いりや さん 2003年 12月 17日 21時 56分 10秒

あちゃ、すみません。
Array_select(), Array_collect() バグってました。

function Array_select(discriminator) {
    var anArray = new Array();
    for (var i = 0; i < this.length; i++) {
        var each = this[i];
        if (discriminator(each))
            anArray.push(each);
    }
    return anArray;
}

function Array_collect(transformer) {
    var anArray = new Array();
    for (var i = 0; i < this.length; i++) {
        var each = this[i];
        anArray.push(transformer(each));
    }
    return anArray;
}


akinon さん 2003年 12月 17日 19時 51分 12秒

いりやさんへ

度々のフォローありがとうございました。
いりやさんに教えていただいた最後のやり方で、思い通りに動作させる事ができるようになりました。

WSH掲示板の過去ログにもあったのですね。
検索したのだけれど、どうしても見つからなかったので書き込んでしまったのですが...

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

Tak さん 2003年 12月 17日 19時 47分 23秒

はじめまして。Takといいます。

2003/11/25のnemoさんと同じ問題でわたしも行き詰まってしまいました。
解決若しくは代替案を見つけたのであればご教示ください。

よろしくお願いします。

いりや さん 2003年 12月 17日 13時 52分 28秒

魔界の仮面弁士さん、owl さん、

VBScript のコードのご提示ありがとうございます。こうやって二つのコードを並べてみ
ると際立ちますね。

そうそう、魔界の仮面弁士さんがおっしゃる通り、コードは Java によく似ていますが
Microsoft JScript で書いたものです。

本家 (ECMAScript) の仕様書の概要にも書かれていますが Java と Self というプログ
ラム言語からいろいろと機能を拝借したとあります、文法 (Syntax) などはまさにそう
です。

ところで。ところで、スクリプト中の detect() メソッドはメソッド名を間違えており
ました。

このメソッドに期待していたのは、ある条件に適合する要素だけを抽出した新しい集ま
り (Collection) を返す機能でした。

わたしがお手本にしていた Smalltalk というプログラム言語の仕様と実装例をもう一回
調べてみたら detect() ではなく select() であることが分かりました。混乱を招く名
前を使用しまして申し訳ありませんでした。下記の通り、お詫びして訂正します。若干
修正しました。

[ 実行例 ]

C:\Documents and Settings\iriyak\デスクトップ>cscript //nologo select.js
------------
C:\tmp\0.doc
C:\tmp\1.doc
C:\tmp\2.doc
C:\tmp\3.doc
C:\tmp\4.doc
------------
['0.doc', '1.doc', '2.doc', '3.doc']
------------
Discriminator: [function (each) { return (/.doc$/.test(each.name)) }]
['C:\\tmp\\0.doc', 'C:\\tmp\\1.doc', 'C:\\tmp\\10.doc', 'C:\\tmp\\11.doc', 'C:\\
tmp\\12.doc', 'C:\\tmp\\13.doc', 'C:\\tmp\\14.doc', 'C:\\tmp\\15.doc', 'C:\\tmp\
\16.doc', 'C:\\tmp\\17.doc', 'C:\\tmp\\18.doc', 'C:\\tmp\\19.doc', 'C:\\tmp\\2.d
oc', 'C:\\tmp\\3.doc', 'C:\\tmp\\4.doc', 'C:\\tmp\\5.doc', 'C:\\tmp\\6.doc', 'C:
\\tmp\\7.doc']

Discriminator: [function (each) { return (/^[0-4].doc$/.test(each.name)) }]
['C:\\tmp\\0.doc', 'C:\\tmp\\1.doc', 'C:\\tmp\\2.doc', 'C:\\tmp\\3.doc']

Discriminator: [function (each) { return (/^1[0-9].doc$/.test(each.name)) }]
['C:\\tmp\\10.doc', 'C:\\tmp\\11.doc', 'C:\\tmp\\12.doc', 'C:\\tmp\\13.doc', 'C:
\\tmp\\14.doc', 'C:\\tmp\\15.doc', 'C:\\tmp\\16.doc', 'C:\\tmp\\17.doc', 'C:\\tm
p\\18.doc']


C:\Documents and Settings\iriyak\デスクトップ>


[ WSH/JScript ソースコード ]

// ここから
function Enumerator_asArray() {
    var anArray = new Array();
    for (; !this.atEnd(); this.moveNext()) {
        var each = this.item();
        anArray.push(each);
    }
    return anArray;
}
Enumerator.prototype.asArray = Enumerator_asArray;

function Array_select(discriminator) {
    var anArray = new Array();
    for (var i = 0; i < this.length - 1; i++) {
        var each = this[i];
        if (discriminator(each))
            anArray.push(each);
    }
    return anArray;
}

function Array_collect(transformer) {
    var anArray = new Array();
    for (var i = 0; i < this.length - 1; i++) {
        var each = this[i];
        anArray.push(transformer(each));
    }
    return anArray;
}

function Array_do_(aFunction) {
    for (var i = 0; i < this.length; i++)
        aFunction(this[i]);
}

function Array_printString() {
    var stringArray = new Array();
    var quote = function (aString) {
        var q = String.fromCharCode(39);
        return new Array(q, aString.replace(/\\/g, '\\\\'), q).join('');
    }
    stringArray.push('[');
    for (var i = 0; i < this.length - 1; i++) {
        var s = typeof(this[i]) == 'object' ? this[i] + '' : this[i].toString();
        stringArray.push(quote(s), ', ');
    }
    s = typeof(this[i]) == 'object' ? this[i] + '' : this[i].toString();
    stringArray.push(quote(s));
    stringArray.push(']');
    return stringArray.join('');
}

Array.prototype.select = Array_select;
Array.prototype.collect = Array_collect;
Array.prototype.do_ = Array_do_;
Array.prototype.printString = Array_printString;

// selectFiles()
//
// folderPath 中のファイルのうち discriminator の条件に合致するものを
// 集めた Array オブジェクトを返す。要素は File オブジェクト。

function selectFiles(folderPath, discriminator) {
    var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
    if (!aFileSystemObject.folderExists(folderPath))
        return null;
    else {
        var files = aFileSystemObject.getFolder(folderPath).files;
        var anArray = new Enumerator(files).asArray();
        return anArray.select(discriminator);
    }
}

// example1() : Array.prototype.do_() メソッド例
//
// c:\tmp 中のファイル名が [0-4].doc の File オブジェクトのみ抽出して
// 各要素のパス名 (pathプロパティー) を表示させる処理を doBlock 関数
// オブジェクトで行う。

function example1() {
    var folderPath = 'c:\\tmp'; // c:\tmp フォルダを対象
    var discriminator = function (each) { return (/^[0-4].doc$/.test(each.name)) }; // ファイル名が [0-4].doc
    var fileArray = selectFiles(folderPath, discriminator);
    var doBlock = function (each) { WScript.echo(each.path) };
    fileArray.do_(doBlock);
}

// example2() : Array.prototype.collect() メソッド例
//
// c:\tmp 中のファイル名が [0-4].doc の File オブジェクトのみ抽出して
// 各要素のファイル名 (name プロパティー) を要素にもつ Array オブジェ
// クトを返す。

function example2() {
    var folderPath = 'c:\\tmp'; // c:\tmp フォルダを対象
    var discriminator = function (each) { return (/^[0-4].doc$/.test(each.name)) }; // ファイル名が [0-4].doc
    var fileArray = selectFiles(folderPath, discriminator);
    var transformer = function (each) { return each.name };
    var filenameArray = fileArray.collect(transformer);
    WScript.echo(filenameArray.printString());
    return filenameArray;
}

// example3() : Array.prototype.do_() メソッド例
//
// 複数の discriminator を用意して、Array.prototype.select() (selectFiles() 関数
// 内にて) に適用します。doBlock 関数オブジェクトで処理しているのは、File オブジェ
// クトの抽出と、各要素のパス情報 (path プロパティー) の表示です。

function example3() {
    var folderPath = 'c:\\tmp'; // c:\tmp フォルダを対象
    var discriminator1 = function (each) { return (/.doc$/.test(each.name)) }; // ファイル名が .doc で終わる
    var discriminator2 = function (each) { return (/^[0-4].doc$/.test(each.name)) }; // ファイル名が [0-4].doc
    var discriminator3 = function (each) { return (/^1[0-9].doc$/.test(each.name)) }; // ファイル名が 1[0-9].doc
    var discriminatorArray = new Array(discriminator1, discriminator2, discriminator3);

    var doBlock = function (discriminator) {
        WScript.echo('Discriminator: [' + discriminator + ']');
        var fileArray = selectFiles(folderPath, discriminator);
        var filenameArray = fileArray.collect(function (each) { return each.path });
        WScript.echo(filenameArray.printString());
        WScript.echo('');
    }
    discriminatorArray.do_(doBlock);
}

//
// main
//

WScript.echo('------------');
example1();
WScript.echo('------------');
example2();
WScript.echo('------------');
example3();
// ここまで

いりや さん 2003年 12月 17日 12時 09分 56秒

も一つ、忘れていた。バイナリファイルを格納する場合。
(WSH 掲示板や 2ch で紹介されています。)

// ここから

var aURL = 'http://iriyak.adam.ne.jp/pic/mac.jpg'; // JPEG 画像
var filePath = '.\\mac.jpg';

saveSourceObjectTo(aURL, filePath);
invokeRunMethodWith(doubleQuote(filePath)); // filePath のファイルを開く

function saveSourceObjectTo(aURL, filePath) {
    var msXMLHTTP = new ActiveXObject('Microsoft.XMLHTTP');
    var adodbStream = new ActiveXObject('Adodb.Stream');
    msXMLHTTP.open('GET', aURL, false);
    msXMLHTTP.send();
    adodbStream.type = 1; // 1 = adTypeBinary;
    adodbStream.open();
    adodbStream.write(msXMLHTTP.responseBody);
    adodbStream.saveToFile(filePath, 2); // 2 = adSaveCreateOverWrite
}

function invokeRunMethodWith(aCommandLine) {
    return new ActiveXObject('WScript.Shell').run(aCommandLine);
}

function doubleQuote(s) {
    var q = String.fromCharCode(34);
    return new Array(q, s, q).join('');
}

// ここまで

いりや さん 2003年 12月 17日 02時 03分 38秒

akinon さん、

がんばってください。

ちなみにもう一つのやり方は Dynamic HTML Object Model を利用します。リン
ク先のウェブ・ページの Dynamic HTML Object (document object) へのリファ
レンスを Internet Explorer の document プロパティーを通じて取得します。

その document を構成する html 表現は、フレームを構成しない場合ならば、
document.body.parentElement.outerHTML プロパティーを通じて取得できます。
これを外部に保存してやれば OK です。以下、サンプルです。

// ここから

var url = 'http://www.yahoo.co.jp/';
var outputFilePath = 'd:\\test.html';
example(url, outputFilePath);

function example(url, outputFilePath) {
    var e = new ActiveXObject('InternetExplorer.Application');
    e.visible = true;
    e.navigate2(url);
    while (e.busy || e.readyState != 4)
        WScript.sleep(0.1 * 1000);
    try {
        var writeStream = file→writeStream(filepath→file(outputFilePath));
        writeStream.write(e.document.body.parentElement.outerHTML);
    } finally {
        writeStream.close();
    }
}

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→writeStream(file) {
    var ForWriting = 2;
    var TristateUseDefault = -2;
    return file.openAsTextStream(ForWriting, TristateUseDefault);
}

// ここまで

akinon さん 2003年 12月 16日 13時 12分 01秒

いりやさんへ

早速のご回答ありがとうございます。

ご指摘のコードを解析してみます。
本当にありがとうございました。

owl さん 2003年 12月 16日 12時 37分 13秒

魔界の仮面弁士さん

ご指摘ありがとうございます。
とても参考になりました。

Return