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

IEとフォルダバーを利用したBrowseForFolder擬似が更にブラッシュアップ
しました。
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim ie
Dim OnQuit
Dim Path
Dim fOK

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.ToolBar=False
ie.StatusBar=False
ie.ShowBrowserBar "{EFA24E64-B078-11D0-89E4-00C04FC9E26E}",True
ie.Navigate "about:blank"
ie.Visible=True
Do While OnQuit=False
 WScript.Sleep 100
Loop
If fOK Then WScript.Echo Path
WScript.Quit

Sub IE_OnQuit()
OnQuit=True
End Sub

Sub IE_DocumentComplete(pDsip,URL)
'WScript.Echo URL
If URL="about:blank" Then
 ie.Document.write "<html><head><title>フォルダの参照</title>"&_
 "<style> BODY {background: MENU; color: WINDOWTEXT; border-style: none;}</style>"&_
 "</head><body scroll=no>Select Folder..."&_
 "<p><input type=text id=Path size=80>"&_
 "<p><input type=button value=OK id=OK style='width:80;'> "&_
 "<input type=button value=Cancel id=Cancel style='width:80;'>"&_
 "</body></html>"
 ie.document.all.Path.Value=Path
 Set ie.Document.all.OK.onclick=GetRef("OK_onclick")
 Set ie.Document.all.Cancel.onclick=GetRef("Cancel_onclick")
Else
 Path=URL
 ie.Navigate "about:blank"
End If
End Sub

Sub OK_onclick()
fOK=True
ie.Quit
End Sub

Sub Cancel_onclick()
ie.Quit
End Sub


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

以前、WSH/WSF/VBS/JSなどのIconHandlerにSCFのものを使う話をしました。

>ばんのしゃーによかばんた さん 2004年 03月 24日 17時 19分 40秒
>ただ、指定のない大多数のファイルがアイコンなしアイコンになってしまうので、

という問題がありました。これは、URLのものを使うと、よいようです。

[HKEY_CLASSES_ROOT\InternetShortcut\shellex\IconHandler]
@="{FBF23B40-E3F0-101B-8488-00AA003E56F8}"

HTA/WSFなら、
<!--
[InternetShortcut]
IconIndex=23
IconFile=C:\WINDOWS\system32\shell32.dll
-->

VBSなら 、
Option Explicit
Dim InternetShortcut,IconFile,IconIndex
[InternetShortcut] =0
IconIndex=23
IconFile="C:\WINDOWS\system32\shell32.dll"

JSなら 、
/*
[InternetShortcut]
IconIndex=23
IconFile=C:\WINDOWS\system32\shell32.dll
*/

WSHなら、
[InternetShortcut]
IconIndex=23
IconFile=C:\WINDOWS\system32\shell32.dll


ばんのしゃーによかばんた さん 2005年 03月 02日 16時 16分 25秒

ShellFolderViewとそのDefaultVerbInvoked()の応用例です。

フォルダビューで条件を指定して、複数ファイルを選択します。

FileSelector.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim fv
Dim Shell
Dim Document
Dim FolderItem
Dim cond
Dim N
Dim OP
Dim Value
Dim Error
Dim re

Set re=New RegExp
re.IgnoreCase=True

Set fv=WScript.CreateObject("Shell.FolderView.1","FV_")
Set Shell=CreateObject("Shell.Application")
Set Document=Shell.Windows.Item.Document
Call fv.SetFolderView(Document)
Do
 cond=InputBox("Enter Condition To Select." & vbCrLf & _
        "N[ame]=*.*" & vbCrLf & _
        "S[ize]{< > =}n" & vbCrLf & _
        "D[ate]{< > =}[yy/]mm/dd" & vbCrLf & _
        "T[ime]{< > =}[[yy/]mm/dd] hh:mm" & vbCrLf & _
         vbCrLf & _
         N & OP & Value &vbCrLf & _
         Error & vbCrLf _
        ,WScript.ScriptName,cond,0,0)
 For Each FolderItem in Document.SelectedItems
  Document.SelectItem FolderItem,0
 Next
 If IsEmpty(cond) Then Exit Do
 If Parse(cond) Then
  For Each FolderItem in Document.Folder.Items
   If Test(FolderItem) Then
    Document.SelectItem FolderItem,1
   End If
  Next
  Error=Document.SelectedItems.Count & " Selected."
 End If
Loop
WScript.Quit

Function Parse(ByVal cond)
OP=""
Value=""
Error=""

Select Case Mid(cond,2,1)
Case "<","=",">"
 N=UCase(Left(cond,1))
 cond=Mid(cond,2)
Case Else
 N=UCase(Left(cond,4))
 cond=Mid(cond,5)
End Select

Select Case N
Case "NAME","SIZE","DATE","TIME","N","S","D","T"
Case Else
 Error="Invalid Name"
 Exit Function
End Select

Select Case Mid(cond,2,1)
Case "=",">"
 OP=Left(cond,2)
 cond=Mid(cond,3)
Case Else
 OP=Left(cond,1)
 cond=Mid(cond,2)
End Select

Select Case OP
Case "<","=",">","<=","<>",">="
Case Else
 Error="Invalid Operation"
 Exit Function
End Select

Select Case N
Case "NAME","N"
 If OP="=" Then
  cond=Replace(cond,".","\.")
  cond=Replace(cond,"?",".")
  cond=Replace(cond,"*","[^.]*")
  Value=cond
  re.Pattern="^"&cond&"$"
 Else
  Error="Invalid Operation"
  Exit Function
 End If
Case "SIZE","S"
 If IsNumeric(cond) Then
  Value=CLng(cond)
 Else
  Error="Invalid Number"
  Exit Function
 End If
Case "DATE","D","TIME","T"
 If IsDate(cond) Then
  Select Case N
  Case "DATE","D"
   Value=DateValue(cond)
  Case "TIME","T"
   Value=CDate(cond)
   If DateValue(Value)=0 Then
    Value=Date + Value
   End If
  End Select
 Else
  Error="Invalid Date"
  Exit Function
 End If
End Select

Parse=True
End Function

Function Test(FolderItem)
Dim ModifyDate
Dim Size

Select Case N
Case "NAME","N"
 Test=re.Test(FolderItem.Name)
Case "SIZE","S"
 Size=(FolderItem.Size+1023) \ 1024
 Select Case OP
 Case "<" Test=CBool(Size<Value)
 Case "=" Test=CBool(Size=Value)
 Case ">" Test=CBool(Size>Value)
 Case "<=" Test=CBool(Size<=Value)
 Case "<>" Test=CBool(Size<>Value)
 Case ">=" Test=CBool(Size>=Value)
 End Select
