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

IEで特定のHTMLファイルの表示が空白になる。

何でかなぁ。以前は見えてたのに。
Netscapeでは見えるのに。
ソースを見ても、変なところはなさそう。

〜〜延々〜〜

表示−エンコードがUTF-8になってました。

※その前に、MSDN Subscriptions - Shipment Contentsを見ようとしたら、
文字化けしたので、UTF-8に変えたのでした。

気が付かなかったら、まだまだ延々と悩むところでした。:-<

文字化けするなら分かりますが、なんで空白になるんでしょうね。

ご用心。

玉緒 さん 2004年 10月 25日 15時 38分 33秒

はじめまして。VBScriptに関して教えてください。
Scriptでエクセルのログを取りたいのですが可能でしょうか?
計画的には以下のような感じで考えております。
1. scriptを常時起動させている(loop)
=> プロセスを監視
2. excel.exeが起動したと同時にログを吐き出す。
3. excel.exeが終了したと同時にログを吐き出す。
4. プロセスを監視する。
5.終了はWindowsが終了と同時。

以上、宜しくお願い致します。

(管理人により削除) さん 2004年 10月 25日 04時 02分 29秒
URL:http://

(管理人により削除)

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

wShell.SendKeysは日本語が通りません。:-<
でしたが、
.NETのSendKeysは日本語が通りますね。:-)

SendKeys.JS

import System
import System.Windows
import System.Windows.Forms
import System.Windows.Forms.SendKeys

SendKeys.SendWait("AAAあいうえお");


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

ファイル作成日時を、ファイル更新日時に合わせて、変更する。
JScript.NETのサンプル。

FileDate.JS

import System
import System.IO
var path : String = "C:\\Net\\FileDate.JS"

var wdt : DateTime =File.GetLastWriteTime(path);
var cdt : DateTime =File.GetCreationTime(path);
File.SetCreationTime(path,wdt);
var cdt2 : DateTime =File.GetCreationTime(path);

Console.WriteLine(wdt);
Console.WriteLine(cdt);
Console.WriteLine(cdt2);

※Excel VBAからWin32APIを呼び出すしか、方法はないものか。
と思っていましたが、存外、簡単に出来ますね。
これは、使えそう。

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

>ヤーポンレン さん 2004年 09月 30日 17時 27分 11秒
> ・Shellを使う以外にファイルの所有者や作成者など、「概要」タブに
>  表示される項目を取得できる方法

ファイルの所有者は、DIR /Q で。

作成者など、
これは、Word/Excelなどのファイルのことでしょうか。
もし、そうなら、それらをGetObjectして、

Set book=GetObject(file)
n=1
For Each prop In book.BuiltinDocumentProperties
If VarType(prop)=vbObject Then
WScript.Echo n,prop.Name
Else
WScript.Echo n,prop.Name,prop.Value
End If
n=n+1
Next

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

>初心者 さん 2004年 10月 21日 13時 27分 02秒
>Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
>objFS.CopyFolder "E:\*","F:\folder2", True
>1.1回目コピー時隠しフォルダのようなもので書き込みエラーがでます。
>2.読み取り禁止フォルダーの2回目のコピーが出来ません。
>ちなみにDOSのXCOPYのE:\* F:\folder2 /E /R /Kのようにコピーしたいのですが。

それは、"System Volume Information" フォルダではありませんか?

これは、システムが使用中は保護されていて、アクセスできないようです。
対象から除外するしか、ないと思います。

村上 厚 さん (seanews@pacific.net.sg) 2004年 10月 24日 07時 21分 44秒
URL:http://www.seanewsonline.com

 最近、cPanelのエントロピー・サーチと言う機能を利用し、自分のウェブサイト内の検索ができるようにしたのですが、キー・ワードとして半角・英字しか使用できません。
以下はエントロピー・サーチのコードです。
<form action="/cgi-sys/entropysearch.cgi" target=searchwindow>
Search Query <input type="text" name="query" value="">
<input type="hidden" name="user" value="seanews">
<input type="hidden" name="basehref" value="http://seanewsonline.com">
<input type="hidden" name="template" value="default">
<input type="submit" value="Search">
</form>
 シンガポールのホスティング会社を利用しています。日本にもcPanelを用いたホスティング会社が存在するようですが、何とかサイトを移転せずに日本語による検索ができるようにならないでしょうか。
 もしくは自分のウェブサイト内の検索ができ、また素人にも容易にセットアップできるようなソフトウェアが有れば教えて下さい。

 前回、Googleのサイト内検索を設定した際、やはりキーワードに半角・英字しか使用できず、Googleに問い合わせたところ、<inputtype=hidden name=hl value="ja">のすぐ下に以下の3つのコードの何れか1つを挿入するようにとアドバイスされ、その際は成功しました。
<input type=hidden name=ie value=Shift_JIS>
<input type=hidden name=ie value=UTF-8>
<input type=hidden name=ie value=EUC-JP>

 そこで今回も上記の方式を試してみようと思ったのですが、上記のエンロトピー・サーチ・コードには<inputtype=hidden name=hl value="ja">の一行が存在せず、どこに挿入したら良いのか分かりません。自分なりに<inputtype=hidden name=hl value="ja">と3つの文字コード・コマンドを取り替えて挿入して見ましたが、うまく行きませんでした。

 ちなみに以下のURLにエントロピー・サーチ(Entropy Search)の簡単な説明が有り、私もこれを参考にしました。
http://www.webhosting.co.jp/pc/jp/cpanel_instructions/Entropy_Search.htm

 そんなことで、長くなりましたが、何故日本語による検索ができないのか、その対策等、教えて頂きたいと思います。宜しくお願い申します。


shinamon さん (shinamon@hotmail.com) 2004年 10月 23日 01時 24分 31秒

すみません。初心者ですが質問です。

