TAKE さん 2003年 09月 10日 17時 47分 50秒

『sessionオブジェクトに自分で定義したオブジェクトを保存し、
 保存したオブジェクトを取得するには?』
と、質問させて頂いてましたTAKEです。

こちらの方、以下の通り解決することができました。

*------------------------------------------------------------------------------*
格納ファイルにてローカル定義したクラスオブジェクトを、Session変数に代入しても、
定義情報が失われてしまうので処理が失敗。
取得ファイルでもう一度ローカル定義をしても変数に代入されているオブジェクトと
関連付ける手段がないので、エラーが発生してしまうみたいです。

クラスにて配列変数へデータ格納し、Session変数へは配列を格納することで実装。
*------------------------------------------------------------------------------*

皆さま、ありがとうございました!!

WS さん 2003年 09月 10日 10時 34分 45秒

はじめまして
WSHを使用して、イベントログに記述されている情報を読み込みたいのですが、
なにか良い方法はないでしょうか?

BA さん 2003年 09月 09日 18時 36分 02秒

初めて質問させていただきます、BAと申します。
現在VBSでADOを用いてactived irectory(以下AD)の作業を行っているのですが
ADの部署の一覧を取得したいのですがなかなかよい方法が思いつきません。
はじめ考えましたのはADOでgroup byが使えないかと思ったのですが
order byは動くのですがgroup byだとうまくいきませんでした。
プログラムは以下のとおりです。
現在はVB.NETを用いています。
obj = CreateObject("ADODB.Connection")
obj.Provider = "ADsDSOObject"
obj.Open("Active Directory Provider")
strQ = "SELECT ADsPath,department FROM 'LDAP://DC=fu4tsu,DC=com'"
strQ = strQ & "WHERE objectCategory='person' "
strQ = strQ & "AND objectClass='user'order BY department"
objRs = obj.Execute(strQ)
ADOではグループ化はできないのでしょうか。
また部署(department)をうまく取り出す
方法が他にないでしょうか。
重複なく一覧として抽出したいのですが、
何かよい方法がありましたらアドバイスいただけると
幸いです。
どうぞよろしくお願いいたします。

SOU さん 2003年 09月 09日 09時 46分 17秒

いりやさん
ご丁寧な説明ありがとうございます。
ただいま多忙なため、じっくりと試すことができていません。。。
時間のあるときに、まとめて試したいと思います。
そのときにまた結果を報告させてもらいますね!
ありがとうございます!

サトリエ さん 2003年 09月 08日 16時 26分 40秒

初めまして。
仕事でどうしてもWSHを勉強する必要がありまして
ウロウロしてるうちにこのサイトに辿り着きました。
講座分かりやすくてとてもいいですね。
こんなに便利なものだとは知りませんでした。
即ブックマークにさせてもらいました(^-^;)
これからも仕事中に覗いてみたいと思います。
頑張ってください。

TAKE さん 2003年 09月 08日 11時 53分 31秒

すみません、先程の文字化けしてましたね・・・。

文字化け部分
『また構造体として扱いたい為、クラスを利用する事にしました。』です。

簡潔にやりたい事を伝えますと、
「sessionオブジェクトに自分で定義したオブジェクトを保存し、
 保存したオブジェクトを取得するには?」
という事です。

どうぞ、宜しくお願いします。



TAKE さん 2003年 09月 08日 10時 21分 12秒

以前、VBSでのクラス宣言を教えて頂きましたTAKEです。
引き続きクラスについて質問させて頂きます。

webブラウザにてページが遷移する際、次ページでも同じデータを
扱いたい、また構造体として扱いたい為ぅD薀垢鮖藩僂垢詈W「砲靴泙靴拭」
仕様は以下の通りです。

クラス宣言を本体とは別のファイル(mem_class.inc)に記述し、
格納ファイル(set_class.asp)にてクラスのインスタンスを宣言し、
データを格納後、次ページで同じデータが扱えるようクラスの
インスタンスをsessionにセット。
次ページとなる取得ファイル(get_class.asp)にてsessionより
クラスのインスタンスを取得後、前ページで格納したデータを扱う。

と、考えPGを作成してみたのですが、sessionにセットが出来ず、
『オブジェクトでサポートされていないプロパティまたはメソッドです。』
といった、エラーが出力されてしまいます。

どのように作成したら次ページでもデータを扱う事が可能となるのでしょうか?
ネットや本などを参考し調べているのですが、思うように書かれていません。
どなたかご教授のほど宜しくお願いいたします。


mem_class.inc (◆クラスファイル)

 Class MEMBER
  Public ADD
  Public TEL
 End Class


set_class.asp (◆格納ファイル)

<!--#include file="mem_class.inc"-->

 Set member1 = New MEMBER
 member1.ADO="hogehoge"
 ...
Set Session("member1") = member1


get_class.asp (◆取得ファイル)

<!--#include file="mem_class.inc"-->

 Set member1 = session("member1")
 Response.Write "member1.ADD =" & member1.ADD

いりや さん 2003年 09月 06日 15時 40分 11秒

SOU さん、

こんにちは。
フォルダの最終更新日付もコピー元の値が反映されていましたか??
こちらでは作成日付 (つまりバックアップをおこなった日付) とな
るんです。。

SOU さん 2003年 09月 06日 15時 06分 34秒

いりやさん
返信が送れて申し訳ありません。
お返事&詳しい説明、本当にありがとうございます。
いりやさんのおかげでなんとか、予定していた動きはするように
なったみたいです。
ううむ。WSHは奥が深い・・・

いりや さん 2003年 09月 05日 14時 35分 24秒

> Mercury さんのディスクミラーリングツールのソースコードも合わ
> せて追っていますが日付同期のからくりは解明できていません。。
> http://www5.wisnet.ne.jp/~mercury/

こちら調べた結果をお知らせします。

最初フォルダの日付も保存されていると思っていましたがよくよく調べてみ
るとバックアップ先は,バックアップ日時になっていました。

観測事象を前提にするとエクスプローラでコピー&ペーストしたり,WSH の
スクリプトでおこなったときとおおよそ同じように思います。

ソースコードの実際のファイルコピー操作は ThreadMirroring.cpp 826 行目
の BOOL CThreadMirroring::MyCopyFile(LPCSTR sFrom, LPCSTR sTo) メソッ
ドでおこなっていて,Win32 API の CopyFile() か SHFileOperation() をつ
かっていました。