Case "DATE","D","TIME","T"
 Select Case N
 Case "DATE","D"
  ModifyDate=DateValue(FolderItem.ModifyDate)
 Case "TIME","T"
  ModifyDate=FolderItem.ModifyDate
  ModifyDate=DateValue(ModifyDate)+TimeSerial(Hour(ModifyDate),Minute(ModifyDate),0)
 End Select

 Select Case OP
 Case "<" Test=CBool(ModifyDate<Value)
 Case "=" Test=CBool(ModifyDate=Value)
 Case ">" Test=CBool(ModifyDate>Value)
 Case "<=" Test=CBool(ModifyDate<=Value)
 Case "<>" Test=CBool(ModifyDate<>Value)
 Case ">=" Test=CBool(ModifyDate>=Value)
 End Select
End Select

End Function

Function FV_DefaultVerbInvoked()
' WScript.Echo "DefaultVerbInvoked"
 FV_DefaultVerbInvoked=False
End Function


むちゃ さん 2005年 03月 02日 15時 38分 40秒

起動している HTA(*.hta) の InternetExplorer Object(WebBrowser Object)を取得することはできないでしょうか?

魔界の仮面弁士 さん 2005年 03月 02日 14時 33分 16秒

》タイガージェットシーンさん 2005年03月02日 11時55分08秒
> Set oExec = wShell.Exec("cmd.exe /c ping strIP")

Set oExec = wShell.Exec("cmd.exe /c ping " & strIP)

かな。

管理人により削除 さん 2005年 03月 02日 12時 22分 13秒
URL:管理人により削除

管理人により削除

タイガージェットシーン さん 2005年 03月 02日 11時 55分 08秒

VBSプログラム中のinputboxから入力された値をコマンドプロンプトに
引渡したいのですが、どのようにおこなえばよろしいでしょうか。
以下のような感じを想定しているのですが。。。

strIP = InputBox("IPアドレスを入力して下さい。", default)
Set wShell = CreateObject("WScript.Shell")
Set oExec = wShell.Exec("cmd.exe /c ping strIP")
MsgBox oExec.StdOut.ReadAll()


宜しくお願いします。

管理人により削除 さん 2005年 03月 02日 11時 22分 34秒
URL:管理人により削除

管理人により削除

管理人により削除 さん 2005年 03月 01日 02時 17分 43秒

管理人により削除

管理人むたぐち さん 2005年 02月 28日 23時 09分 01秒

mp3_autofill.vbsを更新しました。
無視リストに書かれたフォルダ名が無視されないバグを修正。
自分で毎日使っていて、ようやく気づいたという…

G-Luck さん 2005年 02月 28日 12時 06分 36秒

以前はお世話になりました。
また、質問させてください。

現在、Excelを二つ起動していて、二番目に起動したExcelを取得したいのですが、その方法はあるでしょうか?

現在は、GetObject(,"Excel.Application")で取得しているのですが、最初のものしか取得できません。
よろしくお願いいたします。

環境 WinXP,Excel2003

門外漢 さん 2005年 02月 26日 21時 40分 42秒

訂正:
暗記しているものを書いては駄目ですね。

制限付きサイト
<!-- saved from url=(0007)http:// -->
です。
URLのように大文字では駄目です。

他のゾーンも同様です。失礼いたしました。

門外漢 さん 2005年 02月 26日 21時 35分 52秒

WSHには、まったくの門外漢です。たまたま立ち寄りました。

ばんのしゃーによかばんた さん 2005年 02月 17日 17時 44分 17秒
wrote:
>任意のフォルダを「制限付きサイトゾーン」にする方法はなさそうです。
>フォルダ自体には、印がないようです。

ちょっと話題にはずれますが、関連として"Mark of the Web"というものをご案内したいと思います。IEでのみ有効です。フォルダごとには無理ですけれどファイルごとになら。
ローカルマシン上にある単体のHTMLをIEで開いた時のセキュリティゾーンを以下の3つに設定が可能です。

・インターネットゾーン
・イントラネットゾーン
・制限付きサイトゾーン

工夫すればさらに信頼済みサイトゾーンも可能です。

"Mark of the Web"を該当のHTMLにコメントとして埋め込みます。HTMLタグのすぐ後ろ、とか場所を決めておかれると見失うことがありません。1個だけ記述すべきです。本来このコメントはどこでも良いのですが必ず1個だけにしてください。複数で異なるセキュリティゾーンを指定しないでください。

以下、いろいろな"Mark of the Web"。

汎用インターネットゾーン。
<!-- saved from URL=(0014)about:internet -->

汎用イントラネットゾーン
<!-- saved from URL=(0017)http://localhost/ -->

汎用制限付きサイトゾーン
<!-- saved from URL=(0007)http:// -->

以上が基本形です。特定のサイトに連動したいなら
<!-- saved from url=(0020)http://www.phdcc.com -->
のように文字数を数えます。
上記はhttp://www.phdcc.comですのでこのサイトを制限付きサイトに
すればローカルにある"Mark of the Web"つきのHTMLファイルも
制限付きサイトになります。

先ほども触れましたが、汎用で信頼済みサイトゾーンにする
"Mark of the Web"は(私は)知りません。
ですが、たとえば、www.example.com あたりを
信頼済みサイトゾーンに登録することは危険性が考えられませんので
手元でそのようにしておけば
<!-- saved from url=(0022)http://www.example.com -->
等の"Mark of the Web"をお手製で作っておくことが可能です。

以上です。スレッド本来の話の流れから逸脱していますが、
興味深いかもしれないと思いましてご紹介させて頂きました。

--
門外漢

ばんのしゃーによかばんた さん 2005年 02月 25日 18時 17分 28秒

IEを使ったクリップボード操作は、汎用性がありますが、
ちょっと重たくって、一呼吸置く感じがあります。1.5秒くらい。

もし、コンピュータにMS Forms(FM20.DLL)が入っていれば、
そっちのほうが、軽快です。0.5秒くらい。

ExcelやOfficeなどの有償製品のほか、一部の旧Windows製品や、
無償のActiveX Control Padにも付いているそうです。

――――――――――――――――――――――――――――――――――――――
Set uf=CreateObject("Forms.Form.1")
Set tb=uf.Controls.Add("Forms.TextBox.1").Object
tb.MultiLine=True
If tb.CanPaste Then
 tb.Paste