IEからExcelへのデータ取込について教えてください。例えば、
http://www-6.ibm.com/jp/domino02/NewAIS/aisextr.nsf/aissearch
上記URLのページから、

発表のタイプ :
カテゴリー :
レター番号 :
発表日 :
更新日 :
OfferID :
をExcelファイルに取り込んでリストを作成する方法をご教授下さい。
ExcelのVBAに、VBスクリプトのファイル実行コードを追加する等で可能でしょうか。

管理人むたぐち さん 2004年 10月 22日 19時 24分 33秒

To: lamb さん
ご報告ありがとうございます。バックアップを書き戻しておきました。
取り急ぎ、ご報告まで。

# 管理しきれないWikiを残しておくのもまずいかなぁ…。

lamb さん 2004年 10月 22日 14時 36分 15秒

Wikiがスパム食らっていますよ〜

管理人むたぐち さん 2004年 10月 22日 08時 11分 55秒

WSH用コンパイラ+(WindowsNT/2000/XP/プログラミング)
http://www.vector.co.jp/soft/winnt/prog/se344839.html

こんなのが出てました。

# 返信は後ほど。

kuroneko さん 2004年 10月 21日 17時 27分 35秒

2回目の質問となります。宜しくお願いいたします。
Notesスクリプトから(エージェント自動実行)WSHを起動しておりますが
サーバーにロックがかかっている状態だとWSHが起動しません。
ロックをかけずに行なうと特に問題なく起動します。
理由がさっぱり分かりません。
ここで質問するのは間違っているかも知れませんが
教えていただけないでしょうか?宜しくお願いいたします。
Notesスクリプトからの起動の状態
a = Shell( "Wscript.exe C:\Docume~1\db001011\デスクトップ\0831test.vbs")

WSHの内容
Option Explicit
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
'WScript.echo "保存します"
WshShell.AppActivate ("Internet Explorer")
WshShell.SendKeys "%VC"
WScript.Sleep 1500

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

'WScript.echo "名前つけて保存"
WshShell.AppActivate "メモ帳"
WshShell.SendKeys "%FX" , True
'WScript.echo "ウィンドウ閉じる"
WScript.Sleep 1000
WshShell.AppActivate ("Internet Explorer")
WshShell.SendKeys "%FC"

WScript.Quit

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

MVPのみなさま、MSDNの言語パックはどれを選択されました?

そんな選択があるとも思わなかったので、よく分からないまま、
Country/Region: Japan で最初に位置付けられた、

言語パック: MSDN Universal - Asia: Asian All: English, Trad & Simp Chinese, Korean, Japanese, Thai, Vietnamese

を選択しましたが、これでよかったのか、少々不安です。

http://www.msj.co.jp/msdn/