SHFileOperation() のオプションを見ると,wFunc メンバは FO_COPY でこれ
はよいとして fFlags は,ダイアログが現れたら何でも "はい" とこたえる
(FOF_NOCONFIRMATION) オプションとあて先ディレクトリの複数設定可能
(FOF_MULTIDESTFILES) オプションを設定しているだけのようでした。


// 引用開始 (ThreadMirroring.cpp)

BOOL CThreadMirroring::MyCopyFile(LPCSTR sFrom, LPCSTR sTo)
{
    if (GetActiveDefine()->bUseShellCopy == false) {
        // CopyFile() API でのコピー
        return(CopyFile(sFrom, sTo, FALSE));
    }

    // シェル API でのコピー
    SHFILEOPSTRUCT shfileCopy;
    memset(&shfileCopy,0,sizeof(shfileCopy));
    shfileCopy.wFunc = FO_COPY;
    shfileCopy.fFlags = FOF_NOCONFIRMATION | FOF_MULTIDESTFILES;
    shfileCopy.fAnyOperationsAborted = TRUE;
    shfileCopy.lpszProgressTitle = "ファイルコピー中...";
    
    // コピー元、コピー先をダブル'\0'に変換して設定する
    CString    strFrom, strTo;
    strFrom.Format("%s|", sFrom);
    strFrom.Replace('|','\0');
    strTo.Format("%s|", sTo);
    strTo.Replace('|','\0');
    shfileCopy.pFrom = (LPCSTR)strFrom;
    shfileCopy.pTo = (LPCSTR)strTo;

    // コピー実行
    return(SHFileOperation(&shfileCopy) ? FALSE : TRUE);
}

// 引用おわり

とすると・・・ Win32 API の GetFileTime() と SetFileTime() の組で何と
かしないといけないのかなー。

いりや

いりや さん 2003年 09月 05日 12時 52分 26秒

むたぐちさん,

サジェッションありがとうございます。進展しました。

(1) ファイルに対する操作ならば変更が出来るようになった。
(2) フォルダに対する操作ならばまだ変更できないようだ。

以下のスクリプトを実行すると次のような結果がでます。変更が反映されてい
ないようですね。Win32 API の GetFileTime(), SetFileTime() を間接的に実
行する策はないものかしらん。。

// ここから

C:\Documents and Settings\iriyak\My Documents>cscript //nologo backupFolderTo.js

[restoreModifyDate_case1]
SRC: C:\test-folder : Wed Sep 3 17:40:52 UTC+0900 2003
DST: E:\test-folder : Fri Sep 5 10:54:50 UTC+0900 2003

SRC: C:\test-folder : Wed Sep 3 17:40:52 UTC+0900 2003
DST: E:\test-folder : Fri Sep 5 10:54:50 UTC+0900 2003

[restoreModifyDate_case2]
SRC: C:\test-folder : Wed Sep 3 17:40:52 UTC+0900 2003
DST: E:\test-folder : Fri Sep 5 10:54:50 UTC+0900 2003

SRC: C:\test-folder : Wed Sep 3 17:40:52 UTC+0900 2003
DST: E:\test-folder : Fri Sep 5 10:54:50 UTC+0900 2003

// ここまで


// ここから

var sourceDirectory = 'c:\\';
var destinationDirectory = 'e:\\';
var folderName = 'test-folder';

restoreModifyDate_case1(sourceDirectory, destinationDirectory, folderName);
restoreModifyDate_case2(sourceDirectory, destinationDirectory, folderName);

function restoreModifyDate_case1(sourceDirectory, destinationDirectory, folderName) {
    var aShell = new ActiveXObject('Shell.Application');
    var sourceFolderItem = aShell.nameSpace(sourceDirectory).parsename(folderName);
    var destinationFolderItem = aShell.nameSpace(destinationDirectory).parsename(folderName);
    WScript.echo('[restoreModifyDate_case1]');
    restoreModifyDateCore(sourceFolderItem, destinationFolderItem);
}

function restoreModifyDate_case2(sourceDirectory, destinationDirectory, folderName) {
    var aShell = new ActiveXObject('Shell.Application');
    var sourceFolder = aShell.nameSpace(sourceDirectory + folderName);
    var destinationFolder = aShell.nameSpace(destinationDirectory + folderName);
    var sourceFolderItem = sourceFolder.self;
    var destinationFolderItem = destinationFolder.self;
    WScript.echo('[restoreModifyDate_case2]');
    restoreModifyDateCore(sourceFolderItem, destinationFolderItem);
}

function restoreModifyDateCore(sourceFolderItem, destinationFolderItem) {
    var resultArray = new Array();
    resultArray.push('SRC: ' + sourceFolderItem.path + ' : ' + sourceFolderItem.modifyDate);
    resultArray.push('DST: ' + destinationFolderItem.path + ' : ' + destinationFolderItem.modifyDate);
    destinationFolderItem.modifyDate = sourceFolderItem.modifyDate;
    resultArray.push(' ↓');
    resultArray.push('SRC: ' + sourceFolderItem.path + ' : ' + sourceFolderItem.modifyDate);
    resultArray.push('DST: ' + destinationFolderItem.path + ' : ' + destinationFolderItem.modifyDate);
    resultArray.push('');
    WScript.echo(resultArray.join('\n'));
    return resultArray;
}

// ここまで

TAKE さん 2003年 09月 05日 12時 10分 03秒

むたぐち様
ありがとうございました。

まだ、思うようにクラスを扱えず、現在調べ中ですが、
クラス宣言を使わせて頂きます。

まだまだ、悩みは尽きませんが、
また何かありましたら、どうぞ宜しくお願いします。





ひまかな さん 2003年 09月 05日 09時 58分 50秒

むたぐち様
ありがとうございました。
今、動作確認いたしました。
悩んでいた事が解決できて、感動です。

あまり知識がないまま、検索をかけていたので
こちらのページが関連あることにも気づきませんで・・・。

see http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shell.htm

ご教授いただいたおかげで、世界が広がりました。
本当にありがとうございました。

pon さん 2003年 09月 05日 09時 28分 45秒

管理人様
>> どうも、DRMというフォルダを読もうとしたときに出てるようで、このフォルダがAdminも含めた全アカウントに対してアクセス拒否になってるのが原因のようです。
>Adminもアクセスできないということは、誰も触れないんじゃないですか?
WSHでどうこうするという以前に、まずフォルダにアクセスできるようにすべきかと思います。

このDRMって、多分MedioPlayerの著作権管理か何かのフォルダですよね。
インストール時にこのようなアクセス権になってるので、
勝手に変更してはまずいのかなと。
用は、このようなアクセス権のないフォルダに関しては、
無視してスクリプトが続行できればいいのですが。