End If
Text=tb.Text
――――――――――――――――――――――――――――――――――――――
Set uf=CreateObject("Forms.Form.1")
Set tb=uf.Controls.Add("Forms.TextBox.1").Object
tb.MultiLine=True
tb.Text=Text
tb.SelStart=0
tb.SelLength=tb.TextLength
tb.Copy
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 02月 25日 18時 17分 11秒

標準入出力が使えるかどうかの判定方法について。

実際に書いてみて、エラーになるかどうか、しか方法はなかったですよね。
しかし、書いてみるまで分からないというのはとっても使いにくいです。:-(

WSH5.6で、IsEmpty(WScript.StdIn)で判定できるようになった、
と思ったのですが、今、確認すると駄目ですね。変わったみたい。

通常はWScript.FullNameがCScript/WScriptの判定で代用してますが、
WScriptでも標準入出力が使えることがあるので、正確ではありません。

他に方法はないものかと探してみたところ、
Set StdIn=fso.GetStandardStream(0,True)
がエラーになるかどうかで、判定できました。:-)

XP SP2 WSH5.6以外の環境で使えるかどうかは不明です。

また、そのうち、変わるかも知れません。:-p



管理人むたぐち さん 2005年 02月 23日 21時 36分 26秒

To: ばんのしゃーによかばんた さん 2005年 02月 15日 17時 30分 28秒

> この機能のニーズですが、
> ファイルの履歴なら、「履歴」や「スタート」−「最近使ったファイル」で
> 見れるのに、フォルダの履歴は見れない、ということでしょうか?

いえ、実際に使ってみないとこの機能の使いやすさは分からないかもしれないです。
よく使うフォルダのリンクが、動的にフォルダ内に生成されるのが味噌です。

ばんのしゃーによかばんた さん 2005年 02月 22日 18時 33分 56秒

汎用にCSVファイルをドロップして表示するHTAです。

ヘッダをクリックするとソートします。
――――――――――――――――――――――――――――――――――――――
<HTML><HEAD>
<hta:application applicationname="csvView" version="1.00" id="hta">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis">
<TITLE>csvView.HTA</TITLE>
<OBJECT ID="TDC" WIDTH=0 HEIGHT=0 CLASSID="CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83">
<PARAM NAME="UseHeader" VALUE="true">
<PARAM NAME="CaseSensitive" VALUE="false">
</OBJECT><SCRIPT LANGUAGE="VBScript">
Option Explicit
Sub window_onload()
Dim arg
Dim RS
Dim HTML
Dim Field
arg=hta.commandline
If Left(arg,1)="""" Then arg=Mid(arg,InStr(2,arg&"""",""""))
arg=Trim(Replace(Mid(arg,InStr(arg," ")),"""",""))
If arg="" Then
 alert "CSV file name required."
 close
End If
TDC.DataURL=arg
document.title=document.title & " - " & TDC.DataURL
Set RS=TDC.recordset
HTML="<" & "TABLE DATASRC=""#TDC"" BORDER><" & "THEAD><" & "TR>"
For Each Field In RS.Fields
 HTML=HTML & "<" & "TD onclick=""sort1(me)"">" & Field.Name & "<" & "/TD>"