http://msdn.microsoft.com/Subscriptions/index/packinglist.aspx
で、調べてみましたが、選択肢の表記がそれぞれ違っていて、対応が付きません。:-(

初心者 さん 2004年 10月 21日 13時 27分 02秒

こんにちは。wshのVbScriptでドライブのコピーって出来るのでしょうか?
教えて下さい。
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
objFS.CopyFolder "E:\*","F:\folder2", True
1.1回目コピー時隠しフォルダのようなもので書き込みエラーがでます。
2.読み取り禁止フォルダーの2回目のコピーが出来ません。
ちなみにDOSのXCOPYのE:\* F:\folder2 /E /R /Kのようにコピーしたいのですが。
宜しくお願いします。

たじ さん 2004年 10月 20日 21時 56分 39秒

こんにちは。
おしえてください。

WMIを使用してイベントログにアクセスできますが、
evt形式のファイルとして保存したイベントログに
同じ方法で、アクセスする方法を教えて下さい。お願い致します。
→任意のevtファイルを指定して、ログの検索を行ないたいです。


Set obj = _
GetObject("winmgmts:{impersonationLevel=impersonate}")
w = "SELECT * " & _
"FROM Win32_NTLogEvent "
Set obj1 = obj.ExecQuery(w)


ばんのしゃーによかばんた さん 2004年 10月 20日 15時 05分 54秒

>ばんのしゃーによかばんた さん 2004年 06月 07日 22時 07分 21秒
>ローカルなHTMLファイルをインターネットゾーンか、またはスクリプトを無効にして、
>HTMLDocumentに取り出す方法はありませんか。

これも知らなかった。

HTMLファイルの先頭に、以下を入れると、インターネットゾーンになりますね。

<!-- saved from url=(0011)about:blank -->

応用としては、
HTMLファイルのインターネットゾーンの動作テストをローカルに置いたまま出来るとか。

今後、
ローカルでは動くHTMLファイルが、サーバに置くと動かない。
というケースで、セキュリティレベルの問題かどうか、の切り分けに使えますね。

※これって、信頼済みサイトの偽装に、使われたりしないんでしょうかねぇ。

ばんのしゃーによかばんた さん 2004年 10月 20日 15時 05分 27秒

HTMLファイルからスクリプト類を削除すると、以下のエラーが出るようになりました。

――――――――――――――――――――――――――――――――――――――
オフラインで使用できない Web ページ
このページは、インターネットに接続していないと表示できません。

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

次のことを試してください:

このページをオフラインで使用するには、インターネットに接続して、
[お気に入り] メニューの [お気に入りに追加] をクリックします。
次に [オフラインで使用する] チェック ボックスをオンにしてください。
[ツール] メニューの [同期] をクリックします。
オフラインで作業するときは、お気に入りの一覧から目的のページを選択してください。

Internet Explorer
――――――――――――――――――――――――――――――――――――――

HTMLファイルに
<img src="http://...">
があると、エラーになるようです。

でも、スクリプト類を削除せず、無効にしてるとエラーにならないんです。
window.onerrorのデフォルトアクションなのかなぁ。

ばんのしゃーによかばんた さん 2004年 10月 20日 15時 04分 50秒

JScriptでは、functionを動的に書き換えられますが、
VBScriptでも、executeを使って出来ますね。

Sub a()
MsgBox "a"
End Sub
a
Execute "" & vbCRLF & _
"Sub a() " & vbCRLF & _
"MsgBox ""b"" " & vbCRLF & _
"End Sub " & vbCRLF & _
""
a

しかし、最初から、functionを動的に書き換えるつもりなら、

Sub a()
MsgBox "a"
End Sub
Sub b()
MsgBox "b"
End Sub
Set c=GetRef("a")
c
Set c=GetRef("b")
c

のほうが、いいかも。

いずれにしても、使い道が、?


スタント さん 2004年 10月 18日 22時 01分 56秒

はじめまして。

まだWSHを知ったばかりですが、IEを操作できるものを作りたいと思っています。

サンプルで
Set IEObj = CreateObject("InternetExplorer.Application.1")
IEObj.Navigate(str)
IEObj.visible = True
IEObj.StatusBar = True
IEObj.ToolBar = False

このようなものを見つけたのですが、このサンプルの.Navigate(str)や.visibleという部分はどのように調べれば解るのでしょうか?
(これらはエクセルやIEなどのオブジェクトによっていろいろあるのですよね?)

説明が下手で申し訳ないですが、詳しい方教えていただけないでしょうか。
よろしくお願い致します。

管理人むたぐち さん 2004年 10月 18日 15時 53分 59秒

WSHからSAPIの音声認識を利用するもっとも短いサンプル。
cscriptで実行してみてください。
単語が認識されるたびに、その単語を表示していくというものです。
終了はタイトルバーの×ボタンで。
マイクで喋ってもいいですし、Waveの出力をリダイレクトさせてもいいです。
学習とか文法ファイル(*.xml)の読み込みとかをまったくしてないので、
あまりまともな認識をしませんが、それなりに楽しめるかと。

Const SGDSActive = 1
Set src = WScript.CreateObject("SAPI.SpSharedRecoContext","src_")
Set sgr = src.CreateGrammar
sgr.DictationLoad
sgr.DictationSetState SGDSActive
sgr.CmdSetRuleIdState 0, SGDSActive
Do
WScript.Sleep 5000 '5sec
Loop

Sub src_Recognition(ByVal strmNum, ByVal strmPos, ByVal recType, ByVal res)
Set info = res.PhraseInfo
WScript.Echo info.GetText
End Sub

ばんのしゃーによかばんた さん 2004年 10月 18日 15時 41分 20秒

>Aiko Noguchi さん (cuctj304@occn.zaq.ne.jp) 2004年 10月 12日 16時 05分 52秒

やりたいことは、
>2. c:\test2にファイルが存在する場合は移動を行わない(スクリプト終了)
でしょうか。

単に移動したい。
でも、同名ファイルがあると、エラーダイアログが出て、処理が止まる。
それは困るので、ファイルがあったら移動しない、ことにしよう。
ということではありますまいか。

そこで、
同名ファイルがあっても、エラーやプロンプトや上書きなしに移動する。
サンプルです。

src="c:\test1"
dst="c:\test2"
Set fso=CreateObject("Scripting.FileSystemObject")
Set Folder=fso.GetFolder(src)
For Each File In Folder.Files
: For k=1 To 999
: : If k=1 Then
: : : Call Move(File,dst)
: : Else
: : : alias=fso.GetBaseName(File.Name) & " " & k
: : : ext=fso.GetExtensionName(File.Name)
: : : If ext<>"" Then alias=alias & "." & ext
: : : Call Move(File,fso.BuildPath(dst,alias))
: : End If
: : If Err.Number=0 Then
: : : Exit For
: : ElseIf Err.Number<>58 Then '58 既に同名のファイルが存在しています。
: : : WScript.Echo Err.Number,Err.Description
: : : WScript.Quit Err.Number
: : End If
: Next
Next

Sub Move(File,dst)
: On Error Resume Next
: File.Move(dst)
End Sub

同名ファイルがあると、ベース名に2〜999のサフィックスを付けて移動します。
コピーも同様です。

ばんのしゃーによかばんた さん 2004年 10月 18日 15時 40分 58秒

>ばんのしゃーによかばんた さん 2004年 10月 16日 16時 09分 24秒
>JScriptのArrayは、制御表チェーンのような構造。
>a[0][next]->a[1][next]->...
>var a=new Array();
>for(var k=0;k<1000000;k++) a.push('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk');
>for(var m in a)m;
>//10m06.9
>近くなりました。でも、まだ倍以上の差です。

データサイズに依存するところを見ると、
ひとつずつがチェーンになっているのではなく、
一定サイズのプールがあって、プール内はポインタ配列、プール間がチェーン
のような構造になっているのかな。

でも、そうすると、

>for(var k=0;k<1000000;k++) a[k];
>//12.0sec
>for(var m in a)m;
>//2m40.28sec(160.28)

for(var k=0;k<1000000;k++) a[k];が速いことの説明が付きません。

for(var m in a)m;用に別の構造を作っていて、それが鈍くさいのかも。

※※※

for(var k=0;k<1000000;k++) a[k];
より
for(var m in a)m;
のほうが使い易いのですが、こんなに性能差があると、
for(var m in a)m;
は使用を避けて、
for(var k=0;k<1000000;k++) a[k];
を使ったほうがいいですね。

管理人むたぐち さん 2004年 10月 18日 13時 16分 45秒

VBSでスイスイ
http://cgi33.plala.or.jp/biwakobo/showhtml.cgi?f=vbs01

SAPIを使ってPCに喋らせる方法が載っていました。

みかりん さん 2004年 10月 17日 23時 59分 51秒

アンインストールの意味がわかりません。誰か教えてください

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

>ばんのしゃーによかばんた さん 2004年 10月 09日 15時 53分 35秒
>file数 ElapsedTime
>5K 4.40Sec
>50K 44.7
>150K 158(2m38s)
>1M 2483(41m23s)
>10K(万)のorderまではlinearですが、
>100K(十万)のorderから非線形になっていくようです。
>M(百万)では数倍に。

これが、

>実メモリに収まらなければ、ページスワップが発生します。少し遅い。
>少なくともワーキングセットは実メモリに収まっているか。
>でなければ、ページスラッシングが発生します。めちゃ遅い。

このせいかどうか、検討してみました。

タスクマネジャで見ると、

メモリ使用量≒仮想メモリサイズ(≒約80M)
なので、溢れている風ではない。

また、
ページフォルト×4K≒仮想メモリサイズ
なので、

>ばんのしゃーによかばんた さん 2004年 10月 04日 21時 04分 17秒
>mallocはアドレスを返すので、アドレス空間上はその時点で割り当てる
>以外にないです。一方、実メモリと仮想メモリの外部記憶媒体上のスペースは、
>不要です。最初のアクセス時にページフォルトを起こして、そのときに実ページを
>割り当てる。最初にページアウトするときに外部記憶媒体上のスペースを割り当てる。
>というのが普通の実装です。

の通り実装されているようで、最初のアクセス時のページフォルトだけみたい。

また、ページの追い出し/読み直しのコストは、
80M÷4K×10msec×2=400sec
なので、44.7×20=897と2483の差を説明するのには、数字が合わない。

また、CPU使用率が高い(97-99)ことの説明も付かない。

そこで、疑いを別のものに向けました。

var a=new Array();
for(var k=0;k<1000;k++) a.push(k);
//0.43sec

var a=new Array();
for(var k=0;k<1000;k++) a.push(k);
for(var m in a)m;
//0.42sec

var a=new Array();
for(var k=0;k<1000000;k++) a.push(k);
//10.37sec

var a=new Array();
for(var k=0;k<1000000;k++) a.push(k);
for(var k=0;k<1000000;k++) a[k];
//12.0sec

var a=new Array();
for(var k=0;k<1000000;k++) a.push(k);
for(var m in a)m;
//2m40.28sec(160.28)

Dim a(1000000)
For k=0 To 1000000
a(k)=k
Next
For Each m In a
b=m
Next
'2.1sec

for(var m in a)が異常に遅い。

どうも、
VBScriptのArrayは、ポインタ配列のような構造。pushができない。ReDimが必要。
a[0]->a(0)
a[1]->a(1)
...
indexから直にアクセス。

JScriptのArrayは、制御表チェーンのような構造。pushができる。ReDimが不要。
a[0][next]->a[1][next]->...
for(var m in a)は毎回indexからリンクを辿ってアクセスしているみたい。
そうだとすると、O(n**2)になります。

でも、まだ、大きな差があります。

var a=new Array();
for(var k=0;k<1000000;k++) a.push('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk');
//3m24.82

var a=new Array();
for(var k=0;k<1000000;k++) a.push('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk');
for(var m in a)m;
//10m06.9

近くなりました。でも、まだ倍以上の差です。

ばんのしゃーによかばんた さん 2004年 10月 15日 20時 01分 10秒

>Aiko Noguchi さん (cuctj304@occn.zaq.ne.jp) 2004年 10月 12日 16時 05分 52秒
>2. c:\test2にファイルが存在する場合は移動を行わない(スクリプト終了)
>If FS.FileExists("c:\test2\") = True Then
>WScript.Quit
>Else

直訳すると、

If FS.GetFolder("c:\test2").Files.Count > 0 Then
: WScript.Quit
Else

です。

sirn さん 2004年 10月 15日 17時 52分 25秒

ファイルが存在しない時は、移動しない。
という条件設定をしてるのに、そのファイル名を指定しなければ
意味がないですよ。
("c:\test2\*.pdf")の方がいいかもしれません。

Dim FS
Set FS = CreateObject("Scripting.FileSystemObject")
'
If FS.FileExists("c:\test2\*.*") = True Then
WScript.Quit
Else
FS.MoveFile "c:\test1\*.pdf", "c:\test2\"
End If

sirn さん 2004年 10月 15日 17時 52分 07秒

ファイルが存在しない時は、移動しない。
という条件設定をしてるのに、そのファイル名を指定しなければ
意味がないですよ。
("c:\test2\*.pdf")の方がいいかもしれません。

Dim FS
Set FS = CreateObject("Scripting.FileSystemObject")
'
If FS.FileExists("c:\test2\*.*") = True Then
WScript.Quit
Else
FS.MoveFile "c:\test1\*.pdf", "c:\test2\"
End If

maroon さん 2004年 10月 13日 20時 50分 12秒

wshにてIPアドレスを変更したいのですが、サンプルプログラムが探せません
是非教えてください。

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

>つちや さん 2004年 10月 09日 20時 23分 52秒
>ちなみに、私がFDateフィールドをDateではなくIntegerタイプにしたのは、
>Integerにした方が体感できるほど速かったからなのでした。

Const adDate = 7
Const adDBTimeStamp = 135

試して見ましたが、変わらなかったです。

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

>オズ さん 2004年 10月 13日 14時 26分 49秒
>Set objExec = objShell.Exec(strCommand)←解凍のコマンドです。
>Do While objExec.Status = 0
>WScript.Sleep 100
>Loop
>これで大体は成功するのですが、時々解凍処理が完了(圧縮ファイルの
>中身が全て出力されている状態)しているのにも関わらず
>WshScriptExecオブジェクトのStatusが0のまま変化せずにループを
>回り続けてしまうことがあります。
>時々というのは、同じことをしても成功するときと成功しない時が
>あるというのではなく、成功する圧縮ファイルと成功しない圧縮ファイルが
>あるということです。調査の結果、圧縮ファイル中のファイル数が多いと
>成功しないように推測されます。
>実行されるコマンドをコマンドプロンプトから実行するときちんと
>解凍処理が行われ、処理の終了とともにプロンプトも戻ってきます。
>解凍終了を認識してその場で終了させるようにするにはどうしたらよいでしょうか。

出力がパイプに詰まっているのではないでしょうか。
以下参照。

>ばんのしゃーによかばんた さん 2004年 05月 02日 19時 28分 47秒
>2000/XPでは、ExecのStdOutに疑似パイプ(一時ファイル)ではなく、
>OSのpipeが使われているようです。
>pipeには有限のメモリバッファがあり、溢れると書き込みがブロックされます。
>試してみますと、なな何と僅か163バイトのようです。
>で、正しいコーディングは? と言うと、
>Set wShell=CreateObject("WScript.Shell")
>Set oExec=wShell.Exec("CScript out.vbs")
>Do While Not oExec.StdOut.AtEndOfStream
>WScript.Echo oExec.StdOut.ReadLine()
>Loop
>または、
>WScript.Echo oExec.StdOut.ReadAll()

※読み終えた後に更にStatusの待ち合わせを入れたほうがよいようです。
※もし、出力が不要なら、読むだけ読んで捨てる。

このように、wShell.Execとコンソールアプリの組み合わせには問題が多いので、
結局、コンソールアプリは、
ExitCode=wShell.Run(command,,True)
を使ったほうがよいと思います。

オズ さん 2004年 10月 13日 14時 26分 49秒

どうも始めまして。オズと申します。

バッチをタスクに登録して実行する処理でどうしてもうまくいかないところが
あるのでできればお教えください。

やりたい処理と言うのは単なる圧縮ファイルの解凍です。
スクリプトファイルをバッチファイルから実行し、そのバッチファイルを
タスクスケジューラから実行させるようにしています。
現状では実行する部分は以下のように書いてあります。

Set objExec = objShell.Exec(strCommand)←解凍のコマンドです。
Do While objExec.Status = 0
WScript.Sleep 100
Loop

これで大体は成功するのですが、時々解凍処理が完了(圧縮ファイルの
中身が全て出力されている状態)しているのにも関わらず
WshScriptExecオブジェクトのStatusが0のまま変化せずにループを
回り続けてしまうことがあります。
時々というのは、同じことをしても成功するときと成功しない時が
あるというのではなく、成功する圧縮ファイルと成功しない圧縮ファイルが
あるということです。調査の結果、圧縮ファイル中のファイル数が多いと
成功しないように推測されます。
実行されるコマンドをコマンドプロンプトから実行するときちんと
解凍処理が行われ、処理の終了とともにプロンプトも戻ってきます。
解凍終了を認識してその場で終了させるようにするにはどうしたらよいでしょうか。

OSはWin2KProで、圧縮ツールはmlzhというUNLHA32.DLLを
用いたフリーの圧縮/解凍ツールを使用しています。

よろしくお願いします。

さざなみ さん 2004年 10月 13日 10時 23分 32秒

さざなみです。

> Aiko Noguchiさん
FileExists ではなく FolderExists
ではないでしょうか?

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

>ばんのしゃーによかばんた さん 2004年 10月 09日 15時 53分 35秒
>scalabilityの話題です。
>中小規模で性能に有効なバッファリングやキャッシュのような戦術は、
>大規模では無力化するだけでなく、かえって性能劣化要因になったり、
>障害になったりもします。そういう観点での検討も必要です。

昔の、あるODBMSですが、classのデータload処理をなぜか、
(1) n個のindexを外す。
(2) instanceを挿入する。
(3) n個のindexを付ける。
のようにやってました。[A]戦略ですね。

理由は、特になく、単に、既存のルーチンを組み合わせて簡単に作れた。
と言ったところだろうと、想像してます。

論理的には間違ってません。性能的にはどうでしょう。これで分かるひとは凄い。
問題は二つ。ひとつ分かった人は凄い。ふたつ分かった人は凄過ぎます。

ひとつ目。
(2)でmページにinstanceが出来ます。小規模では、mページが全部バッファに載ってます。
(3)でn個のindexを付けるのに、mページをn回舐めます。
mページが全部バッファに載ってれば、ささっと済みます。
載り切らなかったら、たとえ、それが最後の1ページであっても、それを載せるために、
LRU(Least Recent Used)で最初の1ページを追い出す。次のindexを付けるのに、
第1ページを読もうと、LRUで第2ページを追い出す。第2ページを読もうと、、、。
バッファが溢れた途端、どーんと非連続的に性能が落ちるのが特徴です。

二つ目。
例えば、50M instanceをloadするのに、1M instanceずつ50回に分けてloadしました。
最初の1M 件は2時間。次の1M 件は3時間。次の1M 件は4時間。。。
(2)の処理は追加数に依存しますが、(3)の処理は既存数に依存するのです。

修正は[B]戦略。indexを外さないで、instanceを挿入しながら、indexをメンテする。

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

>ばんのしゃーによかばんた さん 2004年 10月 12日 13時 08分 25秒
>早速、ソートに名を借りた、GetRefのサンプルです。

比較をVBScript側でするなら、配列を渡す必要はなかったですね。数だけで十分。

Set fso=CreateObject("Scripting.FileSystemObject")
Set Folder=fso.GetFolder("c:\windows\system32")
ReDim items(Folder.Files.Count-1)
ReDim keys(Folder.Files.Count-1)
k=0
For Each File In Folder.Files
: items(k)=File.Path
: keys(k)=CDbl(File.DateLastModified)
: k=k+1
Next
Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"

Function compare(x,y)
compare=keys(x)-keys(y)
If compare=0 Then compare=x-y '例えば、第二ソートキーに入力順
End Function

Call SC.AddObject("vbfunc",GetRef("compare"),True)
SC.AddCode "" & _
"function VBArraySort(n){" & _
"var b=new Array();" & _
"for(var k=0;k<=n;k++) b.push(k);" & _
"return(b.sort(compare));" & _
"function compare(x,y){" & _
"return(vbfunc(x,y));" & _
"}" & _
"}"
Set js=SC.Run("VBArraySort",UBound(keys))
For Each k In js
WScript.Echo items(k),CDate(keys(k))
Next


初心者みきてぃ さん 2004年 10月 12日 16時 31分 12秒

こんにちわ。初めて書込みします。

VBScript初心者です。
環境はWin2000 WSH BASP21 を使用します。

まず、一つ目に1日1回 自動的にVBScriptを実行(タスクスケジューラーorATコマンド)の
質問です。
VBは少しわかるので、例で、VBではsub main() などで実行されますよね。
VBScriptではどのようにすれば良いのでしょうか?

二つ目にファイル間(Test1.vbs)には、簡単な処理のみ。(Test2.vbs)には関数を
記述し、そのvbsファイル間で処理(実行)出来るのでしょうか?

質問内容がわかりにくいかと思いますが、
宜しくお願い致します。

Aiko Noguchi さん (cuctj304@occn.zaq.ne.jp) 2004年 10月 12日 16時 05分 52秒

はじめまして。
野口と申します。

WSH/VBScriptは初心者です。よろしくお願いします。
勉強中のサンプルとして、以下の処理を行うスクリプトを
書いております。

1. c:\test1からc:\test2へのファイル移動を行う
2. c:\test2にファイルが存在する場合は移動を行わない
(スクリプト終了)
3. メッセージボックス等のユーザー処理を前提とする表示は
行わない

If 〜 Else 〜 End Ifを使用するところまでは書籍などで
理解できたのですが、うまくいきません。
(エラー処理が行われず、どんな場合でもファイルが移動してしまいます)

私の書いたスクリプトは以下のとおりです。
(赤面ものですが...)

Dim FS
Set FS = CreateObject("Scripting.FileSystemObject")
'
If FS.FileExists("c:\test2\") = True Then
WScript.Quit
Else
FS.MoveFile "c:\test1\*.pdf", "c:\test2\"
End If

どうしたら良いか、教えて頂ければと思います。
よろしくお願いします。

ばんのしゃーによかばんた さん 2004年 10月 12日 15時 58分 14秒

>ばんのしゃーによかばんた さん 2004年 10月 07日 17時 05分 26秒
>O-2型 オブジェクト参照を解放しなくてもオブジェクトが終了する。...IE

逆に、オブジェクト参照からIEが終了したかどうかを判定する必要が生じます。

Set ie=CreateObject("InternetExplorer.Application")
ie.Visible=True
:::
Do While TypName(ie)="IWebBrowser2" 'IE終了待合せ
: WScript.Sleep 100
Loop

>ばんのしゃーによかばんた さん 2004年 10月 07日 17時 06分 06秒
>O-3型 オブジェクト参照を解放しないとオブジェクトが終了しない。...Excel
>Set xl = CreateObject("Excel.Application")
>xl.Visible=True
>xl.workbooks.add
>MsgBox "!"
>GUIでExcelを終了しても、プロセスは残っています。

GUIでExcelを終了したかどうかを、オブジェクト参照から判定するには、

Do While xl.Visible 'Excel GUI終了待合せ
: WScript.Sleep 100
Loop
Set xl=Nothing 'Excel process 終了
WScript.Quit

>Set xl = CreateObject("Excel.Application")
>xl.Visible=True
>xl.workbooks.add
>Set xl=Nothing
>WScript.Quit
>オブジェクト参照を解放しても、Excelは終了しません。

GetObjectはまた違うのでややこしいです。パス。

ばんのしゃーによかばんた さん 2004年 10月 12日 15時 57分 16秒

>いりや さん 2004年 10月 11日 02時 21分 54秒
>定であると仮定すると O(n) になると思います。

懐かしい表記。これが思い出せなかったんですよ。
どこで出て来る表記なんでしょう。それも思い出せないんですよ。
濃度?(density)、アレフ0なんかとは違うし。

>つちや さん 2004年 10月 10日 21時 58分 37秒
>保存される方を安定したソートというわけですが、

何が安定してるんでしょうね。 preserve typeとかのほうがぴったりですが。

私たちが、人の責任追及が絡みそうな「品質が良い/悪い」と言う状況を、
向こうの人は、自然現象か何かのように「安定/不安定」と言ったりして、
なんか表現が違うんですよね。

ばんのしゃーによかばんた さん 2004年 10月 12日 15時 56分 25秒

先のは、古いほうでした。こっちが新しいほうです。

(function () {
    var $ = Enumerator.prototype;
    $.do_ = function (operation) {
        for (; !this.atEnd(); this.moveNext())
            operation(this.item());
        this.moveFirst();
    }
})();

(function () {
    var $ = Number.prototype;
    $.timesRepeat_ = function (operation) {
        for (var i = 0; i < this; i++)
            operation();
    }
})();

(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 FileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
var folderpath = 'c:\\windows\\system32';
var enumerator = new Enumerator(FileSystemObject.getFolder(folderpath).files); // 2,000 files
var files = new Array();
//var n = 1;
var n = 500;
n.timesRepeat_(function () {
    enumerator.do_(function (each) { files.push(each) });
});

var discriminator = function (file) { return /^[aA]/.test(file.name) }
var targets = files.select_(discriminator);

WScript.echo(new Array(
    '適合条件: ' + discriminator.toString(),
    '適合結果: ' + targets.toString()
).join('\n'));

//fileDeletion1();
//fileDeletion2();

function fileDeletion1() {
    try {
        //files.do_(function (file) { file.delete(true) }); //★
    } finally {
        WScript.quit();
    }
}

function fileDeletion2() {
    var paths = targets.collect_(function (file) { return file.path });
    paths.do_(function (path) { FileSystemObject.deleteFile(path) });
    do {
        WScript.sleep(100);
        var files = paths.select_(function (path) { return FileSystemObject.fileExists(path) });
    } while (files.length > 0);
}

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

function Array.prototype.select_(discriminator) {
    var anArray = new Array();
    this.do_(function (each) { if (discriminator(each)) anArray.push(each) });
    return anArray;
}

function Array.prototype.collect_(transformer) {
    var anArray = new Array();
    this.do_(function (each) { anArray.push(transformer(each)) });
    return anArray;
}

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


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

>りや さん 2004年 10月 11日 18時 06分 50秒
> 再現試験をこちら側でもしたいので iriyak at mcn dot ne dot jp
> まで一式お送りいただけますか。

たいした量ではないので、

var FileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
//var folderpath = 'c:\\windows\\system32';
var folderpath = 'c:\\windows\\i386';
var discriminator = function (file) { return /^[aA]/.test(file.name) }

var files = new Enumerator(FileSystemObject.getFolder(folderpath).files).asArray();
for(var k=1;k<200;k++){
var files2 = new Enumerator(FileSystemObject.getFolder(folderpath).files).asArray();
var files = files.concat(files2);
}
var targets = files.select_(discriminator);

WScript.echo(new Array(
    '適合条件: ' + discriminator.toString(),
    '適合結果: ' + targets.toString()
).join('\n'));

//fileDeletion1();
//fileDeletion2();

function fileDeletion1() {
    try {
        //files.do_(function (file) { file.delete(true) }); //★
    } finally {
        WScript.quit();
    }
}

function fileDeletion2() {
    var paths = targets.collect_(function (file) { return file.path });
    paths.do_(function (path) { FileSystemObject.deleteFile(path) });
    do {
        WScript.sleep(100);
        var files = paths.select_(function (path) { return FileSystemObject.fileExists(path) });
    } while (files.length > 0);
}

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

function Array.prototype.select_(discriminator) {
    var anArray = new Array();
    this.do_(function (each) { if (discriminator(each)) anArray.push(each) });
    return anArray;
}

function Array.prototype.collect_(transformer) {
    var anArray = new Array();
    this.do_(function (each) { anArray.push(transformer(each)) });
    return anArray;
}

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


ばんのしゃーによかばんた さん 2004年 10月 12日 13時 08分 25秒

早速、ソートに名を借りた、GetRefのサンプルです。

Set fso=CreateObject("Scripting.FileSystemObject")
Set Folder=fso.GetFolder("c:\windows\system32")
ReDim items(Folder.Files.Count-1)
ReDim keys(Folder.Files.Count-1)
k=0
For Each File In Folder.Files
: items(k)=File.Path
: keys(k)=CDbl(File.DateLastModified)
: k=k+1
Next
Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"

Function compare(x,y)
compare=keys(x)-keys(y)
End Function

Call SC.AddObject("vbfunc",GetRef("compare"),True)
SC.AddCode "" & _
"function VBArraySort(vbarray){" & _
"a=new VBArray(vbarray);" & _
"var b=new Array();" & _
"for(var k=0;k<=a.ubound();k++) b.push(k);" & _
"return(b.sort(compare));" & _
"function compare(x,y){" & _
"return(vbfunc(x,y));" & _
"}" & _
"}"
Set js=SC.Run("VBArraySort",keys)
For Each k In js
WScript.Echo items(k),CDate(keys(k))
Next

ばんのしゃーによかばんた さん 2004年 10月 12日 13時 07分 48秒

>いりや さん 2004年 10月 11日 14時 31分 31秒
>Windows Script File (.wsf) を利用して、VBScript に提供されている関数や手
>続きを export して JScript で使用しているのですが、グローバル実行コンテ

export って何でしょう?
VBScriptの組込み関数や手続きをFunctionやSubでwrapしなくても、
JScriptから呼べるのですか?

>クストにずらずらその名前があらわれるので今後名前が衝突するのを心配してい
>ます。

変数の名前は、FunctionやSubの中に閉じ込められますが、FunctionやSubの名前は、
FunctionやSubの中でexecuteする場合を除いて、グローバルになる。そういう、
FunctionやSubの名前なら、Classで名前を閉じ込められます。

<job>
<script language=jscript>
for(var m in this){
WScript.Echo(m);
}

function props(o){
for(var m in o){
WScript.Echo(m);
}
for(var m in this){
WScript.Echo(m);
}
gm.b();
WScript.Echo(gm.c);
this.gm.b();
o.b();
}
</script>
<script language=vbscript>
Class main
Dim c
sub class_initialize()
c="c!"
end sub
sub b()
msgbox "b!"
End Sub
sub a()
msgbox "a!"
call props(Me)
End Sub
end class
Dim gm
Set gm=new main
gm.a
</script>
</job>

>それで関数・手続きへのポインタをもつ辞書を用意してそれを JScript 側で利
>用したいと思っているのですが、VBScript で関数へのポインタを取得する方法
>はありますでしょうか。

VBScriptで関数へのポインタ、と言うとGetRefですね。
GetRefを使うと、こんなことが出来ます。
こういうことがVBScriptの組込み関数でも出来るとよいのですが。

<job>
<script language=vbscript>
sub x(s)
msgbox s
end sub
Dim z
Set z=GetRef("x")
x("1")
z("2")
z typename(z)
</script>
<script language=jscript>
x('3');
z('4');
for(var m in z){
z(m);
}
</script>
</job>

ラムダ さん 2004年 10月 11日 20時 48分 01秒

はじめまして。
ここをブックマークに登録してからもう5年くらいになりますが、初めてWSHのスクリプトを書こうとしています。(今まではWinbatchEHでしたが、多数のPCで使うものが必要になり、WSHを試そうとしています。)

さて、http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/src/connect.lzhにあったスクリプトに手を加えていますが、わからない部分があります。
ユーザ名を入力するテキストコントロールのところで、
<input type="text" size="20" name="txtUserName" id="txtUserName">
ここに、value=WshNetwork.UserNameといった具合に、現在のユーザ名をデフォルト表示出来ないでしょうか?

いりや さん 2004年 10月 11日 18時 06分 50秒

| n=1 (2K) 2.1sec
| n=500 (1M) 42m16.6sec=2536.6sec
| 500倍の約2.5倍

再現試験をこちら側でもしたいので iriyak at mcn dot ne dot jp
まで一式お送りいただけますか。

論点、主張、論拠、コードの一部、測定結果の数字、がまだ私の頭の中で
一本つながらないので、コードの何を指して何を主張されたいのかわから
ないのです。その理由の一つが比べるコードの全容を共有していないこと
があるのだろうと思いそれでお願いしています。

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

>いりや さん 2004年 10月 11日 02時 21分 54秒
>Enumerator.prototype.asArray() は、Array を生成して ICollection インター
>フェイスを持つコレクションの要素をすべて数え上えあげてそれを値にセットし
>て返します。ですので指定個数の Array の作成のためにそれ以外の Array の作
>成をなくすのならば以下のようにしてはいかがでしょうか。これで files
>(Array) を準備するための費用は Array.prototype.push() の費用が要素数で一
>定であると仮定すると O(n) になると思います。

問題は、files(Array) を準備するための費用、ではないので、
同じ結果になると思いましたが、

n=1 (2K) 2.1sec
n=500 (1M) 42m16.6sec=2536.6sec
500倍の約2.5倍

タスクマネジャで見てますと、ページフォルトの様子が、
CScriptとえExplorerがメモリを取り合っているのかのように交互に変動します。

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

>つちや さん 2004年 10月 10日 21時 58分 37秒
>保存される方を安定したソートというわけですが、高速ソートの中ではマージソートがそうですね。
>で、さっそくVBScriptでマージソートを。

2.5秒。さすがですね。

しかし、同値キーの並びが入力順の逆順になりました。まさか、逆順で安定するってこと?

まぁ、第二ソートキーに入力順を使えば、不安定?なソートでも安定化できますが。

ばんのしゃーによかばんた さん 2004年 10月 11日 15時 05分 26秒

Dictionaryを使わないで、配列だけのほうが、速いですね。
その分、JScript側の処理が増えますが。

2.5秒。
――――――――――――――――――――――――――――――――――――――
Set fso=CreateObject("Scripting.FileSystemObject")
Set Folder=fso.GetFolder("c:\windows\system32")
ReDim items(Folder.Files.Count-1)
ReDim keys(Folder.Files.Count-1)
k=0
For Each File In Folder.Files
: items(k)=File.Path
: keys(k)=CDbl(File.DateLastModified)
: k=k+1
Next
Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"
SC.AddCode "" & _
"function VBArraySort(vbarray){" & _
"a=new VBArray(vbarray);" & _
"var b=new Array();" & _
"for(var k=0;k<=a.ubound();k++) b.push(k);" & _
"return(b.sort(compare));" & _
"function compare(x,y){" & _
"return(a.getItem(x)-a.getItem(y));" & _
"}" & _
"}"

Set js=SC.Run("VBArraySort",keys)
For Each k In js
WScript.Echo items(k),CDate(keys(k))
Next
――――――――――――――――――――――――――――――――――――――

比較関数はVBScript側で作って、JScriptからglobal object、Me経由で参照する。
なんてことも。

2.7秒。
――――――――――――――――――――――――――――――――――――――
Set fso=CreateObject("Scripting.FileSystemObject")
Set Folder=fso.GetFolder("c:\windows\system32")
ReDim items(Folder.Files.Count-1)
ReDim keys(Folder.Files.Count-1)
k=0
For Each File In Folder.Files
: items(k)=File.Path
: keys(k)=CDbl(File.DateLastModified)
: k=k+1
Next
Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"

Function compare(x,y)
compare=keys(x)-keys(y)
End Function

Call SC.AddObject("Me",Me,True)
SC.AddCode "" & _
"function VBArraySort(vbarray){" & _
"a=new VBArray(vbarray);" & _
"var b=new Array();" & _
"for(var k=0;k<=a.ubound();k++) b.push(k);" & _
"return(b.sort(compare));" & _
"function compare(x,y){" & _
"return(Me.compare(x,y));" & _
"}" & _
"}"
Set js=SC.Run("VBArraySort",keys)
For Each k In js
WScript.Echo items(k),CDate(keys(k))
Next
――――――――――――――――――――――――――――――――――――――
VBScriptでも結構、global objectが使えますね。:-)

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

いりやです。

VBScript で質問です。

Windows Script File (.wsf) を利用して、VBScript に提供されている関数や手
続きを export して JScript で使用しているのですが、グローバル実行コンテ
クストにずらずらその名前があらわれるので今後名前が衝突するのを心配してい
ます。

それで関数・手続きへのポインタをもつ辞書を用意してそれを JScript 側で利
用したいと思っているのですが、VBScript で関数へのポインタを取得する方法
はありますでしょうか。

ScriptControl や Eval() を使用して文字列表現のプログラムを遅延評価させる
ことが可能なのですが、Eval() では都度評価する費用がもったいない。ScriptControl
で定義だけ先におこなっておいて呼び出しだけを都度評価する方式が落としどこ
ろとは思っているのですが、ScriptControl に依存しないで VBScript の言語仕
様で提供されている機能があればそれを使えれば、とおもい、質問しています。

Return