やまかな さん 2003年 09月 05日 09時 15分 23秒

むたぐち様へ

>> 現在1台のwindows95マシンを複数ユーザーが使用するため、
>> ・・(省略)・・・通常の状態を保つことができません。

>私もあまり詳しくないのですが、こういうのってセキュリティポリシーとか>で
>何とかならないんでしょうか。
>Win95だと無理かもしれませんが…。

そうですよね。windows2000以降でしたら、
セキュリティポリシーで可能と本で読んだのですが(..)ゞ
NTサーバーとwin95クライアントなので・・・
ず〜っと悩んでおりました。

でも、方法を教えてくださってありがとうございます。
早速試してみます。




いりや さん 2003年 09月 05日 00時 43分 22秒

おとぺんさん、

単純に SLEEP をとって submit を繰り返すというお話なのかな??
すみません、ちょっとよくわからなくて。サンプルのスクリプト
とウェブ・サイトもしくは HTML ソースがあるとうれしいです。

おとぺん さん 2003年 09月 04日 23時 10分 20秒

いりやさん、

いやそれはないです。
一度はちゃんとSubmitされるので、
後はそれを時間間隔をとって繰り返しSubmitさせるものを作りたいのです。

いりや さん 2003年 09月 04日 23時 07分 17秒

おとぺんさん,

初回クリックした後もしかして画面が変化したりします?画面が遷移
したりとか

おとぺん さん (otopensan@yahoo.co.jp) 2003年 09月 04日 23時 00分 34秒

はじめまして!
実はEXCELのVBを使ってやりたいことがあります。
途中までできているのですが、最後の詰めができなくて今回質問させてください。
objIE.document.all.submit.Clickというコマンドを使って送信させた後、
少し時間を置いて再びobjIE.document.all.submit.Clickを行うということをしたいのですが、それにはどのようにしたらよいのでしょうか?

管理人むたぐち さん 2003年 09月 04日 22時 32分 42秒

このサイトも開設から4年が過ぎ、レンタルWebサイトの残容量もかなり危なくなってきました。
と言っても、ほとんどこの掲示板のログで占めているのですが。
一度5MB→10MBへの引き上げがあったので、待っていればそのうちまた増えるかな…と
漫然と考えていたのですが、どうも使い切るのが先のようです。
そこで、レンタルWebサーバーを借りることにしました。
評判の高い、XREA.COMの無料サーバー募集を狙っています。
コンテンツをどう分散させるかなど、まだ考え中ですが、今年中には確実に何らかの変化が
あると思います。
フォルダカスタマイズ関係のアップローダーを設置するのはほぼ確定です。
ついでにWSHスクリプト用アップローダーも?
(ただ、アップローダーは管理が大変なので、あまり色々手を出さない方がいいかも知れません)


To: あさじゃけん さん