Next
HTML=HTML & "<" & "/TR><" & "/THEAD><" & "TBODY><" & "TR>"
For Each Field In RS.Fields
 HTML=HTML & "<" & "TD><" & "SPAN DATAFLD=""" & Field.Name & """><" & "/SPAN><" & "/TD>"
Next
HTML=HTML & "<" & "/TR><" & "/TBODY><" & "/TABLE>"
TR.innerHTML=HTML
End Sub
Function sort1(select_head)
 Select Case Left(select_head.innerText,1)
 Case "+"
  TDC.Sort="-" & Mid(select_head.innerText,2)
  select_head.innerText="-" & Mid(select_head.innerText,2)
 Case "-"
  TDC.Sort=""
  select_head.innerText=Mid(select_head.innerText,2)
 Case Else
  TDC.Sort="+" & select_head.innerText
  select_head.innerText="+" & select_head.innerText
 End Select
 TDC.Reset
End Function
Function filter1()
 TDC.Filter = filtercondition.value
 TDC.Reset
End Function
</SCRIPT></HEAD>
<BODY >
絞り込み条件:<input type="textbox" id="filtercondition">
<input type="button" value="絞り込み" onclick="filter1"/>
<BR>
=&nbsp;&nbsp;&gt;&nbsp;&nbsp;&gt;=&nbsp;&nbsp;&lt;&nbsp;&nbsp;&lt;=&nbsp;&nbsp;&lt;&gt;&nbsp;&nbsp;&amp;&nbsp;&nbsp;|&nbsp;&nbsp;*
<DIV ID="TR"></DIV>
</BODY></HTML>
――――――――――――――――――――――――――――――――――――――
※ところで、TDCを使うには、CSVファイルを作らないと駄目なんでしょうか。
ソートや絞込みの出来るテーブルをCSVファイルなしに作れないものでしょうか。


G-Luck さん 2005年 02月 22日 09時 19分 13秒

>魔界の仮面弁士さん
有意義な情報ありがとうございました。
BuildPathは、文字を、間にPathを入れてつなぐというものですね。
機会があれば利用させていただきます。
ありがとうございました

魔界の仮面弁士 さん 2005年 02月 21日 18時 55分 10秒

》G-Luckさん 2005年02月21日 18時26分43秒
> Application.PathSeparator等を使うことの意味はあるのでしょうか?
PathSeparatorプロパティは、Excel 98 (Mac版Excel) と、Win版Excelの
双方で動くコードを書く場合に使われます。

ただ、VBScript の世界に関していえば、Mac版が存在していないので、
パスセパレータは、ほぼ固定的な値となりますね。

> フォルダ名の連結に"\"を使おうと思ったのですが、
FileSystemObject の BuildPath メソッドを使ってみてください。
http://www.microsoft.com/japan/msdn/library/ja/script56/html/jsmthbuildpath.asp

G-Luck さん 2005年 02月 21日 18時 26分 43秒

はじめまして、G-Luckといいます。

初歩的な質問で申し訳ないですが、よろしくお願いします。
ExcelのVBAですと "\" を呼び出すのに、Application.PathSeparator というのを利用していたのですが、VBSでも同じようなものはあるでしょうか?
また、Application.PathSeparator等を使うことの意味はあるのでしょうか?

現在、私はExcelのVBAを主に利用しているのですが、Excelのツールバーの表示非表示を立ち上げ時に管理するため、VBSを利用して、Excel11.xlbのコピー、Excelの再起動、等をしようとしています。その中で、フォルダ名の連結に"\"を使おうと思ったのですが、どのように呼び出せばいいのかわかりませんでした。単純に"\"と入力すれば実現はできるのですが、VBAでは、Application.PathSeparatorを利用していたので、少し気になったもので。

ばんのしゃーによかばんた さん 2005年 02月 21日 17時 07分 59秒

VBSファイルをドロップすると、引数をプロンプトして、CScriptで起動。
結果はWindows画面に。

CScriptWithArgs.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim wShell
Dim args
Dim arg
Dim ans
Dim CWD
CWD=""
If UCase(Mid(WScript.FullName,InStrRev(WScript.FullName,"\")+1,1))="C" Then
 Call More()
End If
Set wShell=CreateObject("WScript.Shell")
args=Array("CScript.EXE")
For Each arg In WScript.Arguments
 If CWD="" And InStr(arg,"\") Then
  CWD=Left(arg,InStrRev(arg,"\"))
 End If
 ReDim Preserve args(UBound(args)+1)
 If InStr(arg," ") Then
  args(UBound(args))="""" & arg & """"
 Else
  args(UBound(args))=arg
 End If
Next
args=Join(args," ")
ans=InputBox(args,WScript.ScriptName,"")
If CWD="" Then
 CWD=Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
End If
If Not IsEmpty(ans) Then
 wShell.CurrentDirectory=CWD
 wShell.Run "CMD.EXE /C ("&args&" "&ans&" <NUL ) 2>&1 | CScript.EXE //NoLogo """&WScript.ScriptFullName&"""",2
End If
WScript.Quit

Sub More()
Dim ie
Dim StdIn
Dim line

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.title=WScript.ScriptName
ie.Document.parentWindow.status="CScriptの実行中..."
ie.Visible=True
Set StdIn=WScript.StdIn
Do While Not StdIn.AtEndOfStream
 line=StdIn.ReadLine()
 ie.document.body.insertAdjacentText "BeforeEnd",line & vbCRLF
Loop
ie.Document.parentWindow.status="CScriptの実行が終了しました"
WScript.Quit
End Sub


ばんのしゃーによかばんた さん 2005年 02月 21日 17時 07分 42秒

コンソールコマンドをWindows GUIから起動して、結果もWindows画面に出します。

コンソールコマンドがWindowsアプリのようになります。:-)

RunWithArgs.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim wShell
Dim args
Dim arg
Dim ans
Dim CWD
CWD=""
If UCase(Mid(WScript.FullName,InStrRev(WScript.FullName,"\")+1,1))="C" Then
 Call More()
End If
Set wShell=CreateObject("WScript.Shell")
args=Array()
For Each arg In WScript.Arguments
 If CWD="" And InStr(arg,"\") Then
  CWD=Left(arg,InStrRev(arg,"\"))
 End If
 ReDim Preserve args(UBound(args)+1)
 If InStr(arg," ") Then
  args(UBound(args))="""" & arg & """"
 Else
  args(UBound(args))=arg
 End If
Next
args=Join(args," ")
ans=InputBox(args,WScript.ScriptName,"")
If CWD="" Then
 CWD=Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
End If
If Not IsEmpty(ans) Then
 wShell.CurrentDirectory=CWD
 wShell.Run "CMD.EXE /C ("&args&" "&ans&" <NUL ) 2>&1 | CScript.EXE //NoLogo """&WScript.ScriptFullName&"""",2
End If
WScript.Quit

Sub More()
Dim ie
Dim StdIn
Dim line

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.title=WScript.ScriptName
ie.Document.parentWindow.status="コマンドの実行中..."
ie.Visible=True
Set StdIn=WScript.StdIn
Do While Not StdIn.AtEndOfStream
 line=StdIn.ReadLine()
 ie.document.body.insertAdjacentText "BeforeEnd",line & vbCRLF
Loop
ie.Document.parentWindow.status="コマンドの実行が終了しました"
WScript.Quit
End Sub


ばんのしゃーによかばんた さん 2005年 02月 18日 17時 34分 30秒

MoveHereは同名ファイルがあると、上書きか中止かの選択肢しかなく、
しかも上書きは元ファイルがごみ箱に残らず消えてしまいます。

そこで、MoveHere拡張のサンプル。
ファイルをドロップすると、指定フォルダ(C:\WshLab)に移動します。
もし、同名ファイルがあると、元ファイルをごみ箱に送る
/新ファイルに「コピー (n)」を付ける/中止する、から選択できます。
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim dst

dst="C:\WshLab"

Const FOF_RENAMEONCOLLISION = &H8
Const FOF_ALLOWUNDO = &H40
Dim Shell
Dim ie
Dim Folder
Dim FolderItem
Dim Verb
Dim arg

Set Shell=CreateObject("Shell.Application")
For Each ie In Shell.Windows
 If Not ie.Busy Then
  If ie.ReadyState=4 Then
   If InStr(TypeName(ie.Document),"IShellFolderViewDual")=1 Then
    Exit For
   End If
  End If
 End If
Next
If Not IsEmpty(ie) Then Set Shell=ie.Document.Application

Set Folder=Shell.NameSpace(dst)
For Each arg In WScript.Arguments
 Call MoveHere(Folder,arg)
Next

Sub MoveHere(Folder,arg)
Dim Name
Name=Mid(arg,InStrRev(arg,"\")+1)
Set FolderItem=Folder.ParseName(Name)
If Not FolderItem Is Nothing Then
 Select Case MsgBox(arg&vbCrLf&"To"&vbCrLf&Folder.Self.Path&vbCrLf&_
     "Move ?"&vbCrLf&_
     "Y - Sending the target file to Recycle Bin."&vbCrLf&_
     "N - Prefixing 'copy (n)' to the source file."&vbCrLf&_
     "Cancel - Not move.",_
     vbYesNoCancel,"Name Collision - "&Name)
 Case vbYes
  Shell.NameSpace(10).MoveHere FolderItem
  Do
   WScript.Sleep 100
   Set FolderItem=Folder.ParseName(Name)
   If FolderItem Is Nothing Then Exit Do
  Loop
  WScript.Sleep 200
  Folder.MoveHere arg,FOF_ALLOWUNDO
 Case vbNo
  Folder.MoveHere arg,FOF_RENAMEONCOLLISION + FOF_ALLOWUNDO
 End Select
Else
 Folder.MoveHere arg,FOF_ALLOWUNDO
End If
End Sub
――――――――――――――――――――――――――――――――――――――
ここで、削除の
  Shell.NameSpace(10).MoveHere FolderItem
は非同期なので、
  Do
   WScript.Sleep 100
   Set FolderItem=Folder.ParseName(Name)
   If FolderItem Is Nothing Then Exit Do
  Loop
がないと、タイミングにより、たまに衝突します。
また、
  WScript.Sleep 200
がないと、UNDOの順序が削除、移動でなく移動、削除に逆転します。
このままUNDOを2回すると、元ファイルが消えます。

FOF_ALLOWUNDOは
Set Shell=CreateObject("Shell.Application")
からは、効きません。
Set Shell=ie.Document.Application
からだと、効きます。
Shellには、こういうことがよくあるので、気を付けましょう。


ばんのしゃーによかばんた さん 2005年 02月 18日 17時 34分 06秒

Shell.AddToRecentについて、

Set Shell=CreateObject("Shell.Application")
Shell.AddToRecent ファイルのフルパス

で、存在するファイルと親フォルダがRecentに登録されます。

第二引数は不明。NOP?

存在しないパスはエラー。

URL、フォルダ、数字を指定してもエラーにはならず、NOP。

対応するAPIでは
SHAddToRecentDocs(NULL)でRecentをクリアするようですが、
Shell.AddToRecent 0 はNOP。

――――――――――――――――――――――――――――――――――――――
リンク経由のRecentのメニューにフォルダを載せるには、
その下のファイルをRecentに加える必要があります。

つまり、フォルダを開いただけでは、駄目で、その下のファイルを
開く必要があります。これは、ちょっと残念ですね。

常駐VBSで、フォルダを監視して、未登録フォルダを見つけたら、
その下の先頭ファイルをAddToRecentするというのはどうでしょう?
そのあと先頭ファイルの*.LNKを消せば、フォルダだけ登録できます。
でも、それだったら、Recentを使わず、最初からリンクのサブフォルダに
フォルダの*.LNKを作ればよいですね。

あと、メニューを日時順に並べられたら完璧なんですけど。

――――――――――――――――――――――――――――――――――――――
フォルダのショートカットから開いたフォルダでファイルを開くと、
Recentにフォルダのショートカットそのものが追加されます。
そのくせ、メニューからは見えません。バグ?


ひよこ さん 2005年 02月 18日 14時 01分 10秒

>魔界の仮面弁士 さん 2005年 02月 18日 13時 19分 57秒

バージョンをお知らせするのをすっかり忘れていましたm(__)m
Outlook2000です。

Const olFolderContacts = 10

↑この定数宣言で、出来ました〜〜\(^o^)/

何ともお恥ずかしい・・・
こんなことで掲示板を使ってしまうとは・・・
魔界の仮面弁士 さん、有難うございます!
(^^)

魔界の仮面弁士 さん 2005年 02月 18日 13時 19分 57秒

》ひよこさん 2005年02月18日 10時40分06秒
> 私もエラーが出たときにmyOlAppに変えてやってみました。
私も、事前にmyOlAppに変えて動作確認してから投稿したのですが……。
当方はOutlook 2003環境ですが、そちらのバージョンは何でしょうか?

Option Explicit
Const olFolderContacts = 10
Dim myOlApp, myNameSpace, myFolder, myNewFld, myFld, myItem
Set myOlApp = CreateObject("Outlook.Application")
Set myNameSpace = myOlApp.GetNameSpace("MAPI")
Set myFolder = myNamespace.GetDefaultFolder(olFolderContacts)
Set myNewFld = myFolder.Folders.Add("会社連絡先")
Set myFld = myOlApp.Session.GetDefaultFolder(olFolderContacts).Folders("会社連絡先")
Set myItem = myFld.Items.Add(olContactItem)

> 「操作は完了できませんでした。誤ったパラメータ値があります。」と叱られてしまいます。
『Option Explicit』を利用されていないのでは無いですか?

状況からして、olContactItemを宣言するのをうっかり忘れていて、
10という数値ではなく、Emptyという値が渡してしまっているような……。

jnaka さん 2005年 02月 18日 11時 16分 02秒

ばんのしゃーによかばんた さん。
 :(省略)
>バッチファイルなら、こんな感じです。
 :(省略)

ありがとうございます。
なんか、思惑通りにできそうです。
折角、vbsを勉強しようと思いましたが。。残念。
この機会にvbsでもできるかやってはみます。
ほんとにありがとうございました。

ひよこ さん 2005年 02月 18日 10時 40分 06秒

>魔界の仮面弁士 さん 2005年 02月 17日 20時 55分 50秒
Application → myOlApp ですね。

私もエラーが出たときにmyOlAppに変えてやってみました。
掲示板に投稿する前にヘルプを自分なりに調べてみたのですが、それでも自己解決には至らず、こちらで質問を挙げさせていただいた次第です。

myOlAppに変えると、
「操作は完了できませんでした。誤ったパラメータ値があります。」と叱られてしまいます。
VBScriptの参考になるサイトも検索してみたのですが、
なかなか自分がやりたい情報が掲載されていなく、行き詰まっています。

会社連絡先フォルダを作成した後は、csvファイルをインポートするという手順になります。

何か情報がありましたら、またよろしくお願いします。

魔界の仮面弁士 さん 2005年 02月 17日 20時 55分 50秒

》ひよこさん 2005年02月17日 17時07分47秒
> Set myFld = Application.Session.GetDefaultFolder( _
>  olFolderContacts).Folders("会社連絡先")

Application → myOlApp ですね。

Hisa さん 2005年 02月 17日 19時 19分 31秒

はにめまして、
WSHは初心者です。

以下のようなコードで、管理者権限でリモートのコンピュータで処理を行うようにしたのですが、

ファイルを参照したり、削除したりするスクリプトは正常に実行出来ますが、
Shellを使って、キー送信したりすることが出来ません。

もともと、そういった事は出来ないこととして、あきらめればよいのでしょうか??


// ============== 以下、コードです ================= //

strComputer = "TargetName"
strScript = "実行したいスクリプト.vbs"

set objController = WScript.CreateObject("WshController")
set objRemote = objController.CreateScript(strScript, strComputer)
WScript.Echo "リモートでスクリプトを実行します。"
objRemote.Execute
Do Until objRemote.Status = 2
 WScript.Sleep 100
Loop
WScript.Echo "リモートでの実行は終了しました。"

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

>管理人むたぐち さん 2004年 06月 14日 18時 42分 40秒
>ただ、C:\Documents and Settings\username\Cookiesは「制限付きサイトゾーン」
>ですし、任意のフォルダを制限付きサイトゾーンにする方法が分かれば、
>道が見えてくるかもしれませんね。ぜんぜん外してるかもですが。

任意のフォルダを「制限付きサイトゾーン」にする方法はなさそうです。
フォルダ自体には、印がないようです。
それが証拠に別ユーザのCookiesは「制限付きサイトゾーン」になりません。
きっとレジストリでCookiesと指定したフォルダだけなんでしょう。:-(

※Cookiesは何故「制限付きサイトゾーン」なのでしょう?

理由はさておき、使えれば占めたもの。:-p
Cookiesの下にサブフォルダを作っても、「制限付きサイトゾーン」に
なります。このフォルダのリンクなり、ショートカットを使えば、
任意のフォルダを「制限付きサイトゾーン」にするのと変わりません。:-)

※Cookiesを削除したときどうなるかは未検証。


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

>jnaka さん 2005年 02月 15日 18時 30分 58秒
>バッチファイルではできないと思い、WSHを用い対応したいと考えました。

バッチファイルなら、こんな感じです。

SETLOCAL
SET FROM=C:\FROM
SET TO=C:\TO
FOR /F "tokens=*" %%0 IN ( 'DIR /A-D /B /OD %FROM%\*.* ' ) DO SET FILE=%FROM%\%%0
ECHO %FILE%
rem COPY %FILE% %TO%\
rem DEL %FILE%


ひよこ さん 2005年 02月 17日 17時 07分 47秒

また、つまづいてしまいました・・・(T_T)

VBScriptを実行すると、下記のコードでエラーとなります。
Set myFld = Application.Session.GetDefaultFolder( _
   olFolderContacts).Folders("会社連絡先")
「オブジェクトがありません」'Application'と表示されます。

Outlook連絡先フォルダに「個人用連絡先」フォルダを新規作成するところまでは
実行されています。
ちなみに、OutlookVBAでは動きます。
VBScriptの場合はどのように書いたらよいのでしょうか。

Dim myFld

Set myOlApp = CreateObject("Outlook.Application")
Set myNameSpace = myOlApp.GetNameSpace("MAPI")
Set myFolder = myNamespace.GetDefaultFolder(10)
Set myNewFld = myFolder.Folders.Add("会社連絡先")

'********ここまでOK

Set myFld = Application.Session.GetDefaultFolder( _
   olFolderContacts).Folders("会社連絡先")
Set myItem = myFld.Items.Add(olContactItem)

ひよこ さん 2005年 02月 17日 16時 37分 43秒

>Nomuさん

Split関数ですね。
有難うございます。今調べてみました。
これだと行単位データをカンマ部分で分割し、配列へ格納できそうです。
やってみます(^^)

Nomu さん 2005年 02月 17日 12時 25分 54秒

>ReadLineだと1行全部一気に読み込んでしまいます。
>各項目毎のデータを読み込むのにはどうしたらいいのでしょうか?

CSVでもダブルクオーテーション囲みのCSVとか、
途中に項目区切り以外のカンマがあったらどうします?の話が
ありますが、
一応、そういう問題がないCSVだとして、
Splitを使用します。

ひよこ さん 2005年 02月 16日 14時 49分 51秒

つい最近、VBScriptとなるものを知ったばかりです。
OutlookVBAに書いているコードがあるのですが、これを持ち運びが便利なVBScriptで書けないか勉強している最中です。

csvファイルの内容をMicrosoftOutlookの連絡先へインポートするというVBAがあります。
csvファイルは、[姓][名][姓フリガナ][名前フリガナ][電子メール アドレス][電子メール表示名]の項目とデータが存在します。
これをOutlookの連絡先の項目へ取り込みたいのですが、VBScriptの手法がわかりません。
ReadLineだと1行全部一気に読み込んでしまいます。
各項目毎のデータを読み込むのにはどうしたらいいのでしょうか?
アドバイスをお願いします。

jnaka さん (k_nakamura7@mail.goo.ne.jp) 2005年 02月 15日 18時 30分 58秒

初めまして。
今度Windows2000サーバ上でWSHを使ってファイル操作をしようと思っています。
やりたいことですが、
"とある"フォルダ上に"ある"ファイルを"とある"フォルダにコピーし、コピー後は"ある"該当ファイルを削除したいということです。
ここで書いた"とある"フォルダは固定です。
"とある"フォルダ内には、複数ファイルが存在する可能性があります。
"ある"ファイルは最新日付若しくは当日のファイルが選択させたい。
バッチファイルではできないと思い、WSHを用い対応したいと考えました。
WSHで実装可能でしょうか。
また、参考になるソースを教えて頂ければ、非常に助かります。
以上、ご教示のほど、宜しくお願いします。

ばんのしゃーによかばんた さん 2005年 02月 15日 17時 30分 28秒

>管理人むたぐち さん 2004年 06月 14日 17時 50分 37秒
>余談ですが、Win2000用に作った、folder.htt(htt2000)の機能の一つに、
>表示したフォルダの履歴をcookieに保存し、常時フォルダ内にリンク表示させる
>というのがあったんですけど、これをXPでWSHを使って再現できないか
>考え中だったりします。自分で言うのも何ですが、どうにもあの機能は捨てがたい…。

この機能のニーズですが、
ファイルの履歴なら、「履歴」や「スタート」−「最近使ったファイル」で
見れるのに、フォルダの履歴は見れない、ということでしょうか?

「最近使ったファイル」を見ると、フォルダのリンクも存在するので、
「スタート」−「最近使ったファイル」でフォルダも表示する設定が
どこかにありそうな気がします。

それは扨措き、「最近使ったファイル」の隠しファイル属性を外して、
「フォルダのショートカット」(リンクでないほう)を「リンク」に置くと、
こっちからだと、フォルダも表示されます。
ただ、名前順なので、ちょっと使いにくい。
日時降順に表示できないものでしょうか。
右クリックすると、「名前順で並び替え」なんてありますが、
そうする前から、既に名前順です。

それから、「最近使ったファイル」を見ると、同じ名前+(n)がいっぱい
ありますが、これは、どういう意味/目的があるのでしょう。
「リンク」から見ると、(n)なしだけが見えます。

元に戻って、Explorerの代わりにIEを使って、DocumentCompleteで
フォルダの履歴を採ることは可能でしょうが、Explorerの起動契機が
いろいろあって、それら全部を置き換えるのは無理そう。
なら、常時監視して、Explorerが立ち上がったら、止めて、
代わりにIEを起動する。なんてね。


ばんのしゃーによかばんた さん 2005年 02月 15日 17時 30分 07秒

デスクトップで、アイコンの順序は↓↓なのに、
アイコンを複数選択するとき、シフトキーで複数選択すると、


の順序なのです。変。というか、使えない。:-<


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

>ちゃっぴ さん 2005年 02月 13日 19時 07分 19秒
>Internet Zone の設定は下記 Registry Pathになります

早速、使わせて頂きます。
――――――――――――――――――――――――――――――――――――――
Option Explicit

Dim Zones:Zones=Array(_
Array("0:マイ コンピュータ",0),_
Array("1:イントラネット",1),_
Array("2:信頼済みサイト",2),_
Array("3:インターネット",1),_
Array("4:制限付きサイト",1))

Dim Levels:Levels=Array(_
Array(&H00000000,"カスタム"),_
Array(&H00012000,"高"),_
Array(&H00011000,"中"),_
Array(&H00010500,"中低"),_
Array(&H00010000,"低"),_
Array(&HFFFFFFFF,"エラー"))

Dim wShell
Dim rows(4)
Dim k,LH,LN

Set wShell=CreateObject("WScript.Shell")

For k=0 To 4
LH=RegRead(k)
LN=Level(LH)
rows(k)=Join(Array(Zones(k)(0),Levels(LN)(1),LN=Zones(k)(1)),vbTab)
Next

WScript.Echo Join(rows,vbCrLf)

Function RegRead(n)
RegRead=wShell.RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\"&n&"\CurrentLevel")
End Function

Function Level(LH)
Dim LN
For LN=0 To 4
If Lh=Levels(LN)(0) Then Exit For
Next
Level=LN
End Function


めろこ さん 2005年 02月 14日 18時 29分 54秒

初めまして。いつも参考にさせて頂いてます。
質問なのですが、「タスクバーとスタートメニューのプロパティ」にある
「クリア」ボタンの機能をWSHで実現することは可能でしょうか?
(このサイトを参考し、最近使ったファイルの削除は実装できました。)
何か参考になるソースを教えていただけたらありがたいです。
よろしくお願い致します。

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

hta.commandlineをばらします。
CScript.EXEの実際のばらし方に近づけました。
このルールは意外でした。思っていたのとはだいぶ違います。

CScript.EXEのばらし方はCMD.EXEに近く、
Replace(c,"""","")の有無の違いだけのようです。

