くじら さん (djm_mk9@jupiter.livedoor.com) 2004年 09月 16日 02時 01分 51秒

はじめまして。
ご存知の肩が折られましたら教えてください。

Windowsの通知領域にある「ハードウェアの安全な取り外し」
アイコンをクリックし、ポップアップしてくるメニューから、
任意のドライブのメニューをクリックしてUSBドライブの停止
を行うと同じ結果を得られるスクリプトは作成可能でしょう
か?

現在のところExecメソッドを利用して
「rundll32.exe shell32.dll,Control_RunDLL hotplug.dll」
を実行し「ハードウェアの取り外し」ダイアログを呼び出すと同
時に、任意のUSBドライブを停止すを促すメッセージを出すという
方法を使っています。
できればもっとスマートにし、ユーザには、USBデバイスを抜き差
ししてもらうだけの物にしたいのですが・・・・

どうかお願いします。

たるら さん (t-office@venture.design.co.jp) 2004年 09月 15日 20時 43分 34秒

はじめまして。

どうかお知恵を貸して頂きたいので、
書き込みます。

あるサーバから、繋がっているクライアントに対して、
メッセージを通知したいのですが、(WindowsPopupメッセージみたいに)
WSHでは、難しいでしょうか?

リファレンスを呼んでも、
ローカルに、メッセージを表示することは出来るようですが、
他のマシンに通知する方法は出てこないようです。

別にWSHじゃなくても、VBSなどでも構わないのですが。。。


いりや さん 2004年 09月 15日 17時 42分 05秒

※ しまった。再投函します。むたぐちさん、前投函、削除いただければ
  幸いです。

さのさん、

|  なるほど。エラー補足ですね。
|  事前に実行してみてエラーならば補足すると。

test() でも同様に呼び出し途中でエラーとなるようですね。であ
れば特に exec() に限る必要はありませんでした。

ちなみに捕捉するべきエラーは 5017, 5019, 5020 番のエラーで、
それ以外については別途取り扱いを検討する必要があります。

  msdn, Visual Basic Scripting Edition, VBScript Run-time Errors
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsmscRuntimeErrors.asp

JScript でこの三つのエラーを捕捉する例題を参考までにご紹介し
ます。この例題は、タイトルが、与えた正規表現のパタンに適合す
る Internet Explorer のウインドウを閉じるスクリプトです。

パタンが受理できない場合のみ問い合わせを継続し実行そのものは
中断しません。それ以外のエラーが提起されたら実行を中断します。

この手続きを prompt_primitive() に渡す discriminator で定義
しています。try/catch 構文で捕捉しています。

なお、実行にあたってはファイルを .wsf ファイルとして保存し、
全角スペースを半角スペースに変換しておいてください。

// ここから

<job id=screen>
<script language=VBScript>
Function VBInput(prompt, title, default)
    VBInput = InputBox(prompt, title, default)
End Function
</script>
<script language=JavaScript>
(function () {
    var $ = Array.prototype;
    $.do_ = function (operation) {
        for (var i = 0; i < this.length; i++)
            operation(this[i]);
    }
    $.select_ = function (discriminator) {
        var anArray = new Array();
        this.do_(function (each) { if (discriminator(each)) anArray.push(each) });
        return anArray;
    }
    var $ = Enumerator.prototype;
    $.asArray = function () {
        var anArray = new Array();
        for (; !this.atEnd(); this.moveNext())
            anArray.push(this.item());
        return anArray;
    }
})();

function prompt(promptString, initialValue) {
    var caption = 'WSH/JScriptプロンプト';
    var discriminator = function (s) {
        try {
            var regexp = new RegExp(s);
        } catch (error) {
            var errorCode = error.number & 0xffff;
            switch (errorCode) {
            case 5017: // Syntax error in regular expression
                WScript.echo('Syntax error in regular expression');
                return false;
            case 5019: // Expected ']' in regular expression
                WScript.echo('Expected "]" in regular expression');
                return false;
            case 5020: // Expected ')' in regular expression
                WScript.echo('Expected ")" in regular expression');
                return false;
            default:
                throw error;
            }
        }
        return true;
    }
    var transformer = function (s) { return new RegExp(s) }
    return prompt_primitive(promptString, caption, initialValue, discriminator, transformer);
}

function prompt_primitive(promptString, caption, initialValue, discriminator, transformer) {
    var s = initialValue;
    do {
        var s = VBInput(promptString, caption, s);
        if (s == null)
            break;
    } while (!discriminator(s));
    return s != null ? transformer(s) : null;
}
</script>
<script language=JavaScript>
var regexp = prompt('正規表現のパタンを入力してください', '^PeopleView');
if (regexp != null) {
    var shellWindows = new Enumerator(new ActiveXObject('Shell.Application').windows()).asArray();
    var anArray = shellWindows.select_(function (each) {
        return /iexplore\.exe$/i.test(each.fullname) && regexp.test(each.locationname) }
    );
    anArray.do_(function (each) { each.quit() });
}
</script>
</job>

// ここまで

いりや さん 2004年 09月 15日 17時 40分 44秒

さのさん、

|  なるほど。エラー補足ですね。
|  事前に実行してみてエラーならば補足すると。

test() でも同様に呼び出し途中でエラーとなるようですね。であ
れば特に exec() に限る必要はありませんでした。

ちなみに捕捉するべきエラーは 5017, 5019, 5020 番のエラーで、
それ以外については別途取り扱いを検討する必要があります。

  msdn, Visual Basic Scripting Edition, VBScript Run-time Errors
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsmscRuntimeErrors.asp

JScript でこの三つのエラーを捕捉する例題を参考までにご紹介し
ます。この例題は、タイトルが、与えた正規表現のパタンに適合す
る Internet Explorer のウインドウを閉じるスクリプトです。

パタンが受理できない場合のみ問い合わせを継続し実行そのものは
中断しません。それ以外のエラーが提起されたら実行を中断します。

この手続きを prompt_primitive() に渡す discriminator で定義
しています。try/catch 構文で捕捉しています。

なお、実行にあたってはファイルを .wsf ファイルとして保存し、
全角スペースを半角スペースに変換しておいてください。

// ここから

<job id=screen>
<script language=VBScript>
Function VBInput(prompt, title, default)
VBInput = InputBox(prompt, title, default)
End Function
</script>
<script language=JavaScript>
(function () {
var $ = Array.prototype;
$.do_ = function (operation) {
for (var i = 0; i < this.length; i++)
operation(this[i]);
}
$.select_ = function (discriminator) {
var anArray = new Array();
this.do_(function (each) { if (discriminator(each)) anArray.push(each) });
return anArray;
}
var $ = Enumerator.prototype;
$.asArray = function () {
var anArray = new Array();
for (; !this.atEnd(); this.moveNext())
anArray.push(this.item());
return anArray;
}
})();

function prompt(promptString, initialValue) {
var caption = 'WSH/JScriptプロンプト';
var discriminator = function (s) {
try {
var regexp = new RegExp(s);
} catch (error) {
var errorCode = error.number & 0xffff;
switch (errorCode) {
case 5017: // Syntax error in regular expression
WScript.echo('Syntax error in regular expression');
return false;
case 5019: // Expected ']' in regular expression
WScript.echo('Expected "]" in regular expression');
return false;
case 5020: // Expected ')' in regular expression
WScript.echo('Expected ")" in regular expression');
return false;
default:
throw error;
}
}
return true;
}
var transformer = function (s) { return new RegExp(s) }
return prompt_primitive(promptString, caption, initialValue, discriminator, transformer);
}

