ケタモラ さん 2005年 09月 07日 08時 54分 19秒

>管理人むたぐち さん

お返事ありがとうございます。
ShowOpen()で代用というのは具体的にはどのように記述すればよいのでしょうか?
お手数ですが宜しくお願い致します。

wsh使ってますかスレ967 さん 2005年 09月 06日 22時 55分 41秒

こちらのアップローダー使わせていただこうと思いましたが、
アップロードするとWikiのタイトルが「アップローダー へはアップロード・削除はできません」となりzipファイルのアップができませんでした。
操作は「スクリプトアップローダー」の添付ファイルの「参照」ボタンでファイル選んで「アップロード」ボタンでいいんですよね?

管理人むたぐち さん 2005年 09月 06日 20時 35分 42秒

To: ケタモラ さん

> として」「名前をつけて保存」ダイアログを開くことができません。

UserAccounts.CommonDialogにはShowSaveメソッドがありません。
ShowOpenメソッドで代用してください。

魔界の仮面弁士 さん 2005年 09月 06日 15時 30分 30秒

》うに さん (null) 2005年 09月 06日 14時 51分 58秒
> nowかdateで時間をとって、それ以降のログを
ログの出力をどのように書いているのか、にもよりますが、
さしあたり、SWbemDateTime.SetVarDateメソッドで対処できませんか?