<html><head><hta:application id="hta"><script language="VBScript">
alert "'"&hta.commandline&"'"
argv=splitcommandline(hta.commandline)
for k=0 to ubound(argv)
argv(k)="'"&argv(k)&"'"
next
alert join(argv,vbcrlf)
close

Function splitcommandline(commandline)
Dim f:f=False
Dim r:r=""
Dim k,c,s
s=Trim(commandline)
For k=1 To Len(s)
 c=Mid(s,k,1)
 If c="""" Then f=Not f
 If f Then If c=" " Then c=vbNullChar
 r=r & c
Next
s=Split(r," ")
r=Array()
k=-1
For Each c In s
 If Len(c) Then
  k=k+1
  ReDim Preserve r(k)
  r(k)=Replace(Replace(c,"""",""),vbNullChar," ")
 End If
Next
splitcommandline=r
End Function
</script></head><body></body></html>


ちゃっぴ さん 2005年 02月 13日 19時 07分 19秒

ばんのしゃーによかばんた さん 2005年 02月 13日 16時 37分 57秒
> インターネットゾーンのセキュリティレベルを一時的に下げて、
> 戻すのを忘れると、とっても危険です。
> セキュリティレベルをチェックする方法はないものでしょうか。
> レジストリはなんか複雑です。