> 実は、休みに入る前、ADSI使うWSHの解説ページを作成していたのですが、途中で止まってしまいました。(^^;;
> まぁ、それは冗談として、出来たら一度むたぐちさんに見てもらえるといいかなぁ・・とか思ったりしてます。

見せていただけるなら是非。
私にアドバイスできることはあんまりないかもしれないですが。

ついでにLesson16〜49も是非。


To: オックン さん

> エクセル終了時に、自動でネットワークドライブを切断する
> ファイルを作成しました。

これはVBAのマクロの話でしょうか?
ネットワークドライブの切断が上手くいってないのかもしれませんが、
ちょっと分かりません。


To: とも さん

> Windows2000で、「マイネットワーク」−「プロパティ」−「ローカルエリア接続」
> −「プロパティ」内の「Microsoftネットワーク用ファイルとプリンタの共有」のチェック
> を有効/無効にする設定をWSHから行うことは可能でしょうか?

対応するレジストリキーを書き換えるとかでしょうか。
この方法が有効かどうかは分かりませんが…。


To: pon さん

> どうも、DRMというフォルダを読もうとしたときに出てるようで、このフォルダがAdminも含めた全アカウントに対してアクセス拒否になってるのが原因のようです。

Adminもアクセスできないということは、誰も触れないんじゃないですか?
WSHでどうこうするという以前に、まずフォルダにアクセスできるようにすべきかと思います。
当たり前の回答ですみません。


To: いりや さん

> 最終更新日付がひきつがれていないようです,すみませんでした。

Shell.ApplicationのFolderItemオブジェクトのModifyDateプロパティが、
読み書き両方可能であることを利用すれば、あらかじめ記録しておいた最終更新日時を、
コピー後に書き換えることも可能だと思います。

以下、参考例。D&Dしたファイルの最終更新日時を、本日の0:00にします。

Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
Set Shell = WScript.CreateObject("Shell.Application")

For Each sArg In WScript.Arguments
If Fs.FileExists(sArg) Or Fs.FolderExists(sArg) Then
Call ModifyDate(sArg,Date)
End If
Next

MsgBox "終了"

Sub ModifyDate(path,dateval)
Shell.NameSpace(Fs.GetParentFolderName(path)).ParseName(Fs.GetFileName(path)).ModifyDate=dateval
End Sub


To: TAKE さん

> ぜひ、VBスクリプトでの構造体宣言の仕方を教えてください。

VBSでは構造体を宣言することはできません。
その代わりに、VBS v5以上では、クラスを宣言することはできます。
詳しくはVBSのリファレンスをどうぞ。

もっとも単純にやるなら、こんな感じでしょうかね。

Class MEMBER
Public ADD
Public TEL
Public NAME
End Class

Set member1 = New MEMBER
member1.ADO="hogehoge"
...
Set member1 = Nothing


To: ひまかな さん

> 現在1台のwindows95マシンを複数ユーザーが使用するため、
> デスクトップの表示をいろいろ変更されてしまい、
> 通常の状態を保つことができません。

私もあまり詳しくないのですが、こういうのってセキュリティポリシーとかで
何とかならないんでしょうか。
Win95だと無理かもしれませんが…。

IE4と統合されたWin95なら、これで簡単に名前を変更できます。
Set Shell = WScript.CreateObject("Shell.Application")
Shell.NameSpace("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}").Items.Item.Name = "マイ コンピュータ"
Shell.NameSpace("::{208D2C60-3AEA-1069-A2D7-08002B30309D}").Items.Item.Name = "ネットワーク コンピュータ"

あるいは、
Shell.NameSpace(17).Items.Item.Name = "マイ コンピュータ"
Shell.NameSpace(18).Items.Item.Name = "ネットワーク コンピュータ"
のようにしてもいいです。see http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shell.htm

Win2000ならこんな芸当も可能です。
Shell.NameSpace("shell:DriveFolder").Self.Name="マイ コンピュータ"
Shell.NameSpace("shell:NetworkFolder").Self.Name="マイ ネットワーク"
see http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/technic.htm#特殊フォルダを開く

ひまかな さん 2003年 09月 04日 17時 58分 57秒

ごめんなさい。
文字化けしてました。
以下、訂正です。

Set WsShell = CreateObject("Wscript.Shell")
WsShell.RegWrite "HKEY_CURRENT_USER\Software\Classes\CLSID\{208D2C60-3AEA-1069-A2D7-08002B30309D}","ネットワークコンピュータ","REG_SZ"

すみません。宜しくお願いします。

ひまかな さん 2003年 09月 04日 16時 37分 27秒

はじめまして。
WSHを手探りで使おうと苦戦している ひまかな と申します。

現在1台のwindows95マシンを複数ユーザーが使用するため、
デスクトップの表示をいろいろ変更されてしまい、
通常の状態を保つことができません。

具体的にはデスクトップに表示される”マイコンピュータ”や
”ネットワークコンピュータ”の表示を変更させたくないのですが
なかなかうまくゆかず、悩んでいます。

一応、考えとしては、再起動ごとに”ネットワ−クコンピュータ”を
書き直そうかとおもいまして、下記のスクリプトを試しましたが
エラーが出てしまいました。

Set WsShell = CreateObject("Wscript.Shell")
WsShell.RegWrite "HKEY_CURRENT_USER\Software\Classes\CLSID\{208D2C60-3AEA-1069-A2D7-08002B30309D}","発嬬宛 際盆Oタ","REG_SZ"


壁紙や、InternetExplorerのスタートページなどは
再起動後に書き換えることで成功しているのですが、
今回の場合はうまくいきません。

\CLSIDの場合は、普通にレジストリを書き込むだけではいけないのでしょうか。

なんとなく、他の言語のページなどで、特別だということは
わかったのですが、WSHでは具体的にどうすればできるのか
手立てが思い浮かびません。

どなたかご教授のほど宜しくお願いいたします。


TAKE さん 2003年 09月 04日 15時 40分 06秒

度々すみません。先程のTAKEです。

書き忘れてしまいましたが、ASPへVBスクリプトを埋め込んで作業しています。
webでページが遷移する際、構造体としてガツッと、次のページへデータを送りたい為、
どうしても使いたいです。

よろしくお願いします。

TAKE さん 2003年 09月 04日 15時 27分 56秒

最近VBスクリプトを学習し始めましたTAKEといいます。
ホントの初心者で、分からない事ばかりな為、こちらに質問させて頂きます。
(このような質問は受け付けていなかったら、大変申し訳ありません・・・)

VBスクリプトにて、構造体を使用する為、VBのようにTYPE宣言したのですが、
例えば以下のように

Type MEMBER
ADD
TEL
NAME
End Type

『コンパイル エラー ステートメントがありません』 というエラーが出力してしまいます。
どうにか、構造体が使えないものかと悩んでいます。
ぜひ、VBスクリプトでの構造体宣言の仕方を教えてください。

いりや さん 2003年 09月 04日 14時 54分 40秒

SOU さん,

ちょっと訂正です。

最終更新日付がひきつがれていないようです,すみませんでした。
下記のスクリプトは現在使用しているものです。(ドラッグ&ドロッ
プの口を用意した例も組み込んでいますがこちらはおまけ)

backupFolderTo(), backupFolderTo_2() ともうまくいっていない
ようです。。

Mercury さんのディスクミラーリングツールのソースコードも合わ
せて追っていますが日付同期のからくりは解明できていません。。
http://www5.wisnet.ne.jp/~mercury/

うむむ。

// ここから

var sourceFolderPath = 'c:\\test-folder';
var destinationFolderPath = 'e:\\';

//example1(sourceFolderPath, destinationFolderPath);
//example2(sourceFolderPath, destinationFolderPath);
example3(destinationFolderPath);
//example4(sourceFolderPath, destinationFolderPath);

// backupFolderTo() 使用例その1
function example1(sourceFolderPath, destinationFolderPath) {
    backupFolderTo(sourceFolderPath, destinationFolderPath);
}

// backupFolderTo() 使用例その2 (戻り値を呼出し元が検査)
function example2(sourceFolderPath, destinationFolderPath) {
    var wshShell = new ActiveXObject('WScript.Shell');
    var returnValue = backupFolderTo(sourceFolderPath, destinationFolderPath);
    wshShell.popup('Return value = ' + returnValue.toString().toUpperCase(), 3);
}

// backupFolderTo() 使用例その3 (ドラッグ&ドロップの口を用意)
function example3(destinationFolderPath) {
    var resultArray = new Array();
    var wshShell = new ActiveXObject('WScript.Shell');
    if (WScript.arguments.length < 1) {
        WScript.echo('ファイルをドラッグ&ドロップして起動ください。');
        WScript.quit(1);
    } else {
        for (var i = 0; i < WScript.arguments.length; i++) {
            var sourceFolderPath = WScript.arguments.item(i);
            var returnValue = backupFolderTo(sourceFolderPath, destinationFolderPath);
            resultArray.push((returnValue ? '成功' : '失敗') + ' : ' + sourceFolderPath);
        }
        wshShell.popup(resultArray.join('\n'));
    }
}

// backupFolderTo_2() 使用例その1
function example4(sourceFolderPath, destinationFolderPath) {
    backupFolderTo_2(sourceFolderPath, destinationFolderPath);
}

// Folder>>copyHere() を使用する
function backupFolderTo(sourceFolderPath, destinationFolderPath) {
    var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
    var aShell = new ActiveXObject('Shell.Application');
    var destinationFolder = aShell.nameSpace(destinationFolderPath);
    if (aFileSystemObject.folderExists(sourceFolderPath) && destinationFolder != null) {
        destinationFolder.copyHere(sourceFolderPath);
        return true;
    } else
        return false;
}

// FileSystemObject>>copyFolder() を使用する
function backupFolderTo_2(sourceFolderPath, destinationFolderPath) {
    var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
    if (aFileSystemObject.folderExists(sourceFolderPath) && aFileSystemObject.folderExists(destinationFolderPath))
        return aFileSystemObject.copyFolder(sourceFolderPath, destinationFolderPath, true);
}

// ここまで

pon さん 2003年 09月 04日 11時 01分 33秒

Win2000のWSHにて、ドライブ内の全ファイルを調査し、サイズが一定以上のものを抽出するスクリプトを下記のように組みました。しかし、実行すると途中で「800A0046 書き込みできません。」のエラーが出ます。どうも、DRMというフォルダを読もうとしたときに出てるようで、このフォルダがAdminも含めた全アカウントに対してアクセス拒否になってるのが原因のようです。スクリプト実行前にこの権限を変えてしまうのもまずいでしょうし、何か回避方法をお教えください。
-----
temp = InputBox("抽出するファイルの最小サイズ(KB)",,"10000")
If temp="" Then WScript.Quit
minSize= temp*1000
folder = InputBox("調査するフォルダ(フルパス)",,"C:\")
If Folder="" Then Wscript.Quit
outFile = InputBox("結果を格納するファイル(フルパス)",,"C:\bigfile_list.csv")
If outFile="" Then WScript.Quit
Set FS = CreateObject("Scripting.FileSystemObject")
Set objFolder = FS.GetFolder(folder)
Set objOutFile = FS.CreateTextFile(outFile,false)

Call ScanFolder(objFolder,objOutFile)

Sub ScanFolder(objFolder,objOutFile)
For Each objFile In objFolder.Files
If objFile.Size > minSize Then
objOutFile.WriteLine objFolder & "," & objFile.Name & "," & objFile.Size
End If
next
For Each objSubFolder In objFolder.SubFolders
Call ScanFolder(objSubFolder,objOutFile)
Next
End Sub

とも さん 2003年 09月 03日 20時 47分 56秒

Windows2000で、「マイネットワーク」−「プロパティ」−「ローカルエリア接続」
−「プロパティ」内の「Microsoftネットワーク用ファイルとプリンタの共有」のチェック
を有効/無効にする設定をWSHから行うことは可能でしょうか?
上記設定が無効になっている端末を大量に作成してしまい、スクリプトでどうにか
有効にできないかと悩んでいます。

もし有益な情報があれば、教えてください!

いりや さん 2003年 09月 03日 18時 19分 09秒

FileSystemObject>>copyFolder() でもできそうですね。なんとなく。。

いりや さん 2003年 09月 03日 18時 14分 10秒

SOU さん,

例えばこんな方法はいかがでしょうか。ポイントは Folder>>copyHere メソッ
ドです。同じスクリプトを何度も実行してみると挙動がかわって理解がすす
みます。

[ 準備 ]

スクリプト中の全角スペースを半角スペース 2 つに置き換えて,
backFolderto.js というファイル名で保存します。sourceFolderPath,
destinationFolderPath を変更します。

[ 実行 ]

ファイルをダブルクリックします。

[ 説明 ]

example1() が一番簡単な backupFolderTo() の使い方,example2() は,戻
り値で正常動作したかどうかを呼び出し元が検査します。

[ WSH/JScript ]

var sourceFolderPath = 'C:\\test-folder';
var destinationFolderPath = 'E:\\';

example1(sourceFolderPath, destinationFolderPath);
//example2(sourceFolderPath, destinationFolderPath);

function example1(sourceFolderPath, destinationFolderPath) {
    backupFolderTo(sourceFolderPath, destinationFolderPath);
}

function example2(sourceFolderPath, destinationFolderPath) {
    var wshShell = new ActiveXObject("WScript.Shell");
    var returnValue = backupFolderTo(sourceFolderPath, destinationFolderPath);
    wshShell.popup("Return value = " + returnValue.toString().toUpperCase(), 3);
}

function backupFolderTo(sourceFolderPath, destinationFolderPath) {
    var aFileSystemObject = new ActiveXObject("Scripting.FileSystemObject");
    var aShell = new ActiveXObject("Shell.Application");
    var destinationFolder = aShell.nameSpace(destinationFolderPath);
    if (aFileSystemObject.folderExists(sourceFolderPath) && destinationFolder != null) {
        destinationFolder.copyHere(sourceFolderPath);
        return true;
    } else
        return false;
}

// end of script


SOU さん 2003年 09月 03日 13時 33分 22秒

お初にお目にかかります。
最近WSHを書き始めたSOUと申します。早速ご質問なのですが、
WindowsXPにて、あるフォルダを違うフォルダ以下にコピーしたいのですが
その際に、コピー元のフォルダのタイムスタンプを保持したままコピーしたいのです。
恐らく、FileSystemObjectのFolderオブジェクト・
DateCreatedプロパティを使い記述していくかと思うのですが、
この方法で大量のフォルダを一気にコピーする際にはどのように記述するのでしょうか?
また代替記述関数・プロパティ等はないでしょうか?

稚拙な質問で申し訳ないですが、ご指導の程宜しくお願い致します。

匿名 さん 2003年 08月 26日 10時 34分 16秒

うらら様へ
回答ありがとうございました。ExitWindowsEx関数が理解できなかったので、WinFAQのVBSファイルを利用させていただきました。本当に感謝しています。

うらら さん ( urara@goukaku,com) 2003年 08月 25日 04時 17分 12秒
URL:http://www.geocities.co.jp/SiliconValley-PaloAlto/9030/

はじめまして、うららと申します。
WindowsXPでのfolder.httの使い方を知りたいと思い覗いたところ、たまたま最近調べたことに関する質問を見つけたので回答させていただきます。

> このサイトに書かれているWindowsを終了させるスクリプトソース(注1)をコピー&ペーストして、実行させたのですが「指定された
> ファイルが見つかりません。」というエラーメッセージが出てしまいます。対処方法を教えていただきたいです。OSはXPです。

OSがWin2kやXPの場合、ExitWindowsEx関数を使用するには AdjustTokenPrivileges関数を呼び出してアクセス特権を得なければいけないとのことです。

参照:http://www.microsoft.com/JAPAN/developer/library/jpsetupf/_win32_exitwindowsex.htm
   http://www.microsoft.com/japan/developer/library/jpsecupf/_win32_AdjustTokenPrivileges.htm

vbsでの使用例は発見できなかったのですが、c++やrubyスクリプトでの使用例を見つけましたのでご参考までにご覧下さい。

参照:http://www.runan.net/program/tips/sdk_13_ExitWindowsEx.shtml(c++での使用例)
   http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/33690(rubyでの使用例)

ExitWindowsEx関数を使用しない方法であれば、WinFAQにそのものずばりのvbsがありますのでそれを使うのが楽な方法です。

参照:http://homepage2.nifty.com/winfaq/w2k/boot.html#1455(shutdn.vbs)
   http://homepage2.nifty.com/winfaq/w2k/boot.html#1001(restart.vbs
   http://homepage2.nifty.com/winfaq/w2k/boot.html#1179(logoff.vbs,poweroff.vbs,reboot.vbs)

匿名 さん 2003年 08月 21日 16時 27分 54秒

このサイトに書かれているWindowsを終了させるスクリプトソース(注1)をコピー&ペーストして、実行させたのですが「指定されたファイルが見つかりません。」というエラーメッセージが出てしまいます。対処方法を教えていただきたいです。OSはXPです。
(注1)
Set WSHSHell=CreateObject("WScript.Shell")
WSHShell.Run "C:\WINDOWS\RUNDLL32.EXE Shell32.dll,SHExitWindowsEx 1"

Set WSHSHell=CreateObject("WScript.Shell")
WSHShell.Run "C:\WINDOWS\RUNDLL.EXE USER.EXE,ExitWindows"

オックン さん 2003年 08月 21日 10時 34分 43秒

いつも参考にさせていただいています。

大きな問題は発生していないのですが、
エラーメッセージが気になるので質問させていただきます。

エクセル終了時に、自動でネットワークドライブを切断する
ファイルを作成しました。

このファイルを使用していないときは、
下記のエラーメッセージは表示されませんでした。

エラーメッセージはのエクセルを起動するときに表示されます。

< エラーメッセージ >
「予期せぬエラーが発生しました(35012)」

< ヘルプ押下後 >
「重大なエラーであるかどうか不明です・・・・」
「・ホストアプリケーションまたはVBで不測のエラーが発生しました。
重大なエラーであると仮定する必要はありません。・・・」

<環境>
Windows 2000・Excel 97

何らかの情報・ヒントでも構いませんので、
よろしくお願いします。

なおみ さん (naomy214@ybb.ne.jp) 2003年 08月 21日 00時 11分 29秒

エクセル処理内でとてつもないループ処理におちいっている箇所がありました。
そこを修正すると、下記の問題がなくなりました。
お騒がせいたしました m(__)m

なおみ さん (naomy214@ybb.ne.jp) 2003年 08月 20日 02時 40分 02秒

ただ今、VBからエクセルを呼び出すプログラム作成中です。
プログラムは完成しているのですが、エクセルを呼び出してVBAのプログラムが
実行されているときに、VBのフォームを押すと、「コンポーネントが使用できません」とメッセージが表示されてしまいます。
誰か回避策をご存知の方、おられましたら、教えてください。
よろしくお願いします。

あさじゃけん さん 2003年 08月 19日 11時 29分 43秒

ご無沙汰しております(汗)
とりあえず、生きてるよ・・と書き込みを(笑)

しばらく有休消化で心の静養の為、PCから離れて遊びまくってました(笑)
長いこと見てなかったので、過去ログ見返すのが大変だったです。


実は、休みに入る前、ADSI使うWSHの解説ページを作成していたのですが、途中で止まってしまいました。(^^;;
あさってからでも、作成再開する予定(^^;;
でも、退社したら、テスト環境(ぉぃ)が、なくなるんですよね・・・

とりあえず、ここの補足情報的な感じで作ってます。
内容的には、たぶんLesson50ぐらいでしょう(爆)

私が、まともな記事を書けるのかどうかにもよりますが、(汗)
できたら作った記事、むたぐちさんに寄贈しましょうか?(笑)
まぁ、それは冗談として、出来たら一度むたぐちさんに見てもらえるといいかなぁ・・とか思ったりしてます。

それでは、また^^;;

#とうとう明日で会社退社しますです(^^;;
#退社すると、ここの書き込みと閲覧の頻度が落ちると思います(><

山咲 理 さん 2003年 08月 19日 09時 40分 33秒

管理人むたぐち 様

>レジストリを弄る系の方法のようですので、WshShellオブジェクトを使う必要があるため、
>IE+VBSでは無理っぽいです。
>IEのバージョンや設定次第では、セキュリティ警告ダイアログが出るだけで
>済む場合もありますが、基本的に無理と考えた方がいいです。

ご返答いただきありがとうございました。
一般的に考えて、セキュリーティーの問題からやはり無理でしたか...
最後までお返事を頂きありがとう御座いました。

管理人むたぐち さん 2003年 08月 17日 17時 30分 13秒

今、C# BuilderでC#の学習を兼ねて、PasswordChr(*のこと)での表示も可能な
InputBoxを呼び出すライブラリを書いてるんですけど、なかなか一筋縄では行かないですねえ。
理屈では分かってるつもりでも、いざ書いてみるとクラスって難しい…。

regasm.exeでCOMコンポーネント化し、WSHから使用できるようにするのが最終目的です。

C#にもInputBoxに相当するものは無いので、もし完成したらそこそこ意味のある
ものにはなると思いますが…。Microsoft.VisualBasic.Interaction.InputBoxを
呼び出すって手もあるんですけどね。

管理人むたぐち さん 2003年 08月 17日 17時 12分 02秒

●サイト紹介
・Dynamic Scripting
http://cgi.members.interq.or.jp/student/exeal/dss/

JavaScript・VBScript・WSH・DOMの充実したリファレンス(日本語ですよ)があります。
Webスクリプト言語の正しい文法を確認したい方にお勧めです。

また、スクリプト用エディタAlphaを開発されています。
タブ切り替え、キーワード強調表示、Windowsスクリプトによるマクロ、スクリプトデバッガ、
キーワード補完、スマートインデント、コード折り畳み、OLEオートメーションによるエディタの操作
等がサポートされる予定だそうです。
現在はまだα版ですが、これらの機能が完成すれば、
間違いなく最強スクリプトエディタの仲間入りを果たすでしょう。要注目です。

・DynWrap Helper - DynWrap Helper コンポーネント
http://members.tripod.co.jp/IUnknown/WSH/dwhelper/

WSHからWindowsAPIを呼び出すには、DynaCall(http://www.borncity.com/WSHBazaar/WSHDynaCall.htm)
を使うのが一般的(?)ですが、これには構造体を引数に取る関数を呼ぶ方法が無いなど、
いくつかの制限がありました。
このDynWrap Helperコンポーネントでは、DynaCallが拡張され、構造体を定義すること等ができます。

'// Windows Script Host を使い尽くす //
http://pc.2ch.net/tech/kako/1010/10104/1010400289.html

随分前に、2ちゃんねるプログラム板のスレで、IUnknownさんという方が作成されていた
コンポーネントなんですが、多分ここの掲示板で紹介するのは初めてでしょう。
(単に忘れていただけです)

管理人むたぐち さん 2003年 08月 16日 15時 07分 58秒

●Microsoft SOAP Clientを使ってWSHからGoogleAPIを利用してみる

SOAP経由で使用できるGoogleAPIを、WSH + Microsoft SOAP Clientで利用してみようというお話です。
GoogleAPIについてはこちらなどを参照してください。
http://www.watch.impress.co.jp/internet/www/article/2002/0412/googapi.htm

WSHでMicrosoft SOAP Clientを利用する参考例はこちら。
http://www.atmarkit.co.jp/fdotnet/wwebserv/wwebserv011/wwebserv011_002.html

まずは、Google APIのサイト(http://www.google.com/apis/)で、Google Web APIs Developer's Kitを
ダウンロードし、Google アカウントを作成してください。
アカウントを作成し、ライセンスキーを取得するにはメールアドレスが必要になります。

次に、Microsoftのサイト
(http://www.microsoft.com/japan/msdn/vstudio/downloads/soaptoolkit/default.asp)で、
Microsoft SOAP Toolkit 2.0 SP2をダウンロードし、インストールします。
WindowsXPではデフォルトでインストールされているので、ダウンロードしなくてもいいです。

インストールが完了したら、Google Web APIs Developer's Kitに含まれる、
GoogleSearch.wsdlというファイルと、以下のようなスクリプトファイル(GoogleAPIsample.vbs)を
同一フォルダに保存します。


'GoogleAPIsample.vbs
sKey = "返信メールに記載されているライセンスキーをここに入力"

Set SOAPClient = WScript.CreateObject("MSSOAP.SOAPClient")
SOAPClient.mssoapinit "GoogleSearch.wsdl"

sQuery = InputBox("検索語を入力して下さい")

Set oResultNodeList = SOAPClient.doGoogleSearch(sKey,sQuery,0,1,True,"",False,"","UTF-8","UTF-8")

For Each oResultNode In oResultNodeList
If oResultNode.nodeName = "resultElements" Then
sOut = sOut & oResultNode.nodeTypedValue & vbCrLf
Exit For
End If
Next

MsgBox sOut


これを実行すると、InputBoxが表示されるので、検索したい言葉を入れてください。
すると、GoogleAPIを経由して検索結果が表示されます。

doGoogleSearchメソッドの引数の意味は、付属のAPIs_Reference.htmlを参照してください。
このメソッドの返り値は、MSXMLにおけるIXMLNodeListオブジェクトですので、
For Each...Nextで各IXMLNodeオブジェクトが取得できます。

このIXMLNodeListオブジェクトは、wsdlファイルでGoogleSearchResultクラス(?)と
定義されており、各IXMLNodeオブジェクトはGoogleSearchResultのメンバになります。
ここでは、GoogleSearchResultのresultElements要素を取得していることになります。
resultElements要素は、ResultElementArrayクラス(?)の要素を返す…はずなのですが、
MSSOAP.SOAPClientではこの各要素(summary,URL,cachedSizeなどの要素を持つ、ResultElementクラス)を
列挙する方法が無い(?)ので、resultElementsのnodeTypedValueプロパティで値だけ取得しています。

しかし、これだとsummary,URL,cachedSizeなどが全部含まれたテキストが返されるだけなので、
有効利用するには整形が必要になります。以下はWebで検索して見つけた例です。
www.davidwatson.org: GoogleLookup Macro - MS Office VBA & SOAP
http://davidwatson.org:8086/archives/000141.html
The Code Project - How to use the Google API in ASP - ASP
http://www.codeproject.com/useritems/googleapisinasp.asp?print=true

さて、感想ですが、「使えねぇ」ですねえ。
これはMSXMLが悪いのか、MSSOAPが悪いのか、両方悪いのか、それとも使い方が悪いのか
わかりませんが、結果がオブジェクトとしてまともに扱えないのでは、
クエリーをそのままGoogleのサイトにPOSTして、その結果のHTMLを解析するのと
あんまり変わらない気がします。

これが、たとえばPerlのSOAP::Liteモジュールだと、
http://www.hippo2000.info/cgi-bin/KbWiki/KbWiki.pl?cmd=disp&page=SOAP%A4%C7Google
こんな感じで実にスマートに扱えるんですが。

余談ですが、Googleで「計算」ができるようになりました。
http://slashdot.jp/articles/03/08/13/071230.shtml?topic=74

各種物理定数(気体定数Rとか)が利用できたり、単位変換ができたり、
複素数の計算ができたりとかなりマニアックな仕様です。
これをGoogleAPI経由で弄ってやろうと企んでいたのですが…。

いりや さん 2003年 08月 14日 13時 52分 45秒

AKiOS さんの記事検索 HTA でエラー 報告その2

少し整理できました。メモとして残します。


[ 概要 ]

Internet Explorer を利用して保存した HTML ファイルを使用して記事検索
HTA を利用していた。ある場合において,Internet Explorer スクリプトエ
ラーのダイアログがあらわれた。

    ライン: 1005
    文字: 3
    エラー: 'left.a[...].style' は Null またはオブジェクトがありません。
    コード: 0
    URL: (省略)


[ 詳細 ]

ダウンロードプログラムを用意していなかったので,Internet Explorer を
利用して保存した HTML ファイルを生成して HTA の入力ファイルとした。

その時,ファイルメニューから "名前をつけて保存(&A)..." を選ぶときダイ
アログで設定する場合によってはエラーが発生する。

(a) 成功する場合

    ファイルの種類: Web ページ HTML のみ (*.htm; *.html)
    エンコード: 日本語 (シフトJIS)

(b) 失敗する場合

    ファイルの種類: Web ページ 完全 (*.htm; *.html)
    エンコード: 日本語 (シフトJIS)

[ 再現性 ]

あり。


[ 環境 ]

ThinkPad X31, WinXP SP1, IE 6.0 SP1


[ 暫定対処 ]

ダウンロードプログラムが用意できるまでは,Internet Explorer のファイ
ルの保存形式に気をつけることで回避する。


[ (a), (b) の違い ]

・ファイルの改行コードが違う。(a) は LF,(b) は CR+LF。

・HTTP の GET メッセージで直接該当 URL を取得した結果を (c) として,
 (a), (c) とを比較するとほぼ同一と思われる。

・(a), (c) と (b) を比べてみると,(b) は一旦 Internet Explorer 内部で
 構築された Document Object Model ツリーから再度テキスト表現 (文字列)
 に変換された結果のように見える。タグの周辺の改行がトリミングされて
 いることからそう予測した。


[ 直近の想定原因 ]

現時点では不明。

・(HTML という文書の構造は維持されているはずだが) 改行がトリミングさ
 れている。改行がトリミングされていることがスクリプトの実行上の前提
 条件の一部に適合しなかった可能性を考え,ソースコードを調査中。

いりや

いりや さん 2003年 08月 13日 18時 00分 46秒

むたぐちさん,

コメントありがとうございます。切り分けがほぼ終了しました。
保存 html ファイルの改行コードが,保存の仕方によってかわっ
ていることにきづかず,それがあのような事態を引き起こした
ようです。

別途まとめますが,とりあえず HTA は関係ないことがわかり
ましたのでご連絡します。

管理人むたぐち さん 2003年 08月 13日 17時 35分 03秒

W32.Blaster.Worm http://www.symantec.com/region/jp/sarcj/data/w/w32.blaster.worm.html

先日紹介した、「MS03-026: RPC インターフェイスのバッファ オーバーランによりコードが実行される (823980)」
(http://www.microsoft.com/japan/technet/treeview/default.asp?url=/japan/technet/security/bulletin/MS03-026ov.asp)
というセキュリティホールを利用したワームがついに、というか、やはりというべきか、
出現し、爆発的に繁殖しているようです。
「怪しいexeやActiveXを実行しなければとりあえず安心」というわけでもなく、
感染力から言えばあのCode Red以上のものがあるんじゃないでしょうか。
8/16になると、MSのWindowsUpdateサイトにDDoS攻撃を仕掛ける仕組みらしく
(こういうのはどうして分かるのだろう)、どういう事態になるのか気になります。


To: 神 さん
> 「Ctrl+Alt+Del」キー押下操作をVBスクリプトから実行可能でしょうか。

できない気がします。そもそもソフトウェア的にCtrl+Alt+Delを送出するのは
無理なんじゃないかな?

コンピュータのロック(XP,2000)なら、次のコマンドをRunするとOKです。
RunDLL32.EXE user32.dll,LockWorkStation

ちなみにRunDLL32.EXEを使ったコマンドの一覧は、ここが最強かもしれません。
http://sm.fixdown.net:88/article/article/77.htm


To: 山咲 理 さん
レジストリを弄る系の方法のようですので、WshShellオブジェクトを使う必要があるため、
IE+VBSでは無理っぽいです。
IEのバージョンや設定次第では、セキュリティ警告ダイアログが出るだけで
済む場合もありますが、基本的に無理と考えた方がいいです。


To: いりや さん
> moWindow.busy && moWindow.readyState != 4

VB.NETなら、ショートサーキット評価をする論理積はAndAlsoなので、
moWindow.busy AndAlso moWindow.readyState <> 4
になりますね。
ショートサーキット評価をする論理和ならOrElseです。

VB/VBSにショートサーキット評価をする論理演算子はありません。
And(論理積)とOr(論理和)のみです。

> AKiOS さんの記事検索 HTA

こちらではエラーにならなかったです。
デコードの誤認識かなんかでしょうか?

いりや さん 2003年 08月 13日 16時 46分 52秒

AKiOS さんの記事検索 HTA を使い始めました。軽快な動作に
一瞬のうちに手放せなくなりました。感謝でございます。

さて,まだ確認したレベルですが,

    WSH Lab. 掲示板 過去記事リスト[89]
    WSH Lab. 掲示板 過去記事リスト[88]

の二つのリンクをクリックすると,Internet Explorer スクリプト
エラーのダイアログがあらわれました。

    ライン: 1005
    文字: 3
    エラー: 'left.a[...].style' は Null またはオブジェクトがありません。
    コード: 0
    URL: (省略)

HTA のソースコードの該当箇所は,a_click() 関数の

    left.a[hitlist.current+1].style.color = alinkcolor;

という行でした。

他の html ファイル (78 〜 87) では再現しないことからファイル
中のデータに依存しているのだろうな〜と思って,調査をすすめて
いますが,とりいそぎご報告。

いりや さん 2003年 08月 13日 02時 58分 44秒

すみません、&& は || (論理和) が正しいですね。どちからが真の間
は loop してください、という意味でしたので。

いりや さん 2003年 08月 13日 02時 49分 38秒

Lucifer さん、あんのうん (Unknown?) さん、

こんばんわ。いりやと申します。

Loop while moWindow.Busy
のところは、moWindow.readyState が 4 でない間もループするように
したほうがいいと思います。(WSH/JScript だと
moWindow.busy && moWindow.readyState != 4 でしょうか。
WSH/VBScript だと && や != はどう表記するんだろう。。

あんのうんさんの予想された想定された原因に私も一票。

(navigate2() メソッドを実行した後にまだ moWindow.document オブ
ジェクトが作成が完了していない場合にエラーを起こしているのでは
ないか? という予想と理解しています)

あんのうん さん 2003年 08月 12日 22時 46分 39秒

To Luciferさん

こちらの環境(WinXP Pro + IE6.0 + WSH5.6)
では特に問題なく、近くに同じ環境はないのですが、、

moWindow.Navigate2 "about:blank"



moWindow.Navigate2 "about:blank"
Do
WScript.Sleep 1000
Loop while moWindow.Busy

にしても変わりませんか?
もし変わらなければ、申し訳ないですが、、
ちょっとわかりません。ごめんなさい。

Lucifer さん 2003年 08月 12日 20時 44分 32秒


さらに追伸です。

裏でIEが起動していても、エラーにならないケースがあるみたいです。
さらに、WSHがエラーを出すパターンもある事が分かりました。
エラー記述には「エラーを特定できません」とありますが、"With moWindow.Document.ParentWindow" の行でエラーになっています。
実行するたびに、エラー内容が変わるのが不思議です・・・


Lucifer さん 2003年 08月 12日 20時 28分 45秒


To: 管理人さん、あんのうんさん

追伸です。
教えて頂いたVBSを試したのですが、一定の条件下で"IEXPLORER.EXE - アプリケーションエラー"が発生する事がわかりました。いわゆる一般保護違反です。
その条件とは、
1. スクリプトを普通に起動して閉じた後、もう1回実行する
2. 裏でIEが起動している状態で実行する

ちなみに1.の時、タスクとして起動している"IEXPLORER.EXE"を予め強制終了してやると、正常起動するみたいです。
双方のケースで正常に動くように出来るものでしょうか?

というか、VBSからIEを呼び出す処理にやや無理があるのであれば、HTML+JavaScriptで認証させた方がスムーズに行けそうな気がしてきました。
サーバー認証自体は、CLIの"NET USE"コマンドで可能ですし。
ただこれで行くとするとこの掲示板の主旨から外れますので、苦手ですが自分でJavaScriptを勉強してみようと思います。


[試験環境]
Windows2000Professional SP2
InternetExplorer 5.01sp2
WSH ver5.1


Return