function prompt_primitive(promptString, caption, initialValue, discriminator, transformer) {
var s = initialValue;
do {
var s = VBInput(promptString, caption, s);
if (s == null)
break;
} while (!discriminator(s));
return s != null ? transformer(s) : null;
}
</script>
<script language=JavaScript>
var regexp = prompt('正規表現のパタンを入力してください', '^PeopleView');
if (regexp != null) {
var shellWindows = new Enumerator(new ActiveXObject('Shell.Application').windows()).asArray();
var anArray = shellWindows.select_(function (each) {
return /iexplore\.exe$/i.test(each.fullname) && regexp.test(each.locationname) }
);
anArray.do_(function (each) { each.quit() });
}
</script>
</job>

// ここまで

ばんのしゃーによかばんた さん 2004年 09月 15日 16時 28分 00秒

>ばんのしゃーによかばんた さん 2004年 08月 23日 15時 57分 26秒
>フォルダ選択処理を、"Scripting.FileSystemObject"でVBSファイルに書き出し、
>ボタンを押下したとき、"WScript.Shell"でRunする。
>VBSファイル側は、結果をIEの画面に書き込んで、後の処理をキックする。
>と言うのはどうでしょう。

このとき、問題なのは、WSH側から親のIEをどうやって一意に識別するか、です。
(アクティブとは限らないし、locationの比較も、なんだか心配です。)