Internet Zone の設定は下記 Registry Pathになります。

[HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones]

ここのSubKeyはこのようになります。

0: マイ コンピュータ(表示されない)
1: イントラネット
2: 信頼済みサイト
3: インターネット
4: 制限付きサイト

LevelのEntryは下記になります。

Current Level: 0x00012000 高
       : 0x00011000 中
       : 0x00010500 中低
       : 0x00010000 中低
       : 0x00000000 カスタム

ただ、ZoneのSecurity設定を下げるよりも、必要なものは
「信頼済みサイト」とか「イントラネット」に加えてやるほうを
お勧めしますがね。

ばんのしゃーによかばんた さん 2005年 02月 13日 16時 38分 42秒

私なりに整理してみました。

まず、用語が紛らわしいので、同じものと、違うものを区別します。
値型バリアント型、VT_BYREFなしVT_*、は同じ。
参照型バリアント型、VT_BYREF付きVT_*、は同じ。
ポインタ(渡し)、VARIANT *lpvar、LPVARIANT lpvar、は同じ。
値渡し,ByVal、[in]、は同じ。
参照渡し、ByRef、[in,out]、は同じ。
値渡し、値型バリアント型、は別。
参照渡し、参照型バリアント型、ポインタ(渡し)、は別。

構造的には、スタックに何が置かれているか、ポインタが何を指しているか、
により、4パターンあるようです。
[A]値型バリアント型
[B]参照型バリアント型->参照先の型
[C]ポインタ->値型バリアント型
[D]ポインタ->参照型バリアント型->参照先の型