> 仮面弁士様の
微妙……。(^-^;
http://yaplog.jp/orator/archive/20

魔界の仮面弁士 さん 2005年 09月 06日 15時 24分 10秒

》うに さん (null) 2005年 09月 06日 14時 51分 58秒
> この540というのは何なのでしょうか?
『タイムゾーン』ですよ。
http://dictionary.rbbtoday.com/Details/term2492.html

日本は「+9時間」ですから、分換算で+540ですね。


以下、WMI SDKより引用:
| Plus sign (+) or minus sign (-) to indicate a positive or
| negative offset from Universal Time Coordinates (UTC). 

| Three-digit offset indicating the number of minutes that
| the originating time zone deviates from UTC. For WMI,
| it is encouraged, but not required, to convert times
| to GMT (a UTC offset of zero).

うに さん (null) 2005年 09月 06日 14時 51分 58秒
URL:null

>魔界の仮面弁士 さん 2004年 02月 12日 21時 03分 21秒
>》SARU さん
>書き方は幾つかありますが、例えば、

>'2004-02-10 09:00:00:00000'
>'20040210090000.000000+***'
>'20040210090000.000000+540'

>などの形式が有効です。


たびたび恐れ入ります。
今度はログファイル(アプリケーションログ)です。
何とかいろいろ調べてログの取得の仕方はわかりました。
しかし、時間の指定がわかりませんでした。(日付は指定できる)
過去ログを調べますと仮面弁士様の書き込みがあったのですが、
上の2つはだめで、3つ目の書き方でようやくOKとなりました。
ググって見ても時間まで指定する人はいないみたいです・・・
仮面弁士様の参考URLのMSDNも見てみたのですが???
よくわかりませんでした・・・
この540というのは何なのでしょうか?
試しに100とか000にしたらNGでした。

スクリプト開始→イベント発生→ログ確認
としたいのではじめで、nowかdateで時間をとって、それ以降のログを確認しようと思ったのですが、
つまずいています。

ima=Now
iyear=year(ima)
imonth=month(ima)
iday=day(ima)
ihour=hour(ima)
iminute=minute(ima)
isecond=second(ima)
とやってみたのですが、残念ながら一桁の月や時間が06(6になってしまう)のようになってくれずだめでした。
今考えているのはNowで取得したモノ(2005/09/06 00:00:00)をMid関数で年月日時間分秒の部分を取り出すしかないのか?
と考えているのですが、もっといい方法はないのでしょうか???

魔界の仮面弁士 さん 2005年 09月 06日 09時 55分 39秒

》ばんのしゃーによかばんた さん 2005年 09月 05日 16時 51分 48秒
> "Shell.Application"でブリーフケースのFolderItemを取得して、
> InvokeVerbで「すべて更新」をキックすると、ダイアログが出ます。

UI操作を伴ったりするので、タスク実行は難しいでしょうね。

一応、RECONCILEF_MAYBOTHERUSER を指定せずに、IReconcilableObjectインターフェイスの Reconcile メソッドを呼び出せば、対処できそうな気もするのですが(未確認)……残念ながら、これはディスパッチではないみたいですね。

nimo さん 2005年 09月 06日 08時 10分 48秒

> ばんのしゃーによかばんた さん 2005年 09月 05日 16時 51分 48秒

ありがとうございます。
私自身は、全くスクリプトを作ったことがなく、知り合いに頼んだら出来ないよって
言われたので質問させていただきました。
いただいたヒントを元に作ってもらうことにします。

私も、これを機会に勉強させていただきます。

ケタモラ さん 2005年 09月 05日 23時 55分 57秒

Perlからダイアログボックスを開きたいのですが、

use Win32::OLE;

$dialog = Win32::OLE->new("UserAccounts.CommonDialog");

$dialog->Show.Open();

で「ファイルを開く」ダイアログを開けても

$dialog->ShowSave();

として」「名前をつけて保存」ダイアログを開くことができません。
どなたかご教授お願い致します。

うに さん (null) 2005年 09月 05日 18時 39分 25秒
URL:null

>うに (null) 2005年 09月 02日 11時 26分 52秒

>うに (null) 2005年 09月 02日 16時 31分 37秒

実は何かを勘違いしていたようで、
同じスクリプト内から呼んだhttpcallは
変数名を変えて別プロシジャを作って呼んでも
(例えばhttpcall2とか作って)
全く同じ結果を返してしまうようです。

そこで、httpcall.vbsを別ファイルで用意して、
cmd /c httpcall.vbs
で呼んでみると、うまくいきました。

デモなんだかいまいちしっくりこないです・・・

streamやらohttpやらをNothingしても残ってしまうと言うことは、
もはやWindows特有の原因なのでしょうか・・・

ばんのしゃーによかばんた さん 2005年 09月 05日 16時 52分 07秒

そういう例です。

>ばんのしゃーによかばんた さん 2005年 09月 01日 19時 39分 56秒
>一方、コマンドプロンプトのMOVEコマンドやFSOのMoveFolderの場合は、
>ディレクトリエントリをひとつ移すだけのようで、1トランザクションです。
>これがGUIでも、簡単に使えるとよいのですが。。。

ドラッグ&ドロップ操作では、無理そうですが、
コピー&ペースト擬似は、なんとか出来そうです。

移動元でコピー、移動先で「リンク」から起動します。
移動先に置いて、ドラッグ&ドロップしてもよいのですが、一般的じゃないですね。

MoveHere.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Const FOF_RENAMEONCOLLISION=&H8
Const FOF_ALLOWUNDO=&H40
Const ssfBITBUCKET=10'shell:RecycleBinFolder::{645FF040-5081-101B-9F08-00AA002F954E}
Dim fso
Dim Shell
Dim ie
Dim Folder
Dim FolderItem
Dim Verb
Dim arg
Dim args():ReDim args(WScript.Arguments.Count-1)
Dim k

Set fso=CreateObject("Scripting.FileSystemObject")
Set Shell=CreateObject("Shell.Application")
For k=0 To 9
 For Each ie In Shell.Windows()
  If ie.Busy Then
  ElseIf ie.ReadyState<>4 Then
  ElseIf InStr(TypeName(ie.Document),"IShellFolderViewDual")<>1 Then
  ElseIf LCase(Mid(ie.FullName,InStrRev(ie.FullName,"\")))="\explorer.exe" Then
   Exit For
  End If
 Next
 If Not IsEmpty(ie) Then Exit For
 If k=0 Then CreateObject("WScript.Shell").Run "explorer.exe",0,True
 WScript.Sleep 100
Next
If IsEmpty(ie) Then WScript.Echo "Failed" : WScript.Quit
If Not IsEmpty(ie) Then Set Shell=ie.Document.Application

If WScript.Arguments.Count=0 Then
 If Mid(WScript.FullName,InStrRev(WScript.FullName,"\")-2,2)<>"32" Then
  WScript.Echo "Arguments Missing."
  WScript.Quit
 End If
 Set Folder=Shell.NameSpace(Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\")))
 Set FolderItem=Folder.Items.Item(WScript.ScriptName)
 For Each Verb In FolderItem.Verbs
  If Verb.Name="貼り付け(&P)" Then Exit For
 Next
 If Not IsEmpty(Verb) Then
  Verb.DoIt
 Else
  WScript.Echo "Arguments Missing."
 End If
 WScript.Quit
Else
 Set Folder=Shell.Windows.Item.Document.Folder
 For k=0 To WScript.Arguments.Count-1
  args(k)=WScript.Arguments(k)
 Next
 If MsgBox(Join(args,vbLf)&vbLf&_
  "To"&vbLf&Folder.Items.Item.Path,_
  vbOkCancel,"Move ?")=vbCancel Then WScript.Quit
 For Each arg In WScript.Arguments
  Call MoveHere(Folder,arg)
 Next
End If

Sub MoveHere(Folder,Path)
Dim Name
Dim dFolderItem
Dim sFolderItem

Name=Mid(arg,InStrRev(Path,"\")+1)
Set sFolderItem=Shell.NameSpace(Left(arg,InStrRev(Path,"\"))).ParseName(Name)
Set dFolderItem=ParseName(Folder,Name)
If Not dFolderItem Is Nothing Then
 Select Case MsgBox("Move"&vbTab&sFolderItem.ModifyDate&vbTab&_
     FormatNumber(sFolderItem.Size,0)&vbTab&sFolderItem.Path&vbLf&_
     "To"&vbTab&dFolderItem.ModifyDate&vbTab&_
     FormatNumber(dFolderItem.Size,0)&vbTab&dFolderItem.Path&vbLf&_
     "Reply"&_
     vbTab&"Yes"&vbTab&"Sending the former file to Recycle Bin."&vbLf&_
     vbTab&"No"&vbTab&"Prefixing 'copy (n)' to the new file."&vbLf&_
     vbTab&"Cancel"&vbTab&"Not move.",_
     vbYesNoCancel,"Name Collision - "&Name)
 Case vbYes
  Shell.NameSpace(ssfBITBUCKET).MoveHere dFolderItem,FOF_ALLOWUNDO
  Do
   WScript.Sleep 100
   Set dFolderItem=ParseName(Folder,Name)
   If dFolderItem Is Nothing Then Exit Do
  Loop
  WScript.Sleep 200
  MoveFile sFolderItem.Path,Folder.Self.Path
 Case vbNo
  MoveFile sFolderItem.Path,Folder.Self.Path
 End Select
Else
 MoveFile sFolderItem.Path,Folder.Self.Path
End If
End Sub

Function ParseName(Folder,Name) 'For Windows98
Set ParseName=Nothing
On Error Resume Next
Set ParseName=Folder.ParseName(Name)
End Function

Sub MoveFile(Path,dst)
Dim File
Dim k
Dim FileName
Dim ExtensionName

If fso.FileExists(Path) Then
 Set File=fso.GetFile(Path)
Else
 Set File=fso.GetFolder(Path)
End If

For k=1 To 999
 If k=1 Then
  FileName=File.Name
  Call Move(File,fso.BuildPath(dst,FileName))
 Else
  FileName=fso.GetBaseName(File.Name) & k
'  FileName=fso.GetBaseName(File.Name) & " " & k
  ExtensionName=fso.GetExtensionName(File.Name)
  If ExtensionName<>"" Then FileName=FileName & "." & ExtensionName
  Call Move(File,fso.BuildPath(dst,FileName))
 End If
 Select Case Err.Number
 Case 0
  If k>1 Then MsgBox FileName&vbLf&"To"&vbLf&dst,vbOkCancel+vbInformation,"Moved and renamed."
  Exit For
 Case 58
  If MsgBox(Err.Number&" "&Err.Description&vbLf&dst&vbLf&FileName,_
   vbOkCancel+vbQuestion,"Rename on collision ?")=vbCancel Then WScript.Quit
 Case 70
  MsgBox Err.Number&" "&Err.Description&vbLf&dst&vbLf&FileName,vbOkOnly+vbCritical,"Failed. Maybe currently in use."
  WScript.Quit
 Case Else
  MsgBox Err.Number&" "&Err.Description&vbLf&dst&vbLf&FileName,vbOkOnly+vbCritical,"Failed. Unexpected error."
  WScript.Quit
 End Select
Next
End Sub

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


ばんのしゃーによかばんた さん 2005年 09月 05日 16時 51分 48秒

>nimo さん 2005年 09月 04日 12時 45分 19秒
>windowsのアクセサリのブリーフケースを自動で更新できるようなスクリプトって
>作ることができますか?
>タスクスケジューラーに登録したいのですが。

"Shell.Application"でブリーフケースのFolderItemを取得して、
InvokeVerbで「すべて更新」をキックすると、ダイアログが出ます。
なので、これは、タスクスケジューラ向きではありません。

ブリーフケースのFolderを取得して、
FolderItemのGetDetailsOfで、パスと状態を取得して、
FileSystemObjectでコピーすれば、ダイアログが出ないでしょう。

ただし、"Shell.Application"でブリーフケースのFolderを取得したのでは、
うまく行かないようです。
>管理人むたぐち さん 2001年 01月 18日 01時 49分 06秒

なので、IEからブリーフケースへNavigateして、ie.Document.Folderを
使えばよいでしょう。※

ただ、両方を更新したケースの判定は難しそうです。
ブリーフケース データベース(半角)の構造が分かれば出来るやも。


Set Shell=CreateObject("Shell.Application")
でなく、フォルダを開いているエクスプローラから、
Set Shell=ie.Document.Application
で取り直してもよいでしょう。そういう例を。。。



ばんのしゃーによかばんた さん 2005年 09月 05日 16時 51分 34秒

>oo さん 2005年 09月 03日 22時 37分 10秒
>出来たとしても、「会話」じゃないんで、sendkeysと出来るレベルは変わらないというか、
>タイミングが調整できる分、sendkeysの方がよいと思います。

会話じゃないので、タイミング依存がなくてよい、と思ったのですが。。。

>ところで、質問者の mikinyan さん、rsh.exe を使う方法は駄目なんですか?

|>mikinyan さん (mikinyan@tigers-net.com) 2005年 08月 22日 18時 46分 14秒
|>oo さん 2005年 08月 26日 17時 10分 02秒

この時間経過から見て、ちょっと前に一番問題と言ってた、質問ポイ捨て、
ではないでしょうか。あっちこっちに質問を書き込んで、どこかで解決したら、
もう他を見ない。何処に書いたかも忘れてる。そういうのではないかな。

ま、そういうもんです。それで、以下の過去記事を思い出しました。

|>私はもう他の掲示板に行っていますので、ここで質問をすることもないでしょうが、
|>もし、初心者らしき人の書きこみを見たら、このレスを思い出して見てください。
|>人に親切にして決して嫌な気持ちにはなりませんから。

これを見て、ご当人は、回答の経験があまりないのかなぁ、と思いました。


Nomu さん 2005年 09月 05日 12時 10分 35秒

セキュリティ権限周りの設定が必要かもしれませんし、
OSが記述されていないので、使用可能かわかりませんが、
MMCが使用可能な環境であれば(MMCの定義、使用方法は下記URLを参照)
http://www.atmarkit.co.jp/fwin2k/operation/mmccons/mmccons_01.html
で、イベントログを覗くアプリケーションをMicrosoft純正で作成し、
それをRunするのがシンプルでよいかと思われます。

他のマシンのログイベントをMMCで覗く処理は作成していませんが、
他のマシンのサービスを覗く処理は作成したことがありますので、
同じMMCの枠組みで可能ではないかと思われます。

なっちゃん さん 2005年 09月 05日 09時 31分 25秒

お世話になります、よろしくお願いします。

Aというドメインに属している端末からBというドメインに属している端末のイベントログを表示させたいのですが、方法が思いつきません。
データを何件かづつ取得するのではなく、ローカルのイベントビューアを開いたのと同様の形式にしたい、というのが用件です。
同じAというドメインの端末のイベントビューアを開くのは
Set wshShell = CreateObject("WScript.Shell")
ans = wshShell.Run("eventvwr.exe " & strHost, 0, true)
と実行していました。

Set Locator = CreateObject("WbemScripting.SWbemLocator")
Service = Locator.ConnectServer( "コンピュータ名称", "ユーザ","パスワード")
Set Prc = Service.Get("Win32_NTLogEvent")
とすると、
「ローカルのイベントビューアを開いたのと同様の形式」
になりません。
どなたがよい方法をご存知でしたらご教授ください。

nimo さん 2005年 09月 04日 12時 45分 19秒

windowsのアクセサリのブリーフケースを自動で更新できるようなスクリプトって
作ることができますか?
タスクスケジューラーに登録したいのですが。

ブリーフケースを開いて、Alt+B、Aですべて更新し、更新確認のダイアログを
表示させない。(表示させてもいいですけど)
これをスクリプトで記述できるものでしょうか?

oo さん 2005年 09月 03日 22時 37分 10秒

>telnet -l user/password -f log.txt host <stdin.txt
>
>はどうでしょう。 サーバによるかも。

サーバーによるようですね。
出来たとしても、「会話」じゃないんで、sendkeysと出来るレベルは変わらないというか、タイミングが調整できる分、sendkeysの方がよいと思います。

ところで、質問者の mikinyan さん、rsh.exe を使う方法は駄目なんですか?
ふと思うと、MSがTeratermを買うとmikinyanのように喜ぶ人が多いかも。でもオープンソースのままにしてもらわないと改造している人は困るか。

ばんのしゃーによかばんた さん 2005年 09月 03日 17時 18分 21秒

>ばんのしゃーによかばんた さん 2005年 07月 27日 16時 30分 40秒
>2000のヘルプには、「Windows 2000 コマンド リファレンス」があったのですが、
>XPのヘルプに、こういうのが見当たらないのですが、あります?

ありましたが、探し方、辿り方がとても難しいですね。簡単に見付かりますか?

実体は、
C:\WINDOWS\Help\ntcmds.chm
なのですが、これを開いても、
「このヘルプ ファイルのトピックは、ヘルプとサポート センターに統合されています。
これらのトピックを表示するには、[スタート] ボタンをクリックし、[ヘルプとサポート] をクリックします。」
と出るだけで、中身を見せてくれません。

C:\WINDOWS\Help\telnet.chm
は中身が見えるので、見ていたら、
「コマンド ライン リファレンス」へのリンクがありました。
ms-its:C:\WINDOWS\Help\ntcmds.chm::/ntcmds.htm

しかし、このショートカットを作って、それをIEで開いても、
エラーになってちゃんと表示されません。※
例の方法で、IEのカレントディレクトリをC:\WINDOWS\Helpにしてやると、
ちゃんと見れました。

「ヘルプとサポート」からは、
ATコマンドのリファレンスに、検索かインデックスで辿り着いて、
その関連項目から、見れました。
一度見付けたら、「お気に入り」に入れとかないと、また探すのは大変です。

疲れたー。

なんで、こんなに使い難くしたんでしょうね。まったく。
ヘルプを使い難くするなんて、信じられない。


これは、ショートカットを
hh.exe ms-its:C:\WINDOWS\Help\ntcmds.chm::/ntcmds.htm
とすれば、よいようです。


ばんのしゃーによかばんた さん 2005年 09月 03日 17時 18分 00秒

>oo さん 2005年 09月 01日 22時 48分 11秒
>Set oExec = WshShell.Exec("telnet.exe ホスト名")
>-1 を表示して終わってしまいます。ftpとは違う。

標準出力をリダイレクトすると駄目みたいですね。
どうも変な作りをしてるようです。

なら、標準入力だけリダイレクトして、標準出力は垂れ流しにして、
ログをファイルに採る。というのはどうでしょう。

telnet -f log.txt host <stdin.txt

>telnet は駄目見たいっす。(後述)
>普通、ユーザー名とパスワードを入れるので会話は必須

上の標準入力からユーザー名とパスワードは入りませんか?
もし駄目なら、

telnet -l user/password -f log.txt host <stdin.txt

はどうでしょう。 サーバによるかも。


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

>でで さん 2005年 08月 21日 22時 58分 23秒
>windowsからlinuxサーバへログを収集するしくみを検討しています。

unixのログと言えば、syslog daemon、
Windows用のsyslog daemonを探せばあるかも。
過去記事をsyslogで検索すると、こんなのがありました。

>管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 08月 01日 20時 00分 28秒
>To: 土屋 さん
>> http://www.netal.com/
>> で、System Scripting Runtimeというフリーのコンポーネントを見つけました。
>> 主にネットワーク関係で、PingやSendNetMessageなどのメソッドをWSHから使えます。
>このサイトにある、System Script Host というのが気になります。
>また、各種イベント(Timer, IPC, Event Log, Performance Data, Services,
>File System, SNMP Traps, Syslog, Registry)をトラップできるそうで、
>WSHの苦手とする「常駐」を可能にしています。

トラップができるなら、ひょっとしてsyslog書き出しも出来るのではないかな。


うに さん (null) 2005年 09月 02日 18時 58分 35秒
URL:null

>ばんのしゃーによかばんた さん 2005年 09月 02日 17時 14分 32秒

>DIR /B /AD|FIND /C /V ""

>なら、よさそうです。

>FIND /C /V ""
>は、汎用に、
>wc -l
>の代わりに使えそうです。


ありがとうございます。
今後使わせていただきます!

>pwdと比べるなら、CDでしょう。pwdよりCDのほうがキー入力も簡単です。

ああああ!!
unixではCDだとホームに戻るだけなので、それと同じだと思いこんでいました。winのCDはちがうのですね。

いつもありがとうございます。

ぷろぐぅ さん 2005年 09月 02日 17時 58分 47秒

>>ぷろぐぅ さん 2005年 08月 31日 18時 28分 37秒
>>そこで質問なのですが、印刷ダイアログの制御(「ファイルへ出力」を利用したい)する場合簡単な記述方法はありますか?
>>WordVBAであれば、PrintOutというものが存在し出力後のファイル名などまで指定する事ができるのですが…

>きっと、ないでしょう。

>こういう場合の定石は、毎回プリンタ設定を変更するのではなく、
>別にプリンタ定義を作っておいて、デフォルトプリンタを切り替えて使う。
>なんて、勝手に決めてますけど。

>プリンタをFile:ポートに割り当てると、毎回ファイル名の問い合わせが出て
>面倒なので、固定のファイルに出力し、出力後に移動すればよいでしょう。
>以下の記事を参照。
>>ばんのしゃーによかばんた さん 2004年 05月 16日 21時 42分 12秒

やはりないのですね。私も色々頑張ったのですがダメでした…
デフォルトプリンタを切り替えて使う方向でやってみます。
返答ありがとうございました。

ばんのしゃーによかばんた さん 2005年 09月 02日 17時 14分 46秒

>ぷろぐぅ さん 2005年 08月 31日 18時 28分 37秒
>そこで質問なのですが、印刷ダイアログの制御(「ファイルへ出力」を利用したい)する場合簡単な記述方法はありますか?
>WordVBAであれば、PrintOutというものが存在し出力後のファイル名などまで指定する事ができるのですが…

きっと、ないでしょう。

こういう場合の定石は、毎回プリンタ設定を変更するのではなく、
別にプリンタ定義を作っておいて、デフォルトプリンタを切り替えて使う。
なんて、勝手に決めてますけど。

プリンタをFile:ポートに割り当てると、毎回ファイル名の問い合わせが出て
面倒なので、固定のファイルに出力し、出力後に移動すればよいでしょう。
以下の記事を参照。
>ばんのしゃーによかばんた さん 2004年 05月 16日 21時 42分 12秒


ばんのしゃーによかばんた さん 2005年 09月 02日 17時 14分 32秒

>うに さん (null) 2005年 08月 31日 15時 08分 31秒
>フォルダ数を調べたい
>ある任意のフォルダ内にいくつのフォルダがあるかを調べたいのですが・・・
>UNIXシェルではls / wc -lで、調べられます。



ls -AlF|fgrep "/"|wc -l

ls -AlF|fgrep -c "/"

>ばんのしゃーによかばんた さん 2005年 09月 01日 19時 39分 38秒
>DIR|FIND /C "<DIR>"

だと、.と..が余計に入りますね。

DIR|FIND /V "."|FIND /C "<DIR>"

は、ちょっとくどい。不正確だし。

DIR /B /AD|FIND /C /V ""

なら、よさそうです。

FIND /C /V ""
は、汎用に、
wc -l
の代わりに使えそうです。

>うに さん (null) 2005年 08月 22日 14時 12分 17秒
>取得したいのは、実行しているvbsと同ディレクトリにあるwarファイルを使いたかったのです。

それなら、「pwd」ではなく、
dirname $0
ですね。
$0      Substitutes the name of the file from which command input is being read.

>うに さん (null) 2005年 08月 18日 12時 05分 35秒
>これでpwdと同じ機能を実現できました。
>(単にpwdだけで良いのと比べるとかなりややこしいですね・・・)

pwdと比べるなら、CDでしょう。pwdよりCDのほうがキー入力も簡単です。

>うに さん (null) 2005年 08月 17日 20時 04分 06秒
>unixのシェルのように順番で実行したいのですが・・・

それならバッチファイルでしょう。


うに さん (null) 2005年 09月 02日 16時 31分 37秒
URL:null

>もりもり様

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

でも、だめみたいで、ショックです・・・

まずset stream=nothing
とhttpcallのプロシジャの先頭に入れてみたのですが
あっさり、同じ出力がでてしまいました。
次にoHttpについてもやってみたのですが、結果は同じでした。

Streamが原因かもと思ったいきさつは、
httpcallをコピーしてもう一つhttpcall2を作り、
その中でStreamのみStream2と変数名を変えて
2回目の呼び出しにはそちらを使うようにしたのです。
するとエラーがでたので、Streamに違いない!
と思ったのですが、外れてしまったようです・・・

レスありがとうございました。

もりもり さん 2005年 09月 02日 15時 07分 20秒

>うにさん

えーと、オブジェクトの場合は、変数とは違って「初期化」というよりも「解放」になるんではなかったでしたっけ?
Set Stream = Nothing
これでいけないでしょうか?

↑にあるサイト内検索で、”解放”、”Nothing”、”オブジェクト”等でググると色々出てきます。

うに さん (null) 2005年 09月 02日 14時 08分 04秒
URL:null

html取得プロシージャの中で
変数Streamが初期化されていないのが原因のようです。
・・・

オブジェクト?が代入された変数の初期化ってどうやるのでしょう・・・

試しにStream=0とかやったら怒られてしまいました・・・

うに さん (null) 2005年 09月 02日 11時 26分 52秒
URL:null

いつもお世話になっています。
困ったことがわかりました。
いろいろ教えていただいてhtmlを取得するスクリプトを元にして
作っていたのですが、意図した動きをしていないことがわかりました。

【例】
'アパッチをスタートさせてアクセス
o1=out("C:\Program Files\Apache Group\Apache2\bin\apache -k restart")
WScript.Echo(o1)
i= HttpCall("http://localhost")
msgbox i
'アパッチをストップさせてアクセス
o2=out("C:\Program Files\Apache Group\Apache2\bin\apache -k stop")
WScript.Echo(o2)
k= HttpCall("http://localhost")
msgbox k
'**********************************
'* Htmlソース取得プロシージャ  *
'**********************************
Function HttpCall(url)
     Const adTypeBinary =1,adTypeText=2
     Set oHttp = CreateObject("MSXML2.XMLHTTP")
     oHttp.Open "GET",url,False
     oHttp.Send
     Set Stream = WScript.CreateObject("Adodb.Stream")
     Stream.Type=adTypeBinary  'ストリームをバイナリモードにする
     Stream.Open
     Stream.Write oHttp.responseBody
     Stream.Position = 0    'ストリームの先頭に戻る
     Stream.Type=adTypeText   'ストリームをテキストモードにする
     Stream.Charset="Shift_JIS"
     HttpCall=Stream.ReadText()
     'msgbox HttpCall
end Function

'****************************************
'*コマンド実行・標準出力取得プロシージャ*
'****************************************
Function out(com)
     Set objShell = WScript.CreateObject("WScript.Shell")
     Set objExec = objShell.Exec(com)
          out = objExec.StdOut.ReadAll
          out = out + objExec.StdErr.ReadAll
End Function



例えば、↑のようにアパッチをスタートしているとアクセスできるが、止めるとアクセスできない、というようなテストをしたい場合です。
(実際にはアクセスできないとエラーになってしまうのでこのままでは使えませんが)

やってみるとわかるのですが、アパッチを止めた後のhtpcallで
アクセスできないはずなのに、実際には一度目と全く同じ結果を返します。
ここで、2回目のURLを少し変えるとエラーとなってくれます。
また、これを少し変えて、
スタート→アクセス(1)→ストップ→httpdocの変更→スタート→アクセス(2)
としてみると(1)と全く同じ結果が(2)にでます。
この際ぺつのスクリプトからアクセスすると更新された内容がでてきます。
結論として、同じスクリプト内でhtmlを取得した場合に一度呼んだURLと同じURLを呼ぶと1度目と同じ内容が返る、
ということのようです。
キャッシュ?が残ってしまうというイメージでしょうか・・?
このキャッシュ?のようなモノをクリアする方法はないのでしょうか?

わかりにくい質問かもしれませんが、是非ともよろしくお願いいたします。

うに さん (null) 2005年 09月 02日 09時 34分 04秒
URL:null

>Nomu さん 2005年 09月 01日 18時 27分 46秒

教えていただいた方法も試してみました。

SubFoldersプロパティというのがあるのですね。

’***任意のディレクトリのカウント
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("調べたいディレクトリ")
WScript.Echo( CStr(objFolder.SubFolders.Count) )

countプロパティもいろいろ使えそうですね。
ほんとにたくさんのメソッド、プロパティがあるのですね。
ヘルプを眺めているだけで結構楽しめますね。

いつもありがとうございます。

うに さん (null) 2005年 09月 02日 09時 17分 48秒
URL:null

>ばんのしゃーによかばんた さん 2005年 09月 01日 19時 39分 38秒


>>うに さん (null) 2005年 08月 31日 15時 08分 31秒
>>フォルダ数を調べたい
>>UNIXシェルではls / wc -lで、調べられます。
>>cmdでdirを実行して、textファイルとして書き出して、一行ずつ読んで、"<dir>"をInstrする・・・
>>という方法を思いついたのですがもっとスマートにできないものでしょうか


>DIR|FIND /C "<DIR>"


おおおおおおお!!!
すごい!

こんなことができたのですね・・・

すごく無駄なことをしてしまいました・・・

ありがとうございました

うに さん (null) 2005年 09月 02日 09時 11分 04秒
URL:null

> Nomu さん 2005/09/01 18:27

すみません。コメントが全然足りないですね・・・

えっと、前の質問で書いたとおり
まずstr1が”dir”をcmd実行した標準出力の結果で、
str2が”<DIR>”という文字列を意図しています。

任意のディレクトリにあるディレクトリ個数だけ、を調べたかったのでこうしてみました。

実際には
"."と”..”も<DIR>となってしまっているので、
2を引いています。

ご丁寧にありがとうございます。

oo さん 2005年 09月 01日 22時 48分 11秒

>>oo さん 2005年 08月 26日 17時 10分 02秒
>>mikinyan さん:
>
>そんなの過去記事にあるだろう、と思ったらありませんね。
>
>telnetも、所詮は、標準入力を読んで、標準出力に書き出してるだけ、
>なのではないでしょうか。

telnet は駄目見たいっす。(後述)

>もし、そうなら、
>
>会話が必要でなければ、入力をリダイレクションで与えれば済むし、
>telnet .... <file1 >file2

普通、ユーザー名とパスワードを入れるので会話は必須。

>もし、会話が必要なら、CreateObject("WScript.Shell").Execを使えば、
>簡単な会話処理ぐらいは出来るのではないでしょうか。※

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("telnet.exe ホスト名")
WScript.Echo oExec.StdOut.AtEndOfStream
Do While oExec.Status = 0
   WScript.Sleep 100
Loop

-1 を表示して終わってしまいます。ftpとは違う。
何か手があるでしょうか?

ばんのしゃーによかばんた さん 2005年 09月 01日 19時 41分 13秒

>ばんのしゃーによかばんた さん 2005年 08月 28日 14時 49分 17秒
>例えば、Extract.exeで、標準出力を見て、入力を与えようとしたら、
>これがバッファリングされていて、待てど暮らせど取れないんです。

こういう場合、wShell.Exec()を使う代わりに、
StdIn.Writeの代わりに、コンソール画面に貼り付ける。
StdOut.Readの代わりに、コンソール画面を全選択/コピーして、
前のイメージと比較して増分を取り出す(※)。
というExec擬似の構想をずっと持っているのですが、
※の部分が面倒臭そうなので、手付かず。


ばんのしゃーによかばんた さん 2005年 09月 01日 19時 40分 45秒

最近は、ScriptControlの使えない環境など、あまりないと思いますが、
もしも使えないとき、ScriptControlの代替方法です。

Set ie=CreateObject("InternetExplorer.Application")
'ie.Visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 100
Loop
ie.Document.parentWindow.execScript "function hoge(){return 'ほげ';}"
MsgBox ie.Document.parentWindow.hoge()
Set a=ie.Document.parentWindow.eval("new Array()")
a.push 2
a.push 3
a.push 1
MsgBox a.sort().toString()
MsgBox ie.Document.parentWindow.encodeURI("あいうえお")
ie.Quit


ばんのしゃーによかばんた さん 2005年 09月 01日 19時 40分 16秒

>ばんのしゃーによかばんた さん 2004年 04月 02日 18時 54分 39秒
><input type=file id=txtFile>は、簡単に使えてよいのですが、
>初期ディレクトリやフィルタが指定できないのが難点です。
――――――――――――――――――――――――――――――――――――――
>エル さん 2004年 11月 22日 13時 46分 57秒
>@<input type="file" name="file" value="">
>@document.form1.file.Value="aaaa"
>上記のような2つのVBSのうちAは可能ですが、@のようにタイプがfileの場合は、
>どうあがいても値のセットは無理なのでしょうか?
――――――――――――――――――――――――――――――――――――――
Set ie=CreateObject("InternetExplorer.Application")
'ie.Visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 100
Loop
ie.Document.open
ie.Document.write "<html><body><input type=file id=FILE></body></html>"
ie.Document.close
ie.Document.parentWindow.setTimeout "FILE.click();",10
Set wShell=CreateObject("WScript.Shell")
Do While Not wShell.AppActivate("ファイルの選択")
 WScript.Sleep 100
Loop
'wShell.SendKeys "%n"&WScript.ScriptFullName&"%o"
'Folder="C:\VBS"
Folder="C:\VBS\*.VBS"
wShell.SendKeys "%n"&Folder&"%o"
Do While ie.Busy
 WScript.Sleep 100
Loop
WScript.Echo ie.Document.all.FILE.Value
ie.Quit
――――――――――――――――――――――――――――――――――――――
日本語を含む場合はクリップボード経由で貼り付け。


ばんのしゃーによかばんた さん 2005年 09月 01日 19時 39分 56秒

フォルダの移動は、同一ドライブ内では、
ディレクトリエントリをひとつ移すだけかと思っていたら、そうではなく、
Shellの場合、再帰的にファイル/サブフォルダを移動するみたいですね。
1トランザクションで出来ることを、わざわざ複数トランザクションで
やるなんて、アトミシティが崩れて、中途半端な状態が生じるだけなのに、
なんででしょうね。

一方、コマンドプロンプトのMOVEコマンドやFSOのMoveFolderの場合は、
ディレクトリエントリをひとつ移すだけのようで、1トランザクションです。
これがGUIでも、簡単に使えるとよいのですが。。。


ばんのしゃーによかばんた さん 2005年 09月 01日 19時 39分 38秒

>うに さん (null) 2005年 08月 31日 15時 08分 31秒
>フォルダ数を調べたい
>UNIXシェルではls / wc -lで、調べられます。
>cmdでdirを実行して、textファイルとして書き出して、一行ずつ読んで、"<dir>"をInstrする・・・
>という方法を思いついたのですがもっとスマートにできないものでしょうか

DIR|FIND /C "<DIR>"


Nomu さん 2005年 09月 01日 18時 27分 46秒

うに 様
フォルダ数検出ルーチンについて

====引用 ここから ==============
'**************************
'*検出回数検出プロシージャ*
'**************************
Function Kensa2(Str1 ,Str2 )
   Dim l,m,i,j
  
   l=len(Str1) '文字数を数える
   m=len(Str2)
   (中略)
end Function
====引用 ここまで ==============

失礼ながらStr1,Str2に渡される具体的な
値のイメージがわからないので、
このプログラムが何の意図で作成されているのか
さっぱりわかりません。

で、フォルダ数カウントの処理ですが、
指定フォルダ以下の深い階層までの個数を把握するのですよね?

まず、指定フォルダ以下に深い階層のフォルダが存在せず、
シンプルなフォルダだけがあると仮定すると、
1)Set objFolder = objFSO.GetFolder( sPath )で親フォルダの獲得
2)WScript.Echo( CStr(objFolder.SubFolders.Count) )
で取れるわけです。
ここまではよいですか???

これを、シンプルでないフォルダに対してもひたすら繰り返せば
よい・・・・ことになるので、
下記ページを参考に作成できると思います。
キーワードは『再帰処理』です。

あるルーチンA内で再び自分自身(ルーチンA)を呼び出す処理となります。
http://www1.u-netsurf.ne.jp/~tomo_c/tips/R23Lev10.html

うに さん (null) 2005年 09月 01日 10時 47分 06秒
URL:null

vbsをドラッグアンドドロップして、cscriptで実行するスクリプト

vbsを記述していて動作確認を行う場合に、
その都度
”cscript abc.vbs”
等と入力するのが面倒なため、ドラッグアンドドロップで
cscript実行できるスクリプトを作ろうと思ったのですが意外にうまくいきませんでした。
Set WshShell=WScript.CreateObject("WScript.Shell")
Script.Echo("Start")

'ドラッグアンドドロップ
Set objArgs = WScript.Arguments
For I = 0 to objArgs.Count-1
     WScript.Echo(objArgs(I))
     'ドロップされたスクリプトの実行
     Set owsh = WshShell.Exec("cscript " +objArgs(I))
     '標準出力
     out = owsh.StdOut.ReadAll
     WScript.Echo(out)
Next
'ウィンドウを開いたままにする
WScript.StdIn.ReadLine

Wscript.echo("hello")というような単純な物で試したのですが、
cscriptで実行されずにwscriptで実行されてしまいます。

なにが悪いのでしょうか。
よろしくお願いいたします。

ぷろぐぅ さん 2005年 08月 31日 18時 28分 37秒

InternetExplorerの制御(印刷)について教えて下さい。
こちらのサイトでExecWB OLECMDID_PRINTの勉強をして印刷する事ができました!
そこで質問なのですが、印刷ダイアログの制御(「ファイルへ出力」を利用したい)する場合簡単な記述方法はありますか?
WordVBAであれば、PrintOutというものが存在し出力後のファイル名などまで指定する事ができるのですが…

うに さん (null) 2005年 08月 31日 16時 18分 59秒
URL:null

>うに さん (null) 2005年 08月 31日 15時 08分 31秒

>フォルダ数を調べたい

自己レスです

'**************************
'*検出回数検出プロシージャ*
'**************************
Function Kensa2(Str1 ,Str2 )
     Dim l,m,i,j
    
     l=len(Str1) '文字数を数える
     m=len(Str2)
     WScript.Echo(l)
     WScript.Echo(m)
     For i=1 To l-m+1
          if Mid(Str1,i,m) = Str2 then
               kensa2=kensa2+1     '検索文字列が検出された(検出回数++)
               i=i+m-1               '検出されたので1word分検索箇所をずらす
          end if
     next
end Function


こんな感じで作ってみました。
もっといい方法(メソッド)は無いのでしょうか・・・

ばんのしゃーによかばんた さん 2005年 08月 31日 15時 09分 27秒

>ばんのしゃーによかばんた さん 2005年 08月 21日 17時 47分 12秒
>ここんとこ、about:blankを表示すると、そのie.LocationNameに、
>それと関係ない、XXX.HTMと入るようになりました。
>昔は、たしか、about:blankか(無題)のように入っていたと思うのですが、

その後、暫くはディレクトリ名だったのですが、漸く(無題)に戻りました。
なんとも気持ちが悪いですね。
大体、(無題)という文字列も、どこから持って来ているのか、不思議です。
と思ったら、about:blankと入るようになりました。まったく変な奴。

そこで、WSHで監視してたところ、引っ掛かりました。
Set ie=CreateObject("InternetExplorer.Application")
ie.Visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 100
Loop
ie.Document.open
ie.Document.write "<html><head><title>tttt</title></head></html>"
ie.Document.close
'ie.Quit
WScript.Quit
で、書き換わるようです。

でも、戻し方は不明です。
ie.Document.write "<html><head><title></title></head></html>"

ie.Document.title="xxxx"
では、変わりません。
つまり、誰かが、
ie.Document.write "<html><head><title>(無題)</title></head></html>"

ie.Document.write "<html><head><title>about:blank</title></head></html>"
みたいなことをやってるってことでしょうか。


ばんのしゃーによかばんた さん 2005年 08月 31日 15時 09分 07秒

>ばんのしゃーによかばんた さん 2005年 08月 19日 16時 15分 40秒
>---------------------------
>ファイルまたはフォルダ名の変更エラー
>---------------------------
>xxx の名前を変更できません。アクセスできません。
>ディスクがいっぱいでないか、書き込み禁止になっていないか、
>またはファイルが使用中でないか確認してください。
>---------------------------

これには、まだ難儀してます。

以前は、たくさんあるフォルダにうち、作業中のものは、
xxx
という名前を
1 xxx

0 xxx
に変えて、先頭のほうに表示させ、作業が終わったら
xxx
に戻していたのですが、あまりに多くなったので、
0
1
x
などのフォルダを作って、xxxというフォルダをxから1や0に移動し、
作業後、xに戻すように変えたのですが、
その結果、上記エラーに悩まされるようになりました。

移動の途中のサブフォルダで発生して、フォルダ構成が中途半端に
なるのでとても厄介です。

ノートンあたりがスクリプトをスキャンしてカレントディレクトリを
戻すのを忘れているのではないか、と疑っています。
一旦ログオフすれば解消します。

予防策としては、例のフォルダロックメカニズムの応用で、
移動前にフォルダ名を変更して戻す。
誰かが使っていると、リネームでエラーになるので、
移動で中途半端になることは防げます。

※というか、シェルの移動がそうやってほしいですね。>MS

フォルダをドロップします。

FolderLockTest.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim Path
Dim fso
Dim Folder
Dim FolderName

Path=WScript.Arguments.Item(0)
Set fso=CreateObject("Scripting.FileSystemObject")
Set Folder=fso.GetFolder(Path)
Call FolderLock()
If Err Then
 MsgBox "Folder is NOT available. Currently being USED."&vbLf&vbLf&Path,vbCritical,WScript.ScriptName
Else
 MsgBox "Folder is AVAILABLE."&vbLf&vbLf&Path,vbInformation,WScript.ScriptName
End If

Sub FolderLock()
On Error Resume Next
Call TryFolderLock()
End Sub

Sub TryFolderLock()
FolderName=Folder.Name
Folder.Name=fso.GetTempName()
Folder.Name=FolderName
End Sub



うに さん (null) 2005年 08月 31日 15時 08分 31秒
URL:null

フォルダ数を調べたい

たびたびお世話になっています。
ある任意のフォルダ内にいくつのフォルダがあるかを調べたいのですが・・・

UNIXシェルでは
ls / wc -l
で、調べられます。

cmdでdirを実行して、
textファイルとして書き出して、
一行ずつ読んで、
"<dir>"をInstrする・・・

という方法を思いついたのですがもっとスマートにできないものでしょうか。
よろしくお願いします。

ばんのしゃーによかばんた さん 2005年 08月 28日 14時 49分 17秒

>oo さん 2005年 08月 26日 17時 10分 02秒
>mikinyan さん:

そんなの過去記事にあるだろう、と思ったらありませんね。

telnetも、所詮は、標準入力を読んで、標準出力に書き出してるだけ、
なのではないでしょうか。

もし、そうなら、

会話が必要でなければ、入力をリダイレクションで与えれば済むし、
telnet .... <file1 >file2

もし、会話が必要なら、CreateObject("WScript.Shell").Execを使えば、
簡単な会話処理ぐらいは出来るのではないでしょうか。※

過去記事のftpの話は参考になりませんか?

昔、バッチファイルから、telnetなどで、メインフレームに接続して、
掲示板やメールを読み書きしたような気がします。
ひょっとしたらrshだったかも知れません。。。
そのときの経験では、
接続先にスクリプト(TSSコマンドプロシジャ)を作って、
ややこしい会話処理はそっちで済ませ、
起動とデータ転送だけをネット越しにやるのが基本戦略でしたね。


wShell.Execで会話処理をするときに、問題になりがちなのは、
標準出力のバッファリングです。

例えば、Extract.exeで、標準出力を見て、入力を与えようとしたら、
これがバッファリングされていて、待てど暮らせど取れないんです。

Extract aaa.cabで同名ファイルがあるとき、プロンプトが出ます。
それを、
Extract aaa.cab|CScript bbb.vbs

bbb.vbs
Do While Not WScript.Stdin.AtEndOfStream
 WScript.StdOut.Write WScript.StdIn.Read(1)
Loop
とすると、プロンプトが見えません。

ANSI Cだったと思いますが(POSIX/XPGだったかも)、
標準エラーはラインバッファリングで、標準出力は非インタラクティブなら
フルバッファリング、標準入力(*)を読むと連動して標準出力/エラーをflushする、
と決まっていたような。(*)インタラクティブという条件が付いていたかも。
とにかく、こういう仕組みで、通常、会話処理では、入力の前提となる出力が、
バッファリングされて見えないなんてことがないよう制御しているはずですが。
Windowsのコンソールアプリでは、この辺がちゃんと出来てないのか、
気が利かないのか、パイプで繋ぐと、使えないものが多いような気がします。
それとも、パイプが非インタラクティブ扱いなのがよくないのかな。
とにかく、こうなると、どうしようもないです。使えません。
確か、これが理由で、スクリプトからExtract.exeを使って、
CABファイルを展開するのを諦めました。例のCAB.VBSです。
Windowsがlinux/unixに対抗するつもりなら、広告に金を使うより、
この辺をしっかりやってほしいですね。


ばんのしゃーによかばんた さん 2005年 08月 28日 14時 48分 47秒

>ばんのしゃーによかばんた さん 2005年 08月 26日 15時 23分 55秒
>私の場合、どちらからでもアクセスし易いように、「リンク」に、
>「SendTo」
>の「フォルダのショートカット」を置き、

たぶん、このせいだと思いますが、「最近使ったファイル」に、
「SendTo」の「フォルダのショートカット」が増殖するんです。
「ショートカット」なら、分からんでもないですが、
「フォルダのショートカット」なのは不思議です。
「障害」でしょうね。きっと。

補足。
「リンク」に「SendTo」の「フォルダのショートカット」を置いているのは、
引数あり/なしの両方で起動したいものがあるからです。
「リンク」と「SendTo」の両方に置くより、「SendTo」だけに置いて、
「リンク」から辿れるほうが便利なので。



ばんのしゃーによかばんた さん 2005年 08月 28日 14時 48分 26秒

>ばんのしゃーによかばんた さん 2005年 08月 27日 14時 37分 12秒
>Historyについて、検証してみると、とんでもない差がありました。
>後者は前者の数十倍でした。8秒:5分

なんで、こんなに遅いのか?
普通にインプリメントすれば、こんなに遅くなる訳がありません。
多分、nの2乗効果なんでしょう。

で、試してみました。6分。きっと、こういう作りなんでしょう。
――――――――――――――――――――――――――――――――――――――
Const ssfHISTORY=34
Set Shell = WScript.CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(ssfHISTORY)
Start=Timer
WScript.Echo Count(Folder),Timer-Start

Function Count(Folder)
Dim FolderItem
For k=0 To Folder.Items().Count-1
 Set FolderItem=Item(Folder.Items(),k)
 If FolderItem.IsFolder Then
  Count=Count+Count(FolderItem.GetFolder)
 Else 
  Count=Count+1
 End If
Next
End Function

Function Item(FolderItems,k)
Dim j
For Each Item In FolderItems
 j=j+1
 If j>k Then Exit Function
Next
End Function
――――――――――――――――――――――――――――――――――――――
ま、回避策があるからよいけれど、これは、性能バグ、性能障害です。


ばんのしゃーによかばんた さん 2005年 08月 27日 14時 37分 12秒

最近、またポアロをやってますね。再放送かと思ったら、新シリーズでしょうか。
間を置いて新シリーズを作ると面子が揃わないことがありますが、そんな感じ。
ミス・レモンもヘイスティング大尉も出て来ません。

ノン、ノン、ノン、検証もせずに、常識的な判断をしてはいけません。
とポアロが言ったかどうかは知りませんが、言いそうです。
以下はそんな例です。

For Each FolderItem In Folder.Items()

For k=0 To Folder.Items().Count-1
 Set FolderItem=Folder.Items().Item(k)
の性能差について

そんなに変わらないだろうと思うのは、常識的な判断です。
Historyについて、検証してみると、とんでもない差がありました。
後者は前者の数十倍でした。8秒:5分

Historyだけのことかも知れませんが、ご用心。特にJScript。

HistoryEach.VBS
――――――――――――――――――――――――――――――――――――――
Const ssfHISTORY=34
Set Shell = WScript.CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(ssfHISTORY)
Start=Timer
WScript.Echo Count(Folder),Timer-Start

Function Count(Folder)
Dim FolderItem
For Each FolderItem In Folder.Items()
 If FolderItem.IsFolder Then
  Count=Count+Count(FolderItem.GetFolder)
 Else 
  Count=Count+1
 End If
Next
End Function
――――――――――――――――――――――――――――――――――――――

HistoryCount.VBS
――――――――――――――――――――――――――――――――――――――
Const ssfHISTORY=34
Set Shell = WScript.CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(ssfHISTORY)
Start=Timer
WScript.Echo Count(Folder),Timer-Start

Function Count(Folder)
Dim FolderItem
Dim k
For k=0 To Folder.Items().Count-1
 Set FolderItem=Folder.Items().Item(k)
 If FolderItem.IsFolder Then
  Count=Count+Count(FolderItem.GetFolder)
 Else 
  Count=Count+1
 End If
Next
End Function
――――――――――――――――――――――――――――――――――――――



ばんのしゃーによかばんた さん 2005年 08月 27日 14時 36分 49秒

物騒な世の中なので、知らない製造元の怪しいプログラムが動いていないか、
プロセス一覧で製造元などをチェックしましょう。

TaskVerInfo.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim fso
Dim ie
Dim Process
Dim n
Dim Items
Dim COLS:COLS=7
Items=Array(_
"会社名",_
"説明",_
"ファイル バージョン",_
"製品名",_
"製品バージョン",_
"更新日時",_
"作成日時",_
"Name",_
"ExecutablePath",_
"CommandLine",_
"ProcessId",_
"ParentProcessId",_
"Priority",_
"ThreadCount",_
"CreationDate",_
"KernelModeTime",_
"UserModeTime",_
"VirtualSize",_
"WorkingSetSize")
Dim Item
Dim rows:rows=Array()
Dim Values:ReDim Values(UBound(Items))
Dim k
Dim Shell
Dim FolderName
Dim Folder

For Each Process In GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_Process")
k=-1+COLS
k=k+1:Values(k)=Process.Name
k=k+1:Values(k)=Process.ExecutablePath
k=k+1:Values(k)=Process.CommandLine
k=k+1:Values(k)=Process.ProcessId
k=k+1:Values(k)=Process.ParentProcessId
k=k+1:Values(k)=Process.Priority
k=k+1:Values(k)=Process.ThreadCount
k=k+1:Values(k)=Left(Process.CreationDate,14)
k=k+1:Values(k)=Process.KernelModeTime
k=k+1:Values(k)=Process.UserModeTime
k=k+1:Values(k)=Process.VirtualSize
k=k+1:Values(k)=Process.WorkingSetSize
ReDim Preserve rows(UBound(rows)+1)
rows(UBound(rows))=Values
Next

Set fso=CreateObject("Scripting.FileSystemObject")
Set Shell=CreateObject("Shell.Application")

If UCase(fso.GetBaseName(WScript.FullName))="WSCRIPT" Then
 Set ie=CreateObject("InternetExplorer.Application")
 ie.ToolBar=False
 ie.Navigate "about:blank"
 Do While ie.Busy Or ie.ReadyState<>4
  WScript.Sleep 100
 Loop
 ie.Document.open
 ie.Document.writeln "<html><head>"
 ie.Document.writeln "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>"
 ie.Document.writeln "<title>"&WScript.ScriptName&"</title>"
 ie.Document.writeln "</head><body><table id='oTABLE' border=1>"
 ie.Document.parentWindow.status="プロセスの検索中..."
 ie.Visible=True
 ie.Document.writeln "<TR>"
 For Each Item In Items
  ie.Document.writeln "<TD>"&Item&"</TD>"
 Next
 ie.Document.writeln "<TR>"
Else
 WScript.StdOut.WriteLine Join(Items,vbTab)
End If

For n=0 To UBound(rows)
 Call Write(rows(n))
Next
If IsEmpty(ie) Then
 WScript.Echo n&" 個のプロセス"
Else
 ie.Document.writeln "</table></body></html>"
 ie.Document.close
 ie.Document.charset="unicode"
 ie.Document.charset="shift_jis"
 ie.Document.parentWindow.status=n&" 個のプロセス"
End If
WScript.Quit

Sub Write(Values)
Dim FolderName2
Dim FolderItem
Dim FileName
Dim pos

If IsNull(Values(1+COLS)) And InStr(Values(0+COLS),".") Then
 Values(1+COLS)=GetFullPath(Values(0+COLS))
End If

If Values(1+COLS)<>"" Then
 pos=InStrRev(Values(1+COLS),"\")
 FolderName2=Left(Values(1+COLS),pos)
 FileName=Mid(Values(1+COLS),pos+1)
 If FolderName<>FolderName2 Then
  FolderName=FolderName2
  Set Folder=Shell.NameSpace(FolderName)
 End If
 Set FolderItem=Folder.ParseName(FileName)
 Values(0)=Folder.GetDetailsOf(FolderItem,35)
 Values(1)=Folder.GetDetailsOf(FolderItem,36)
 Values(2)=Folder.GetDetailsOf(FolderItem,37)
 Values(3)=Folder.GetDetailsOf(FolderItem,38)
 Values(4)=Folder.GetDetailsOf(FolderItem,39)
 Values(5)=Folder.GetDetailsOf(FolderItem,3)
 Values(6)=Folder.GetDetailsOf(FolderItem,4)
Else
 Values(0)=""
 Values(1)=""
 Values(2)=""
 Values(3)=""
 Values(4)=""
End If

For k=0 To UBound(Values)
 If IsNull(Values(k)) Then Values(k)=""
Next
If IsEmpty(ie) Then
 WScript.StdOut.WriteLine Join(Values,vbTab)
Else
 For k=0 To UBound(Values)
  If Values(k)="" Then Values(k)="&nbsp;"
  Values(k)="<TD>"&Values(k)&"</TD>"
 Next
 ie.Document.writeln "<TR>"&Join(Values)&"</TR>"
End If
End Sub

Function GetFullPath(Name)
Dim wShell
Dim Link

Set wShell=CreateObject("WScript.Shell")
Set Link=wShell.CreateShortCut(".LNK")
Call LinkTargetPath(Link,Name)
GetFullPath=Link.TargetPath
End Function

Sub LinkTargetPath(Link,Name)
Link.TargetPath=""
On Error Resume Next
Link.TargetPath=Name
End Sub
――――――――――――――――――――――――――――――――――――――
TIPS紹介。
この手の方法では、パス名などの\がback slashになります。
上で、
 ie.Document.close
 ie.Document.charset="unicode"
 ie.Document.charset="shift_jis"
と、なんか意味不明なことをやってますが、これが回避策なんです。
ie.Document.charsetを変更するとよいみたいです。


ばんのしゃーによかばんた さん 2005年 08月 27日 14時 36分 15秒

非表示のIEには、こっちのほうがよいかも。

特に、VBscriptからIEを使っていると、非表示のIEが残ったりします。
そういうときに便利です。

一覧の各セルをクリックすると表示オン/オフがトグルします。
――――――――――――――――――――――――――――――――――――――
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>
<title>MenuBar.HTA</title>
<script language=vbscript>
Option Explicit
Dim ies

Sub window_onload()
Dim Shell
Dim ie
Dim oTR
Dim oTD

Set Shell=CreateObject("Shell.Application")
ies=Array()
For Each ie In Shell.Windows()
 ReDim Preserve ies(UBound(ies)+1)
 Set ies(UBound(ies))=ie
 Set oTR=oTable.insertRow
 Set oTD=oTR.insertCell
 oTD.innerText=ie.Visible
 oTD.style.cursor="hand"
 oTD.title="Visible ?"
 Set oTD.onclick=GetRef("Click")
 Set oTD=oTR.insertCell
 oTD.innerText=CBool(ie.ToolBar)
 oTD.style.cursor="hand"
 oTD.title="ToolBar ?"
 Set oTD.onclick=GetRef("Click")
 Set oTD=oTR.insertCell
 oTD.innerText=ie.MenuBar
 oTD.style.cursor="hand"
 oTD.title="MenuBar ?"
 Set oTD.onclick=GetRef("Click")
 Set oTD=oTR.insertCell
 oTD.innerText=ie.StatusBar
 oTD.style.cursor="hand"
 oTD.title="StatusBar ?"
 Set oTD.onclick=GetRef("Click")
 Set oTD=oTR.insertCell
 oTD.innerText=ie.AddressBar
 oTD.style.cursor="hand"
 oTD.title="AddressBar ?"
 Set oTD.onclick=GetRef("Click")
 Set oTD=oTR.insertCell
 oTD.innerText=Location(ie)
Next
setTimeout "document.execCommand ""refresh""",10*1000
End Sub

Function Location(ie)
If ie.LocationURL<>"" Then
 Location=ie.LocationURL
 Exit Function
End If
If ie.LocationName<>"" Then
 Location=ie.LocationName
 Exit Function
End If
If ie.ReadyState<>4 Then Exit Function
If TypeName(ie.Document)="HTMLDocument" Then
 On Error Resume Next
 Location=ie.Document.title
 Exit Function
End If
If InStr(TypeName(ie.Document),"IShellFolderView") Then
 Location=ie.Document.Folder.Title
 Exit Function
End If
End Function

Sub Click()
Select Case CBool(Me.innerText)
Case True
 Select Case Me.cellIndex
 Case 0 ies(Me.parentElement.rowIndex-1).Visible=False
 Case 1 ies(Me.parentElement.rowIndex-1).ToolBar=False
 Case 2 ies(Me.parentElement.rowIndex-1).MenuBar=False
 Case 3 ies(Me.parentElement.rowIndex-1).StatusBar=False
 Case 4 ies(Me.parentElement.rowIndex-1).AddressBar=False
 End Select
 Me.innerText="False"
Case Else
 Select Case Me.cellIndex
 Case 0 ies(Me.parentElement.rowIndex-1).Visible=True
 Case 1 ies(Me.parentElement.rowIndex-1).ToolBar=True
 Case 2 ies(Me.parentElement.rowIndex-1).MenuBar=True
 Case 3 ies(Me.parentElement.rowIndex-1).StatusBar=True
 Case 4 ies(Me.parentElement.rowIndex-1).AddressBar=True
 End Select
 Me.innerText="True"
End Select
End Sub
</script>
</head>
<body bgcolor=menu>
<table id=oTable BORDER>
<thead>
<td>Visible</td>
<td>ToolBar</td>
<td>MenuBar</td>
<td>StatusBar</td>
<td>AddressBar</td>
<td>Location</td>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
――――――――――――――――――――――――――――――――――――――


Return