以下、サンプル。
一意識別のため、VBS一時ファイル名を一時的にTitleにセットして、
WScript.ScriptFullNameと比較してます。
簡単のため、ここでは、結果をStatusTextにセットしてます。
window.execScriptで結果をSubに渡したり、変数に格納したりすればよいでしょう。
<html>
<head>
<script language=vbscript>
Sub window_onload()
Set fso=CreateObject("Scripting.FileSystemObject")
filename=fso.BuildPath(fso.GetSpecialFolder(2).Path,fso.GetTempName())
title=document.Title
document.Title=filename
Set file=fso.CreateTextFile(filename)
file.Write "" & vbCRLF & _
"Set Shell=CreateObject(""Shell.Application"")" & vbCRLF & _
"For Each ie In Shell.Windows" & vbCRLF & _
"If TypeName(ie.Document)=""HTMLDocument"" Then" & vbCRLF & _
"If ie.Document.Title=WScript.ScriptFullName Then Exit For" & vbCRLF & _
"End If" & vbCRLF & _
"Next" & vbCRLF & _
"Set Folder=Shell.BrowseForFolder(0,""enter"",0,0)" & vbCRLF & _
"ie.StatusText=Folder.Self.Path" & vbCRLF & _
""
file.Close
Set wShell=CreateObject("WScript.Shell")
wShell.Run "WScript.Exe //e:vbs """ & filename & """",,True
fso.DeleteFile(filename)
document.Title=title
End Sub
</script>
</head>
<body>
</body>
</html>

ばんのしゃーによかばんた さん 2004年 09月 15日 16時 27分 13秒

>isp1014 さん 2004年 08月 18日 15時 43分 37秒
>ASPに記述したVBSについての質問です。
>あるWEBページでボタンを押下した時に
>ファイル選択ではなくて、フォルダを選択したいのです。
>(フォルダ選択ダイアログボックスの表示)
>そのときに使用する命令として
>BrowseForFolderオブジェクトを使用しています。
>しかし、実行してみると「書き込みできません」と
>VBSのエラーが発生してしまいます。
>WEBではない、ただのVBSではうまく動作します。
>(クライアント上のVBSファイルを実行)
>ひょっとしてWEBでは使用できないのでしょうか?
>使用できないのであれば、別の方法があるのでしょうか?
>大変困っています。

同様の話が過去ログに載っているところを見ると、仕様かな。

>MASA さん 2002年 09月 27日 19時 34分 40秒
>set objDlg = CreateObject("Shell.Application")
>objDlg.BrowseForFolder 0,"選択",0,0
>でフォルダを選択したいのですが、HTML単独で(デスクトップなどから直接)
>起動するとうまくいくのですが、
>IISにファイルをおき、http://....としてアクセスすると、
>「objDlg.BrowseForFolder 0,"選択",0,0」の部分でエラーが出てしまいます。
>「エラー:書込みできません」
>なぜなのでしょうか???

インターネットゾーンからは、BrowseForFolderが使えないようにしている?
セキュリティ上の理由かな。

しかし、セキュリティレベルで制御してるなら、どの項目でしょう。
ゆるゆるにしても駄目みたいです。

まさか、セキュリティゾーンで制御してる、ってことはないでしょうね。
それは、基本設計の破綻ですもの。

ばんのしゃーによかばんた さん 2004年 09月 15日 16時 26分 29秒

>ばんのしゃーによかばんた さん 2004年 06月 07日 22時 07分 21秒
>ローカルなHTMLファイルをインターネットゾーンか、またはスクリプトを無効にして、
>HTMLDocumentに取り出す方法はありませんか。
>ie.navigate file や GetObject(file,"htmlfile")
>だとマイコンピュータゾーンになって、スクリプトが有効になってしまいます。

一応、以下で、ローカルなHTMLファイルをインターネットゾーンで開くことができました。

Set ie=CreateObject("InternetExplorer.Application")
ie.visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 1000
Loop
Set fso=CreateObject("Scripting.FileSystemObject")
ie.Document.write fso.OpenTextFile(WScript.Arguments(0)).ReadAll()

ただし、
アドレス欄はabout:blankのままです。
スクリプトが無効なら問題ないのですが、
有効にしたいときは、逆にwindow_onloadなどが動かない。fireEventすればいい?

さの さん 2004年 09月 15日 12時 23分 41秒

>いりやさん

 なるほど。エラー補足ですね。
 事前に実行してみてエラーならば補足すると。
 了解しました。

 ありがとうございます。

いりや さん 2004年 09月 14日 20時 44分 35秒

さのさん、

RegExp オブジェクトの exec() メソッドを実行してみてください。
もし受理可能ではないパタン文字列 (たとえば "is(" など) を
pattern プロパティーに設定しているとエラーになります。

あとはそのエラーを捕捉すればよいです。

さの さん 2004年 09月 14日 19時 58分 00秒

 正規表現について質問いたします。

 RegExpを使用する際に、Patternに設定する値が、正規表現かどうかを確認したいと思っています。
 WSHにてそのようなことは可能でしょうか?

下記はヘルプから取得した、RegExpのTextメソッドのサンプルソースです。

Function RegExpTest(patrn, strng)
Dim regEx, retVal ' 変数を作成します。
Set regEx = New RegExp ' 正規表現を作成します。
regEx.Pattern = patrn ' パターンを設定します。
regEx.IgnoreCase = False ' 大文字と小文字を区別するように設定します。
retVal = regEx.Test(strng) ' 検索をテストします。
If retVal Then
RegExpTest = "一致する文字列が 1 つ以上見つかりました。"
Else
RegExpTest = "一致する文字列が見つかりません。"
End If
End Function
MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

以上、よろしくお願いいたします。

ばんのしゃーによかばんた さん 2004年 09月 14日 18時 17分 31秒

チョー遠隔レスです。

>管理人むたぐち さん 2001年 11月 03日 00時 24分 58秒
>To: 寺島 さん
>> やりたい内容は、VBSでテキストの置き換えを作ってみました。
>> そこで適当なフォルダを作成して、その中にTXTファイルをコピーすると
>> 自動的にVBSが立上り実行する
>> ということですが可能なのでしょうか。よろしくお願いします。
>WSHでやるのは無理じゃないかと。
>それを実現するには、ファイルがコピーされたというメッセージを何らかの方法で
>取得してやらないといけないわけですが、WSHではそういったことは基本的には
>できないですから。

IE_StatusTextChangeイベントの応用です。

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Visible=True
ie.Navigate "c:\folder"
Do While TypeName(ie)="IWebBrowser2"
: WScript.Sleep 100
Loop
WScript.Echo "OnQuit"
WScript.Quit

Dim prev
Sub IE_StatusTextChange(text)
If text<>"" Then
: If prev<>text Then
: : prev=text
: : WScript.Echo now,text
: End If
End If
End Sub

Sub IE_DocumentComplete(pDisp, URL)
WScript.Echo now,"DocumentComplete"
End Sub

0 個のオブジェクト
0 バイト
マイ コンピュータ
0 個のオブジェクト
0 バイト
マイ コンピュータ
DocumentComplete
0 個のオブジェクト
0 バイト
1 個のオブジェクト
0 バイト
1 個のオブジェクト
0 バイト
OnQuit

この「n 個のオブジェクト」の変化を捉えれば、よさそうです。

※所詮、待ち合わせのためにループするので、
FileSystemObjectのFolder.Files.CountやShell.ApplicationのFolder.Items.Countを
監視するループを組んだほうが直接的でいいかも。

ばんのしゃーによかばんた さん 2004年 09月 14日 18時 16分 52秒

>ばんのしゃーによかばんた さん 2004年 09月 05日 16時 59分 37秒
>>管理人むたぐち さん 2004年 06月 03日 19時 33分 47秒
>>というか、Filesコレクションのループの中で、Deleteやリネームはご法度です(よね?)
>試してみました。
>file.Deleteもfile.Name=newnameも特に問題なく実行できます。
>Filesに関して「だけ」は、それほど心配しなくてもよいようですね。

この確認はWSH5.6だけです。

過去ログを見ると、versionに依存するようです。

>管理人むたぐち さん 2001年 10月 29日 21時 39分 35秒
>To: 土屋 さん
>> For Each objF in objFolder.Files
>> って、最初のループの際に対象が確定するのではなくて、
>> ループの途中で新しいファイルが追加されると、
>> そのファイルも対象になっている感じです(環境依存なのかなあ)。
>FileSystemObjectのコレクションは、ちょっと不可解なところが
>ありますよね。
>ずっと昔のバージョン(OS、IE、WSHともに)では、ループ中で
>oFile.Name="NewName.ext"とかしても、変なことになりました。

時期的にみて、前者はWSH2.0、後者はWSH2.0のことでしょうか。

FileSystemObjectを使う場合は、WSH5.6以降に更新すべきですね。

---

また、一般のコレクションのメンバの数値インデクスに関して、

ScriptComponentのヘルプを見ると、Item メソッドの解説に、

一般に、コレクションのメンバの順番は変更される可能性があるので、
特定のメンバを取得するには名前を指定します。
ただし、メンバを追加または削除する場合以外は、メンバの順番は変わりません。

とあります。これを並び替えて、一部解釈し直すと、

一般に、メンバを追加または削除する場合は、コレクションのメンバの順番は
変更される可能性があるので、「コレクションのメンバの位置を数式を使用して
指定してはいけません」。

という風に読めます。

いりや さん 2004年 09月 14日 14時 11分 11秒

りぐりぐさん、

// 先日は環境まで用意していただきご説明して頂きまして、
// 大変有難う御座います。
// 時間は掛かってしまいましたが、なんとか答えを見出せそうです。

よかったですね。ウェブ・ブラウザの自動ナビゲーションは私が WSH や UWSC を始
めるきっかけになったテーマでかれこれ 1 年以上取り組んでいますが、話題が尽き
ません。面白いテーマだと思います。どうぞじっくり腰をすえて取り組んでみてく
ださい。


りぐりぐ さん 2004年 09月 13日 21時 22分 42秒

魔界の仮面弁士 さん、

早急のご返答有難う御座います。

フレームのsrcを直接URLに入れて操作を行ったところ、Htmlを取得する事は成功しました。
ただ、動作的に余分な点が多くなってしまいました・・

他の方法を考えてみたいと思います。

有難う御座いました!

管理人むたぐち さん 2004年 09月 13日 18時 26分 01秒

おっと、かぶってしまいました。失礼しました。

管理人むたぐち さん 2004年 09月 13日 18時 24分 23秒

To: ばんのしゃーによかばんた さん

> XP使用中にセキュリティダイアログが定期的に出ます。
> Internet Explorer
> ActiveXコントロールやプラグインなどのソフトウェアを実行できるよう
> にしますか?
> はい(Y) いいえ(N)
> ※マイコンピュータのセキュリティレベルを上げて、ダイアログを出すようにしています。
>
> 誰が出しているのか、確認したいのですが、何か方法はありませんか。

IEのActiveXコントロール使用時の確認ダイアログの内容って、イベントビューアでは
見られないんでしたっけね。
とするとあまりいい方法は思いつかないです。

全然スマートな方法ではないですが、プロセスのファイルへのアクセスを監視し、
それっぽいものを探すとか…。
ファイルモニターにはこういったツールがあります。
Sysinternals Freeware - Utilities for Windows NT and Windows 2000 - FileMon
http://www.sysinternals.com/ntw2k/source/filemon.shtml

ばんのしゃーによかばんた さん 2004年 09月 13日 18時 10分 30秒

VBScriptには、「break」相当のExit Do/Exit Forはありますが、
「continue」相当がありません。そこで、擬似「continue」です。

Forに対して、1回ループのDo、
Doに対して、1回ループのFor、
を内部に張り、そのExitを「continue」として使います。

For k=1 To 10
Do
:::
Exit Do '=Continue
:::
Loop Until 1
Next

Do While True
For Continue=1 To 1
:::
Exit For '=Continue
:::
Next
Loop

ばんのしゃーによかばんた さん 2004年 09月 13日 18時 09分 52秒

>ばんのしゃーによかばんた さん 2004年 09月 10日 19時 25分 05秒
>XP使用中にセキュリティダイアログが定期的に出ます。
>誰が出しているのか、確認したいのですが、何か方法はありませんか。

あのセキュリティダイアログはMSHTML.DLLが出している、と見当を付けて、
誰がMSHTML.DLLを使っているのか、を調べると、

tlist.exe -m mshtml.dll

で、分かりました。
プレインストールのDrag'n Drop CD+DVDとかいうツールでした。

魔界の仮面弁士 さん 2004年 09月 13日 17時 43分 33秒

》 りぐりぐ さん
> サイトによっては、『アクセスが拒否されました』と返される事があります。
セキュリティの都合上、IEの特定のバージョン以降においては、
異なるサイト上のリソースを操作しようとした場合に、
そのようなエラーが発生する可能性があります。

http://support.microsoft.com/default.aspx?scid=kb;ja;167796

りぐりぐ さん 2004年 09月 13日 17時 33分 18秒

いりやさん、

先日は環境まで用意していただきご説明して頂きまして、
大変有難う御座います。
時間は掛かってしまいましたが、なんとか答えを見出せそうです。

今回の事で自分自身の勉強・知識不足を痛感させられましたが、
WSHへの興味が倍増致しました。


で、早速ですがご質問があります。

フレームを使用しているサイトで、個々のフレームに対しての操作
(フレーム内のフォームへの操作、テキストの取得等)ですが、
サイトによっては、『アクセスが拒否されました』と返される事があります。

記述は
IEobjsys.Document.Frames(0).Document.Body.InnerHtml
のように記述しております。

この記述で正常にHTMLを取得出来るサイトがあるので、記述ミスとは
思えなかったのですが、この現象はセキュリティの問題なのでしょうか?
それとも単純に記述ミスなのでしょうか?

回避する方法等ご教授宜しくお願い致します。

hoge さん (m_fukayama@hotmail.com) 2004年 09月 13日 11時 38分 58秒

ASPでShellコマンドによって外部ファイル(WSF)を実行させた場合、結果=Trueで
実際の処理はFalseになります。IISの実行権限プロパティも「スクリプト及び実行可能ファイル」の構成でアプリのマッピングにcscript.exe-(.bat)を追加してみましたがだめでした。多分ASPユーザーの権限(IUSER_xxxx)が問題かなと思われますが、どこで設定してよいかわかりません。基本的な設定の部分で恐縮ですが、
助言お願いします。

ばんのしゃーによかばんた さん 2004年 09月 10日 19時 25分 05秒

XP使用中にセキュリティダイアログが定期的に出ます。
Internet Explorer
ActiveXコントロールやプラグインなどのソフトウェアを実行できるよう
にしますか?
はい(Y) いいえ(N)
※マイコンピュータのセキュリティレベルを上げて、ダイアログを出すようにしています。

誰が出しているのか、確認したいのですが、何か方法はありませんか。
(Y/N)応答しても変化なし。

起動後の初回だけは(Y)応答すると、Nortonさんが、動くので、たぶん同じだろうとは、
思うのですが、気持ちが悪い。

※人のスクリプトには、いちいち煩いNortonさんが、自分も使っているなんて、
なんか、ずるいような気がします。


ばんのしゃーによかばんた さん 2004年 09月 10日 19時 24分 09秒

>たっぴー さん 2004年 09月 07日 19時 47分 00秒
>Navigate2で2回飛ばしてるので、DownloadBegin/DownloadCompleteイベントが
>2回起こると考えていたのですが、結果表示は次のようになります。
>1つの画像につき2回づつのイベントになっています。

DownloadBegin()やDownloadComplete()は引数がなく、情報が少ないですね。
StatusTextChange(text)を併用してみてはいかがでしょうか。

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Visible=True
Do While TypeName(ie)="IWebBrowser2"
WScript.Sleep 100
Loop
WScript.Quit

Sub IE_StatusTextChange(text)
WScript.Echo now,text
End Sub
Sub IE_DownloadBegin()
WScript.Echo now,"DownloadBegin"
End Sub
Sub IE_DownloadComplete()
WScript.Echo now,"DownloadComplete"
End Sub

2004/09/10 18:28:55 DownloadBegin
2004/09/10 18:28:55 Web サイトが見つかりました。応答を待っています...
2004/09/10 18:28:55 サイト からのダウンロードを開始します
2004/09/10 18:28:55 サイト からダウンロードしています
2004/09/10 18:28:55 DownloadComplete
2004/09/10 18:28:55 DownloadBegin
2004/09/10 18:28:55 不明なゾーン
2004/09/10 18:28:55 ページ を開いています...
2004/09/10 18:28:56 ページが表示されました
2004/09/10 18:28:56 DownloadComplete
2004/09/10 18:28:56 マイ コンピュータ
2004/09/10 18:28:57 ページが表示されました

2回ずつなのは、サイトからキャッシュへ、キャッシュから表示へ、なのでしょう。
キャッシュにあれば、1回のようです。

※「づつ」は「ずつ」と書きましょう。

toraneko さん 2004年 09月 10日 18時 04分 47秒

>管理人むたぐちさま
ご返答ありがとうございます。
大変勉強になりました。修正をして再度やってみます。結果報告いたしますので宜しくお願いいたします。

ばんのしゃーによかばんた さん 2004年 09月 10日 17時 44分 09秒

>管理人むたぐち さん 2004年 07月 26日 16時 01分 08秒
>To: Perlすくりぷたー さん
>> VBSやJSだとVBEやJEに暗号化できるみたいですが、
>>Perlのコードを同様に暗号化することは出来ないでしょうか?
>おそらくScript EncoderはPerlScriptには対応していないので
>無理なんじゃないでしょうか。

思い付きのレベルですが、

PerlScriptの文字列をScriptControlに渡して実行するVBSかJSを作って、
それをVBEかJEにする。

というのは、どうでしょう。原理的には出来そうです。

たっぴー さん 2004年 09月 09日 18時 33分 37秒

>管理人むたぐちさま
レスありがとうございます。教えていただいたことを参考にやってみます。

ばんのしゃーによかばんた さん 2004年 09月 09日 18時 13分 46秒

ファイル名順ソートのサンプル。

Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"
Set js=SC.eval("new Array()")

Set fso=CreateObject("Scripting.FileSystemObject")
Set Folder=fso.GetFolder(".")
For Each File In Folder.Files
js.push(File.Name)
Next
For Each Name In js.sort()
WScript.Echo Name
Next
WScript.Quit

最終更新日時順ソートのサンプル。

Set fso=CreateObject("Scripting.FileSystemObject")
Set dic=CreateObject("Scripting.Dictionary")
Set Folder=fso.GetFolder(".")
For Each File In Folder.Files
If Not dic.Exists(File.DateLastModified) Then
dic.Add File.DateLastModified,Array(File)
Else
a=dic.Item(File.DateLastModified)
Redim Preserve a(UBound(a)+1)
Set a(UBound(a))=File
dic.Item(File.DateLastModified)=a
End If
Next
Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"
Call SC.AddObject("dic",dic)
Set js=SC.Eval("new VBArray(dic.Keys())")
For Each DateLastModified In js.toArray().sort()
For Each File In dic.Item(DateLastModified)
WScript.Echo File,File.DateLastModified
Next
Next
WScript.Quit

※dictionary(連想配列/hash)をhash tableのように使います。
hash value(DateLastModified)が衝突したら、リスト(配列)を伸ばします。

管理人むたぐち さん 2004年 09月 09日 16時 57分 05秒

あと何か未解決問題ありましたら、もう一度お願いします。
分かる範囲で回答します。

管理人むたぐち さん 2004年 09月 09日 16時 50分 32秒

間があいてしまったので、新しい記事から順に、未解決と思われる質問に
返信していきたいと思います。


To: TM さん

WMIを使えば可能かと思います。ですが、ネットを検索してもそのものズバリな
日本語のサンプルはないですね。

ファイルのアクセス権を列挙する
http://www.users.gr.jp/ml/archive/viewer.aspx?name=wsh&no=130

共有フォルダのアクセス許可にユーザーを追加する
http://oshiete1.goo.ne.jp/kotaeru.php3?q=803106

英語だとこんなのがあります。既存のユーザーのアクセス許可を変更するのは容易ですが、
新しくユーザーを追加するのは面倒なようです。
http://groups.google.com/groups?q=cacls+wmi+permission&hl=ja&lr=&ie=UTF-8&inlang=ja&c2coff=1&selm=05e401c34a8b%24ea53dce0%24a601280a%40phx.gbl&rnum=6


To: たっぴー さん

> Navigate2で2回飛ばしてるので、DownloadBegin/DownloadCompleteイベントが2回起こると考えていたのですが、結果表示は次のようになります。
> 1つの画像につき2回づつのイベントになっています。

これは仕様みたいなものではないでしょうか?

> その他のイベントも引っかけられませんでした(T。T)

IEオブジェクトのイベントの引数を書いていないためです。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/ie.htm を参考にして、正しい引数を
指定してください。DownloadBegin/DownloadCompleteイベントには元々引数がないので、
これらだけは正常に発生したわけです。


To: toraneko さん

> Notesスクリプト上からWSHスクリプトを起動し処理を行ってますが
> 不安定です。WEBページのソースを表示させて、名前をつけて保存という処理なのですが、Notesにて自動処理で動いている際に最初から失敗(名前をつけて保存ダイアログで停止)したり、何度か動いて失敗したりしております。

まず全体的にスクリプトの記述がおかしいので、リライトします。
この場合、ActiveXコンポーネントは一つだけ宣言すればいいです。
また、Shell.ApplicationのWindowsオブジェクトは、IEおよびフォルダのWindowの
コレクションなので、メモ帳などは関係ありません。よって省略します。
処理が不安定なのは、SendKeysの結果が反映される前に次のステートメントに
移行してしまうのが原因なので、Sleepを入れて少しウェイトを入れてやります。
それでも誤動作等は避けられないでしょうが、幾分は改善されるはずです。
これ以上の精度を求めるなら、msxml2.xmlhttpなどを使い、Webサーバー上のファイルを
スクリプトでダウンロードするなど、根本的に別のアプローチを採用すべきでしょう。

Set WshShell = CreateObject("WScript.Shell")

'WScript.echo "保存します"
WshShell.AppActivate ("Internet Explorer")
WshShell.SendKeys "%VC"
WScript.Sleep 1000

'WScript.echo "ソース表示"
WshShell.AppActivate "メモ帳"
WshShell.SendKeys "%FA" & "%N" & "AAA.txt~" & "%S"
WScript.Sleep 1000

'WScript.echo "名前つけて保存"
WshShell.AppActivate "メモ帳"
WshShell.SendKeys "%FX"

ばんのしゃーによかばんた さん 2004年 09月 08日 16時 18分 50秒

「内側から見た富士通(成果主義の崩壊)」という本がベストセラーになっているとか。
そこで、私もいくつか問答してみました。

ほとんど全員に不信、不満を抱かせ、やる気をなくさせる制度としては完璧だった
のですが、成果主義の何処がいけなかったのでしょうね。答え、目標管理。

それ以前の、職種、男女、最終学歴、入社年次、別の正規分布表ベースの相対評価の
ほうが、よかったのでしょうか。答え、男女差別、学歴差別の見本みたいなので、
それはないでしょう。

では、どうすればよいか。答え、末尾。

成果主義は一般論としては年功序列よりよいけれど、その実現手段として目標管理制度
を用いたことが、大失敗でしたね。
報酬原資は限られているので、みんなに、高い評価は出せない。相対評価ではなく、
目標に対する絶対評価という原則のままで、評価結果が従来と同じ正規分布に
なるようにするにはどうするか。無理な目標を設定させる。
職責/コンピテンシーに見合った、チャレンジングな目標とか言ってましたね。
なんとか理由を付けて評価を下げる。あら探し、減点主義ですね。
こうして、上司への不信、不満を部下に増殖蔓延させる儀式が年に何回も繰り返された
のです。これで、駄目にならないほうが不思議です。
さらに、成果主義は努力でなく、結果を見るので、努力しても高い評価になるかどうか
分からないハイリスク/ハイリターンより、努力しないで並の評価に甘んじるローリスク
/ローリターンのほうが、費用対効果が高い、と分かってしまった。
特に、賞与原資配分は、会社や部門の業績に依存するので、
個人が高い評価でも部門の業績が悪ければ少ないし、個人が並の評価でも部門の業績が
良ければ多い、となれば、自分が努力するより、みんなの努力に任せたほうがいいや、
と思わせてしまった。
でも、極め付けはやはり、上司の目標不達の責任は目標不達の部下にある、
と言い放ったトップですね。あれにはみんなひっくりかえったでしょう。
あまりに正直すぎる。。。
止まらない人材流出にとうとう早期退職優遇制度を廃止しちゃいましたが、
退職金の減額で、辞めるに辞められず、こんなことならもっと早く辞めときゃよかった
と泣いているひとが多いのではないでしょうか。:-p

そもそも、仕事や上司を選択できないのに、一方的に成果だけを問う主義が破綻する
のは、ほとんど自明だと思うのですが、その程度の思考力もなかったのかと思うと
悲しいですね。よくまぁ、社内に反対意見がなかったものか、お思いでしょうが、
会社方針への理解が、幹部社員登用の際に考慮されます。と言われれば、中堅層は
何も言えないでしょう。社内掲示板は所属氏名明記ですし。

私のお勧めは、仕事や上司を選択できる社内FA制度(社内労働市場)です。
報酬金額提示や交渉が露骨で嫌なら、社内通貨を作って社内失業保険として
積み立てたり、退職時清算するとか。
しかし、もしこの制度を採用すると、一挙に幹部社員の優劣が露見するので、
恐ろしくて採用できないでしょうね。きっと。

TM さん 2004年 09月 08日 11時 48分 11秒

こんにちは。
WSHの初心者です。
Scriptでフォルダのアクセス権を変更するものを作成したいのです。
コマンドで「cacls」を使えばいいのですが・・・
実は、コマンドプロンプトをユーザ権限では実行できないようにしています。

そのため、下記のように書いても、実行できないのです。
Set wShell = CreateObject("WScript.Shell")
Set oExec = wShell.Exec("cmd.exe /c echo y|cacls d:\test /c /g %username%:f")
MsgBox oExec.StdOut.ReadAll()

何か良い方法がありませんか?

たっぴー さん 2004年 09月 07日 19時 48分 33秒

×>その他のイベントも引っかけ(T。T)
○>その他のイベントも引っかけられませんでした(T。T)

たっぴー さん 2004年 09月 07日 19時 47分 00秒

はじめまして。WSHに手を出して1週間、たっぴーです。みなさまよろしくお願いいたします。

IEの制御が上手くいかなくて困っています。
Navigate2で2回飛ばしてるので、DownloadBegin/DownloadCompleteイベントが2回起こると考えていたのですが、結果表示は次のようになります。
1つの画像につき2回づつのイベントになっています。
2004/09/07 19:12:22.35 L=1 B=1 C=0 <---DownloadBegin
2004/09/07 19:12:25.27 L=1 B=1 C=1 >---DownloadComplete
2004/09/07 19:12:25.31 L=1 B=2 C=1 <---DownloadBegin
2004/09/07 19:12:25.54 L=1 B=2 C=2 >---DownloadComplete
2004/09/07 19:12:25.86 L=2 B=3 C=2 <---DownloadBegin
2004/09/07 19:12:25.87 L=2 B=3 C=3 >---DownloadComplete
2004/09/07 19:12:25.88 L=2 B=4 C=3 <---DownloadBegin
2004/09/07 19:12:26.23 L=2 B=4 C=4 >---DownloadComplete

どうしてそうなるのでしょう?また1回づつと判定するには
> Do : Loop While ( objIE.ReadyState <> 4 )
> Do : Loop While ( objIE.Document.readyState <> "complete" )
どう書き替えれば良いんでしょうか?

その他のイベントも引っかけ(T。T)

---ie_navi.vbs ここから---
Dim objDT

Dim objIE
Dim i , jLoop , jBegin , jComplete
Dim buf

Set objDT = WScript.CreateObject( "Scripting.Dictionary" )
objDT.Add 0 , "http://www.dhonveli.com/images/p_dhonveli1.jpg"
objDT.Add 1 , "http://www.dhonveli.com/images/p_dhonveli2.jpg"

Set objIE = WScript.CreateObject( "InternetExplorer.Application" , "x_IE_" )
objIE.Visible = True

jLoop = 0 : jBegin = 0 : jComplete = 0 : buf = ""
For i = 0 To ( objDT.Count - 1 )
jLoop = jLoop + 1
objIE.Navigate2 objDT.Item( i )
Do : Loop While ( objIE.ReadyState <> 4 )
Do : Loop While ( objIE.Document.readyState <> "complete" )
Next

WScript.Echo buf '結果表示

objIE.Quit

'''InternetExplorer event "DownloadBegin"
Function x_IE_DownloadBegin()
jBegin = jBegin + 1
buf = buf & x_now() & " L=" & jLoop & " B=" & jBegin & " C=" & jComplete & " " & "<---DownloadBegin" & vbCRLF
End Function

'''InternetExplorer event "DownloadComplete"
Function x_IE_DownloadComplete()
jComplete = jComplete + 1
buf = buf & x_now() & " L=" & jLoop & " B=" & jBegin & " C=" & jComplete & " " & ">---DownloadComplete" & vbCRLF
End Function

'''Other events
Function x_IE_BeforeNavigate2()
buf = buf & x_now() & " L=" & jLoop & " B=" & jBegin & " C=" & jComplete & " " & capture_fnam & "#BeforeNavigate2" & vbCRLF
End Function

Function x_IE_NavigateComplete2()
buf = buf & x_now() & " L=" & jLoop & " B=" & jBegin & " C=" & jComplete & " " & capture_fnam & "$NavigateComplete2" & vbCRLF
End Function

Function x_IE_FileDownload()
buf = buf & x_now() & " L=" & jLoop & " B=" & jBegin & " C=" & jComplete & " " & capture_fnam & "%FileDownload" & vbCRLF
End Function

Function x_IE_DocumentComplete()
buf = buf & x_now() & " L=" & jLoop & " B=" & jBegin & " C=" & jComplete & " " & capture_fnam & "&DocumentComplete" & vbCRLF
End Function

Function x_IE_ProgresChange()
buf = buf & x_now() & " L=" & jLoop & " B=" & jBegin & " C=" & jComplete & " " & capture_fnam & "?ProgresChange" & vbCRLF
End Function

Function x_IE_NavigateError()
buf = buf & x_now() & " L=" & jLoop & " B=" & jBegin & " C=" & jComplete & " " & capture_fnam & "+NavigateError" & vbCRLF
End Function

'''now YYYY/MM/DD hh:mm:ss.mm
Function x_now()
Dim strNow , strTimer , strMsec

strNow = Now
strTimer = Timer
'NowとTimerの連発...誤差はとりあえず無視

If ( Len( strTimer ) - InStr( strTimer , "." ) ) = 2 Then
strMsec = Right( strTimer , 2 )
ElseIf ( Len( strTimer ) - InStr( strTimer , "." ) ) = 1 Then
strMsec = Right( strTimer , 1 ) & "0"
Else
strMsec = "00"
End If
x_now = strNow & "." & strMsec
End Function
---ie_navi.vbs ここまで---

管理人むたぐち さん 2004年 09月 07日 13時 19分 37秒

ごめんなさい、Proxyomitronのフィルタがwindow.openを
置換してただけでした…。

管理人むたぐち さん 2004年 09月 07日 13時 07分 28秒

HTMLが崩れましたね。修正入ります。

いりや さん 2004年 09月 07日 12時 43分 55秒

var anArray = shellWindows.select_(function (each) {
    return /iexplore\.exe$/.test(each.fullname) &&
        each.document.parentWindow.opener === e.document.parentWindow;
});



var anArray = shellWindows.select_(function (each) {
    return /iexplore\.exe$/i.test(each.fullname) &&
        each.document.parentWindow.opener === e.document.parentWindow;
});

ですね。iexplore.exe は IEXPLORE.EXE の場合もある。あらあら。

toraneko さん (kuroneko0-lj@infoseek.jp) 2004年 09月 07日 11時 59分 02秒

はじめまして初投稿です。toranekoと申します。
超初心者なのでご教授願います!
Notesスクリプト上からWSHスクリプトを起動し処理を行ってますが
不安定です。WEBページのソースを表示させて、名前をつけて保存という処理なのですが、Notesにて自動処理で動いている際に最初から失敗(名前をつけて保存ダイアログで停止)したり、何度か動いて失敗したりしております。
Option Explicit
Dim objWS, objSA, objWin, objShell,objExec , WshShell
Set objWS = CreateObject("WScript.Shell")
Set objShell = CreateObject("WScript.Shell")
Set objSA = CreateObject("Shell.Application")
Set WshShell = CreateObject("WScript.Shell")
Set objWin = objSA.Windows.item
'WScript.echo "保存します"
With objWS
.AppActivate ("Internet Explorer")
.SendKeys "%VC" , True
End With
'WScript.echo "ソース表示"
Set objShell = objSA.Windows.item
objShell = WshShell.AppActivate ("メモ帳")
objShell = WshShell.SendKeys ("%FA" & "%N" & "AAA.txt~" & "%S", True )
'objShell = WshShell.SendKeys ("%N" & "AAA.txt~" & "%S" , True )
'WScript.echo "名前つけて保存"
'objShell = WshShell.AppActivate ("メモ帳")
objShell = WshShell.SendKeys ("%FX" ,True )
'WScript.echo "ウィンドウ閉じる"
While(objWin.busy)
Wscript.Sleep 100
Wend
'Exit For
'End If
'Next
'If urlflg = False Then Call PopupMessage
Call ReleseQuit

'-----------------------------------------------------------
'Sub PopupMessage()
'objWS.Popup "WEBページが開いていません。", _
'3 , " Web Close & Clean - by IronRose", vbInformation
'Call ReleseQuit
'End Sub

'-----------------------------------------------------------
Sub ReleseQuit()
Set objWS = Nothing
Set objSA = Nothing
Set objWin = Nothing
WScript.Quit
End Sub

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


管理人むたぐち さん 2004年 09月 07日 09時 00分 16秒

窓の杜 - 【NEWS】マイクロソフト、「Windows Script 5.6」の新バージョンを公開
http://www.forest.impress.co.jp/article/2004/09/06/wsh568825.html

ダウンロードの詳細 : Windows 98、Windows Millennium Edition (Windows Me)、および Windows NT 4.0 用の Windows Script 5.6
http://www.microsoft.com/downloads/details.aspx?FamilyID=0a8a18f6-249c-4a72-bfcf-fc6af26dc390&DisplayLang=ja

ダウンロードの詳細 : Windows 2003 および Windows XP 用の Windows Script 5.6
http://www.microsoft.com/downloads/details.aspx?FamilyID=887fce82-e3f5-4289-a5e3-6cbb818623aa&DisplayLang=ja

wscript.exeのバージョンはv5.6.8820からv5.6.8825に上がります。
WinXP SP2には含まれていません。
また、WSHアップデート後SP2を適用すると、WSHのバージョンが戻ってしまう
そうです。

v5.6.8825はセキュリティ関連の修正だそうですが、具体的な変更点は
よくわかりません。

SUN さん 2004年 09月 07日 07時 58分 48秒

いりやさん、SUNです。

>いえいえ、コミュニケーションはいつでも難しいものです。0 : 100 なんて
>ないのですからどうぞ気楽にいきましょう。

 ありがとうございます。
 2進法的思考になりがちな作業のなか、
 こういった言葉は救われます。

>UWSC は面白いですよ :-) ぜひ極めてくださいな。

 よいお手本を拝見させていただきましたので
 私の業務にも活用してゆきたいと思います。
 
このたびは本当にありがとうございました!

SUN 

いりや さん 2004年 09月 07日 03時 10分 30秒

anArray.do_(function (each) {
    each.navigate('http://iriyak.adam.ne.jp/arc/uwsc/child2.html');
    while (each.busy || e.readyState != 4)
        WScript.sleep(100);
});

は、

anArray.do_(function (each) {
    each.navigate('http://iriyak.adam.ne.jp/arc/uwsc/child2.html');
    while (each.busy || each.readyState != 4)
        WScript.sleep(100);
});

が正しいですね。なんか child2.html への遷移が速すぎるなと思ったら load
が完了しないうちに while ループを抜けていました。あれあれ。

いりや さん 2004年 09月 07日 03時 04分 28秒

りぐりぐさん、

| その中でリンクをクリックした際、別ウィンドウが開く時があります。
|
| IEオブジェクトを取得して確認して、そのオブジェクト上で確認作用の実現を考
| えておりますが(テキストを取得したり、Busyで同期を取る等)、別ウィンドウ
| が開いた時、そのウィンドウはWSHの制御下でなくなってしまいます。

そうそうやっかいな話ですよね。今年の二月ごろに、緑の風さんも同じような課
題に取り込んでいらっしゃいました。

  http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list99.shtml
  緑の風 さん 2004年 02月 10日 09時 29分 11秒
  いりや さん 2004年 02月 14日 13時 27分 16秒
  いりや さん 2004年 02月 14日 15時 12分 47秒

| 制御をそのウィンドウに移す事、若しくはその他の良い方法等がありましたら、
| ご指導頂けないでしょうか?

あります。

2/14 13:27 に投函した

| では、それでおしまいか、といえば、IE とは関係ないところで、
| Shell.Application オブジェクトというのがいて、このオブジェクトの windows
| プロパティーには現在開かれているエクスプローラ (と Internet Explorer) の
| window オブジェクトのコレクションが保持されています。
|
| [2] むたぐちさん, Shell オブジェクト
| http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/index.html
|
| この windows コレクションから件 (くだん) の window オブジェクトをひきあ
| てる、という手があります。

この方式を実装します。

論よりコード。ウェブ・サイトに window.open() する parent.html と別ウイン
ドウの child.html を置いて試験環境をこさえました。

以下のスクリプトでその挙動を観測できます。ダイアログの指示に従って状況の
変化を観測してみてください。


// Array>>do_, Array_select_

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

// Enumerator>>asArray:

(function () {
    var $ = Enumerator.prototype;
    $.asArray = function () {
        var anArray = new Array();
        for (; !this.atEnd(); this.moveNext())
            anArray.push(this.item());
        return anArray;
    }
})();

//
// main
//

var ShellApplication = new ActiveXObject('Shell.Application');

var e = new ActiveXObject('InternetExplorer.Application');
e.visible = true;
e.top = 0;
e.left = 0;
e.height = 400;
e.width = 500;

e.navigate('http://iriyak.adam.ne.jp/arc/uwsc/parent.html');
while (e.busy || e.readyState != 4)
    WScript.sleep(100);

WScript.echo('三つのウインドウが Ready! と表示されたら OK ボタンをクリックしてください。');
var shellWindows = new Enumerator(ShellApplication.windows()).asArray();
var anArray = shellWindows.select_(function (each) {
    return /iexplore\.exe$/.test(each.fullname) &&
        each.document.parentWindow.opener === e.document.parentWindow;
});

WScript.echo('ポップアップされたウインドウの数は ' + anArray.length);

WScript.echo('ポップアップされたウインドウを child2.html へ移動します...');
anArray.do_(function (each) {
    each.navigate('http://iriyak.adam.ne.jp/arc/uwsc/child2.html');
    while (each.busy || e.readyState != 4)
        WScript.sleep(100);
});

WScript.echo('三つのウインドウを閉じます...');
anArray.do_(function (each) { each.quit() });
e.quit();

いりや さん 2004年 09月 07日 02時 54分 51秒

SUN さん、

いえいえ、コミュニケーションはいつでも難しいものです。0 : 100 なんて
ないのですからどうぞ気楽にいきましょう。

ウェブについてはローカルディスクの HTML ファイルとインターネットのそ
れとでセキュリティーが関係してきて微妙に環境の違いがコミュニケーショ
ン・ギャップになって後々まで引きずることがあります。

また論よりコードとも言いますので、テスト環境をベースにコミュニケーシ
ョンするやり方がトータルとして早いなと実感しています。

UWSC は面白いですよ :-) ぜひ極めてくださいな。

SUN さん 2004年 09月 06日 22時 36分 35秒

いりやさん、SUNです。

 私のほうで、不理解や誤解がございましたにも関わらず
 再三にわたり、優しくご指導を賜りまして、恐縮しております。

 ありがとうございます。

 テスト環境まで作成いただき、すぐに動作確認を
 させていただけました。
  
 詳しくアドバイスをいただきましたおかげで、
 目的を達成することができそうです。

 また、テスト環境まで作成いただいたおかげで、
 わかりやすい例解で、今後の応用にも結びつけられそうです。

 アドバイスを頂いていなければ、
 まだまだ無駄な遠回りをしたあげく
 別の手段を探していたかとも思います。

 ご親切、本当にありがとうございました。
 これを機に、がんばって様々な活用方法を身につけて参りたいと思います。

PS:
 いりやさんのサイトで
 UWSCのスクリプト集も公開されていらっしゃるのを拝見し、
 いろいろを熟読させて頂きました。

 UWSCのことを、

>使用してみましたが、今ひとつ正確性に欠けるため、


 などと早まって表記してしまいましたこと、
 私のほうで理解不足があることを痛感し、勉強不足を
 反省いたしました次第です。

 今後ともますますのご活躍を心よりお祈り申し上げております。

SUN  
 

いりや さん 2004年 09月 06日 18時 26分 51秒

ウェブサイトに試験ページをこさえてみました。

http://iriyak.adam.ne.jp/arc/uwsc/sun.html

こちらを制御する WSH スクリプトは次の通りです。お試しください。

var e = new ActiveXObject('InternetExplorer.Application');
e.visible = true;
e.navigate('http://iriyak.adam.ne.jp/arc/uwsc/sun.html');
while (e.busy || e.readyState != 4)
    WScript.sleep(100);

var d = e.document;
var targets = new Array(
    d.getElementById('a'),
    d.getElementById('b'),
    d.getElementsByName('c').item(0)
);

WScript.echo('Y にします...');
answer_y();

WScript.echo('N にします...');
answer_n();

WScript.echo('n/a にします...');
answer_na();


function answer_y() {
    targets.do_(function (each) { each.value = 'Y' });
}

function answer_n() {
    targets.do_(function (each) { each.value = 'N' });
}

function answer_na() {
    targets.do_(function (each) { each.value = 'n/a' });
}

function Array.prototype.do_(operation) {
    for (var i = 0; i < this.length; i++)
        operation(this[i]);
}

いりや さん 2004年 09月 06日 18時 19分 42秒

SUN さん、

あっと test.html は、ナビゲーション対象の HTML の一つの例として書いたもので、test.js は test.html 内部に記されている script 要素には依存していません。test.js だけで select を制御しています。(ボタンはおまけです)

SUN さん 2004年 09月 06日 18時 00分 51秒

いりやさん、SUNです。

詳細な解説と参照URLをいただけて
感謝申し上げます。ありがとうございます。

ただ、私のほうで説明不足がありましたようで、
誠に申し訳ございません。

実は、
今回の対象となりますHTMLファイルは、
「こちら側で編集ができない」
という前提があります。

ロケットマウスやUWSCなどのプログラムを知り、
使用してみましたが、今ひとつ正確性に欠けるため、
wshで制御できる問題かどうかがをおたずね致しました次第です。

せっかくご回答を頂きましたのに、当方のご説明不足から
申し訳ございません。

今一度ヒントのようなものがございましたら、情報頂ければ幸いにございます。

お手数をおかけ致しますが、よろしくお願い致します。

SUN

いりや さん 2004年 09月 06日 17時 22分 31秒

SUN さん、

| といった、複数のプルダウンメニューに
| WSHで、いっきに全て"Y"を選択した状態にしてしまう、
| といった事は実現可能でしょうか。

可能です。このあたりの Dynamic HTML Object Model の操作につ
いては、AYA さんの解説が役立つと思いますので、以下の投函と並
行して参考になさってください。

  AYA, Dynamic HTML
  http://homepage3.nifty.com/aya_js/js2/dhtml_frm.htm

さて、SUN さんの対象画面とちょっと違いますが三つのプルダウン
メニューを同期をとって選択する例題をご紹介します。

(1) test.html

HTML の内部で制御します。ボタンを押すとそれぞれ Y, N, n/a に同期を取っ
て選択項目が変化します。

(2) test.js

Windows Script host から対象の Dynamic HTML を制御します。(1) と行う
ことは全く同じですが、スクリプトの配置場所が HTML の外に出されている
こと、対象の SELECT 要素へのリファレンスを得る方法を ActiveX オブジェ
クトの InternetExplorer.Application オブジェクトの document プロパティー
から引き当てているところが大きく違う点です。

それから、ダイアログで、変化する前に通知しています。OK ボタンを押して
効果を確認できます。

// test.html
<html>
<title>test</title>
<body>
<hr>
<select id='a'>
<option value='n/a'>n/a
<option value='Y'>Y
<option value='N'>N
</select>
<select id='b'>
<option value='n/a'>n/a
<option value='Y'>Y
<option value='N'>N
</select>
<select name='c'>
<option value='n/a'>n/a
<option value='Y'>Y
<option value='N'>N
</select>
<hr>
<input type='button' id='btn1' value='Answer Y' onClick='answer_y()'>
<input type='button' id='btn2' value='Answer N' onClick='answer_n()'>
<input type='button' id='btn3' value='Answer n/a' onClick='answer_na()'>
</body>
<script language=JavaScript>
var d = window.document; // document is a host variable in Internet Explorer.
var targets = new Array(
    d.getElementById('a'),
    d.getElementById('b'),
    d.getElementsByName('c').item(0)
);
function Array.prototype.do_(operation) {
    for (var i = 0; i < this.length; i++)
        operation(this[i]);
}

function answer_y() {
    targets.do_(function (each) { each.value = 'Y' });
}
function answer_n() {
    targets.do_(function (each) { each.value = 'N' });
}
function answer_na() {
    targets.do_(function (each) { each.value = 'n/a' });
}
</script>
</html>
// ここまで

// test.js
var e = new ActiveXObject('InternetExplorer.Application');
e.visible = true;
e.navigate('C:\\Program Files\\UWSC\\UWS folders\\040906 SUN さん select 自動選択\\test.html');
while (e.busy || e.readyState != 4)
    WScript.sleep(100);

var d = e.document;
var targets = new Array(
    d.getElementById('a'),
    d.getElementById('b'),
    d.getElementsByName('c').item(0)
);

WScript.echo('Y にします...');
answer_y();

WScript.echo('N にします...');
answer_n();

WScript.echo('n/a にします...');
answer_na();


function answer_y() {
    targets.do_(function (each) { each.value = 'Y' });
}

function answer_n() {
    targets.do_(function (each) { each.value = 'N' });
}

function answer_na() {
    targets.do_(function (each) { each.value = 'n/a' });
}

function Array.prototype.do_(operation) {
    for (var i = 0; i < this.length; i++)
        operation(this[i]);
}
// ここまで

消火活動 さん (m_fukayama@hotmail.com) 2004年 09月 06日 15時 58分 51秒

いまいち、原因がわからず困っています^^;お助け下さいませ。
ASPで、実行バッチをWSHのShellで走らせたのですが、LOCALテストでは結果がうまくいきますが、Serverに置いて実行するとうまくいきません。
LOCALもServerもWin2000でIISです。最初はIISを疑ったのですが見るところ設定は同じです。以下Prgのソースです。
test01.asp
------------------------------
<html>
<head>
<title>#batch.Runのテスト</title>
<body>
<form name="objForm" action="test02.asp">
<input type="submit" value="Run_Batch">

</form>
</body>
</html>
------------------------------

test02.asp
------------------------------
<%
Const MODULE = "D:\Source\test\test01.bat"
Function Test()
Dim objShell
Dim intRes
Set objShell = Server.CreateObject("WScript.Shell")
intRes = objShell.Run(MODULE,0,false)
Test = intRes
If intRes = 0 Then
Response.Write "<BR>"
Response.Write "バッチ正常起動 TEST.log を確認"
Else
Response.Write "<BR>"
Response.Write "エラー"
End If
End Function
Test
%>
---------------------------------

test01.bat
---------------------------------
C:\WINNT\system32\cscript.exe D:\Source\test\test01.wsf
---------------------------------

test01.wsf
---------------------------------
<package>
<job id="test">
<?job error="false" debug="true" ?>
<script language="VBScript">
Option Explicit

Const DBG_FILE = "D:\Source\test\file"
Const TMP_FILE = "TEST.log"

Function Main()
On Error Resume Next
Dim objFs
Dim strTmpFile
Dim objLogFile

Set objFs = CreateObject("Scripting.FileSystemObject")
strTmpFile = objFs.BuildPath(DBG_FILE,TMP_FILE)
Set objLogFile = objFs.CreateTextFile(strTmpFile,True,False)

objLOgFile.WriteLine(Date() & " " & Time())
objLogFile.WriteLine("テスト:書込み成功")
objLogFile.Close

End Function
Main
</script>
</job>
</package>
--------------------------------
test01.aspのsubmitボタン押下後、test02.aspのResponseメッセージ
は、出ます。ということは、test02.aspのtest()FunctionはintRes=
Trueで最後まで走ってますが、肝心のtest01.batのwsf結果(テキスト排出)がうまくいってません。手動batchは成功です。VBSで直接バッチを叩かずにファイルを作成してカキコのスクリプトを実行しましたら・・なんとうまくいきます。ということは書込み権限とか、IISの問題ではない・・
原因がわかれば対処できるのですが、Localではうまくいくというのが、
解せないのです。。ww
是非お力添えをお願いします。 m(_ _)m

SUN さん 2004年 09月 06日 13時 54分 15秒

はじめまして。

 検索をしてみたのですが、なかなか解に至らず、
 ヒントを頂ければ幸いです。

・IEで表示しているHTML内の
 特定の一つのform、例えば、<form name="SAMPLE"..>内にある

<select name="1">
<option value="Y">
<option value="N">
</select>)

<select name="2">
<option value="Y">
<option value="N">
</select>)
:


といった、複数のプルダウンメニューに
WSHで、いっきに全て"Y"を選択した状態にしてしまう、
といった事は実現可能でしょうか。

 

ばんのしゃーによかばんた さん 2004年 09月 05日 16時 59分 37秒

>管理人むたぐち さん 2004年 06月 03日 19時 33分 47秒
>というか、Filesコレクションのループの中で、Deleteやリネームはご法度です(よね?)

試してみました。
file.Deleteもfile.Name=newnameも特に問題なく実行できます。
利便性を考えて、何か特別な対策が採られているのでしょう。

For Each file In Files実行中のFilesのコピー(_NewEnum)は半分snapshotのようです。
file.Deleteやfile.Name=で旧名は即時に消えるが、新名や作成は追加反映されない、
という仕様のようです。

そういえば、リネームは、内部的に、新名のハードリンクを作ってから旧名を削除する
というような振る舞いをしてますね。
根拠、A.EXTをa.extに変えようとすると、同名ファイルがある、というエラーになる。

一方、Files.Item(name)やFiles.Countには、削除も作成も即時に反映されます。

因みに、For k=1 To Files.CountのTo式の評価は、最初の一度だけのようです。
したがって、もし、Files.Item(数字インデックス)が出来たりすると、
For k=1 To Files.Count
Files.Item(k-1).Delete
Next
は、確実に破綻します。
Files.Item(数字インデックス)がない、のはそういったトラブルの予防対策かも。

>私は、DictionaryオブジェクトのkeyにFile.Pathを格納して、
>最後にDictionaryオブジェクトの全keyに対してFs.DeleteFileメソッドを
>実行するようにしています。これだと安全です。

Filesに関して「だけ」は、それほど心配しなくてもよいようですね。

Return