Caller側のVBScriptはスタックに次のように置きます。
式     [A]値型バリアント型
変数     [C]ポインタ->値型バリアント型

Callee側のInvokeVerbやExecWBの定義は、
InvokeVerb(VARIANT var)
これは、スタックにバリアント型が渡りますが、
[A]値型バリアント型
または、
[B]参照型バリアント型->参照先の型
の両ケースを含み、定義からは区別できません。

ExecWB(,,VARIANT *lpvar)
これは、LPVARIANT lpvar と同じ。
これは、スタックにバリアント型へのポインタが渡りますが、
[C]ポインタ->値型バリアント型
または、
[D]ポインタ->参照型バリアント型->参照先の型
の両ケースを含み、定義からは区別できません。

CallerとCalleeの間を仲介するのが連邦保安官?で、
(?何と言うのかよく分からないので?)

CallerとCalleeの組合せは、2 x 2 = 4 パターン

[1,1]
式     Callerスタックの[A]値型バリアント型

InvokeVerb(VARIANT var)
に渡すときは、Calleeスタックのバリアント型にそのままコピー、
[A]値型バリアント型
になります。

[2,1]
変数     Callerスタックの[C]ポインタ->値型バリアント型

InvokeVerb(VARIANT var)
に渡すときは、Calleeスタックのバリアント型の中にポインタを突っ込んで、
[B]参照型バリアント型->参照先の型
になります。

[1,2]
式     Callerスタックの[A]値型バリアント型

ExecWB(,,VARIANT *lpvar)
に渡すときは、Calleeスタックのポインタに
[C]ポインタ->値型バリアント型
になります。

[2,2]
変数     Callerスタックの[C]ポインタ->値型バリアント型

ExecWB(,,VARIANT *lpvar)
に渡すときは、Calleeスタックのポインタにポインタをコピーして、
[C]ポインタ->値型バリアント型
になります。

――――――――――――――――――――――――――――――――――――――
このうち、[2,1]のケースが問題で、
InvokeVerb(VARIANT var)
は、実際は、
[A]値型バリアント型
を期待しているのに、
連邦保安官は、参照型バリアント型もバリアント型の内、とばかりに、
[B]参照型バリアント型->参照先の型
を渡してくるのです。全く官僚的な奴。
Callerが折角、
変数     Callerスタックの[C]ポインタ->値型バリアント型
を渡しているのだから、ポインタの先の値型バリアント型をCalleeに
くれればよいのに。全く気の利かない奴。

官僚的な連邦保安官に苦しむ庶民の値渡しでの自衛策は、
変数を渡すな、括弧で囲んで式で渡せ、となります。

余計分からないって?:-p

参照渡し、事前バインディングについては未整理。

――――――――――――――――――――――――――――――――――――――
補足。
値渡し(ByVal)と参照渡し(ByRef)には、意味的用語で、構造的用語と区別します。
               意味          構造
値渡し(ByVal)          [in]          (型名 var)
参照渡し(ByRef)          [in,out]     ポインタ渡し(型名 *lpvar)

「参照渡し」は、「ポインタ渡し」でないと出来ませんが、
「ポインタ渡し」でも、「値渡し」は可能。
「参照渡し」は連邦保安官が両者のスタック間でコピーバックしてます。
コピーバックしなければ、「ポインタ渡し」でも「値渡し」になります。

――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 02月 13日 16時 37分 57秒

インターネットゾーンのセキュリティレベルを一時的に下げて、
戻すのを忘れると、とっても危険です。
セキュリティレベルをチェックする方法はないものでしょうか。
レジストリはなんか複雑です。

そこで、手っ取り早く確認する方法。
InternetZone.HTM
――――――――――――――――――――――――――――――――――――――
<!-- saved from url=(0011)about:blank -->
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=shift_jis">
<BODY ONLOAD="alert(document.body.innerText='危険な設定です!:-(');">
安全な設定です。:-)</BODY></HTML>
――――――――――――――――――――――――――――――――――――――
注意。これを保存するとき、
<!-- saved from url=(0011)about:blank -->
の末尾に空白があると駄目です。
-->の直後を改行にしてください。


蒼那 憐 さん 2005年 02月 13日 03時 05分 18秒

>ばんのしゃーによかばんたさん
ありがとうございます。
そういった方法もあるのですね(^^;

しかしまぁ・・・ネットワーク周りの変更とかのスクリプトを組んでますが
微妙なオプションによっての挙動やら、細かい点に悩まされております。
なかなかに、Windowsは曲者だと痛感してます(^^:

ばんのしゃーによかばんた さん 2005年 02月 12日 19時 39分 08秒

IEをパイプ代わりに使う。

SP2からセキュリティ強化のため、WSHとIEの併せ技が難しくなりました。
一方、WSHとHTAの連携は、と言えば、標準入出力のパイプ以外は難しく、
それも自由度がないので、あまり使えません。
そこで、IEをパイプ代わりにして、WSH-(IE)-HTAの連携を試してみました。

A.VBS
――――――――――――――――――――――――――――――――――――――
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.Title="pipe"
Set wShell=CreateObject("WScript.Shell")
wShell.Run Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"."))&"HTA"
ie.Document.body.innerText="MsgBox ie.Document.Title"
Do While ie.Document.body.innerText<>""
 WScript.Sleep 1000
Loop
ie.Document.body.innerText="close"
Do While ie.Document.body.innerText<>""
 WScript.Sleep 1000
Loop
ie.Quit
――――――――――――――――――――――――――――――――――――――
A.HTA
――――――――――――――――――――――――――――――――――――――
<script language="VBscript">
Set Shell=CreateObject("Shell.Application")
For Each ie In Shell.Windows
 If ie.Document.title="pipe" Then Exit For
Next
If IsEmpty(ie) Then
 alert "ie not found."
 close
End If
setInterval "proc",1000
Sub proc()
If ie.Document.body.innerText<>"" Then
Execute ie.Document.body.innerText
ie.Document.body.innerText=""
End If
End Sub
</script>
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 02月 12日 19時 38分 44秒

>蒼那 憐 さん 2005年 02月 04日 01時 22分 45秒
>WSHであれば『Wscript.Sleep』を利用して処理の停止時間を作成できますが
>HTAで同様の処理を行う方法って、あるのでしょうか?

WScriptの機能で、他の環境に無くて困るのはWScript.Sleepですね。
HTM/HTAには代替手段がありますが、WSCではどうするんでしょうね?

邪道ですが、
CreateObject("WScript.Shell").Run "Sleep.VBS",,True
Sleep.VBSはWScript.Sleepするだけ。
という手もあります。

同じく、邪道で、
CreateObject("WScript.Shell").PopUp "Sleeping",sec
という手が使える環境もありますが、HTM/HTAでは駄目みたいです。
スレッド制御の絡みで、HTM/HTAではタイマが使えないのでしょうか
Sun Solarisで、用語は?ですが、論理スレッド(?)でCPU時間を計測したら
ぐちゃぐちゃで、物理スレッド(?)を割り付けたことがありました。


管理人むたぐち さん 2005年 02月 12日 18時 15分 11秒

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

そうなんですけど、スクリプトを見ていただければわかるように、
現在はサービスモードではなく、アプリケーションモードで動作させていますので、httpd自体は比較的安定してるんです。
ただ、なぜか設定画面を開くと強制終了することがあるのは、
まだ治ってないんですけど(汗

httpd自体が死ぬ頻度が増えたら、その対策もしようと思います。

ばんのしゃーによかばんた さん 2005年 02月 12日 18時 02分 22秒

>管理人むたぐち さん 2005年 02月 10日 19時 01分 39秒
>AnHTTPDのCGIが落ちている(500エラーを返す)ときに、AnHTTPDを再起動するスクリプトです。

これだと、
ハングってるときは、再起動されますが、
死んでるときは、エラーになって、再起動されないのでは?


Return