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
以前、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
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
起動している HTA(*.hta) の InternetExplorer Object(WebBrowser Object)を取得することはできないでしょうか?
》タイガージェットシーンさん 2005年03月02日 11時55分08秒
> Set oExec = wShell.Exec("cmd.exe /c ping strIP")
Set oExec = wShell.Exec("cmd.exe /c ping " & strIP)
かな。
管理人により削除
VBSプログラム中のinputboxから入力された値をコマンドプロンプトに
引渡したいのですが、どのようにおこなえばよろしいでしょうか。
以下のような感じを想定しているのですが。。。
strIP = InputBox("IPアドレスを入力して下さい。", default)
Set wShell = CreateObject("WScript.Shell")
Set oExec = wShell.Exec("cmd.exe /c ping strIP")
MsgBox oExec.StdOut.ReadAll()
宜しくお願いします。
管理人により削除
管理人により削除
mp3_autofill.vbsを更新しました。
無視リストに書かれたフォルダ名が無視されないバグを修正。
自分で毎日使っていて、ようやく気づいたという…
以前はお世話になりました。
また、質問させてください。
現在、Excelを二つ起動していて、二番目に起動したExcelを取得したいのですが、その方法はあるでしょうか?
現在は、GetObject(,"Excel.Application")で取得しているのですが、最初のものしか取得できません。
よろしくお願いいたします。
環境 WinXP,Excel2003
訂正:
暗記しているものを書いては駄目ですね。
制限付きサイト
<!-- saved from url=(0007)http:// -->
です。
URLのように大文字では駄目です。
他のゾーンも同様です。失礼いたしました。
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"をお手製で作っておくことが可能です。
以上です。スレッド本来の話の流れから逸脱していますが、
興味深いかもしれないと思いましてご紹介させて頂きました。
--
門外漢
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
――――――――――――――――――――――――――――――――――――――
標準入出力が使えるかどうかの判定方法について。
実際に書いてみて、エラーになるかどうか、しか方法はなかったですよね。
しかし、書いてみるまで分からないというのはとっても使いにくいです。:-(
WSH5.6で、IsEmpty(WScript.StdIn)で判定できるようになった、
と思ったのですが、今、確認すると駄目ですね。変わったみたい。
通常はWScript.FullNameがCScript/WScriptの判定で代用してますが、
WScriptでも標準入出力が使えることがあるので、正確ではありません。
他に方法はないものかと探してみたところ、
Set StdIn=fso.GetStandardStream(0,True)
がエラーになるかどうかで、判定できました。:-)
XP SP2 WSH5.6以外の環境で使えるかどうかは不明です。
また、そのうち、変わるかも知れません。:-p
To: ばんのしゃーによかばんた さん 2005年 02月 15日 17時 30分 28秒
> この機能のニーズですが、
> ファイルの履歴なら、「履歴」や「スタート」−「最近使ったファイル」で
> 見れるのに、フォルダの履歴は見れない、ということでしょうか?
いえ、実際に使ってみないとこの機能の使いやすさは分からないかもしれないです。
よく使うフォルダのリンクが、動的にフォルダ内に生成されるのが味噌です。
汎用に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>
= > >= < <= <> & | *
<DIV ID="TR"></DIV>
</BODY></HTML>
――――――――――――――――――――――――――――――――――――――
※ところで、TDCを使うには、CSVファイルを作らないと駄目なんでしょうか。
ソートや絞込みの出来るテーブルをCSVファイルなしに作れないものでしょうか。
>魔界の仮面弁士さん
有意義な情報ありがとうございました。
BuildPathは、文字を、間にPathを入れてつなぐというものですね。
機会があれば利用させていただきます。
ありがとうございました
》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といいます。
初歩的な質問で申し訳ないですが、よろしくお願いします。
ExcelのVBAですと "\" を呼び出すのに、Application.PathSeparator というのを利用していたのですが、VBSでも同じようなものはあるでしょうか?
また、Application.PathSeparator等を使うことの意味はあるのでしょうか?
現在、私はExcelのVBAを主に利用しているのですが、Excelのツールバーの表示非表示を立ち上げ時に管理するため、VBSを利用して、Excel11.xlbのコピー、Excelの再起動、等をしようとしています。その中で、フォルダ名の連結に"\"を使おうと思ったのですが、どのように呼び出せばいいのかわかりませんでした。単純に"\"と入力すれば実現はできるのですが、VBAでは、Application.PathSeparatorを利用していたので、少し気になったもので。
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
コンソールコマンドを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
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には、こういうことがよくあるので、気を付けましょう。
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日 13時 19分 57秒
バージョンをお知らせするのをすっかり忘れていましたm(__)m
Outlook2000です。
Const olFolderContacts = 10
↑この定数宣言で、出来ました〜〜\(^o^)/
何ともお恥ずかしい・・・
こんなことで掲示板を使ってしまうとは・・・
魔界の仮面弁士 さん、有難うございます!
(^^)
》ひよこさん 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という値が渡してしまっているような……。
ばんのしゃーによかばんた さん。
:(省略)
>バッチファイルなら、こんな感じです。
:(省略)
ありがとうございます。
なんか、思惑通りにできそうです。
折角、vbsを勉強しようと思いましたが。。残念。
この機会にvbsでもできるかやってはみます。
ほんとにありがとうございました。
>魔界の仮面弁士 さん 2005年 02月 17日 20時 55分 50秒
Application → myOlApp ですね。
私もエラーが出たときにmyOlAppに変えてやってみました。
掲示板に投稿する前にヘルプを自分なりに調べてみたのですが、それでも自己解決には至らず、こちらで質問を挙げさせていただいた次第です。
myOlAppに変えると、
「操作は完了できませんでした。誤ったパラメータ値があります。」と叱られてしまいます。
VBScriptの参考になるサイトも検索してみたのですが、
なかなか自分がやりたい情報が掲載されていなく、行き詰まっています。
会社連絡先フォルダを作成した後は、csvファイルをインポートするという手順になります。
何か情報がありましたら、またよろしくお願いします。
》ひよこさん 2005年02月17日 17時07分47秒
> Set myFld = Application.Session.GetDefaultFolder( _
> olFolderContacts).Folders("会社連絡先")
Application → myOlApp ですね。
はにめまして、
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 "リモートでの実行は終了しました。"
>管理人むたぐち さん 2004年 06月 14日 18時 42分 40秒
>ただ、C:\Documents and Settings\username\Cookiesは「制限付きサイトゾーン」
>ですし、任意のフォルダを制限付きサイトゾーンにする方法が分かれば、
>道が見えてくるかもしれませんね。ぜんぜん外してるかもですが。
任意のフォルダを「制限付きサイトゾーン」にする方法はなさそうです。
フォルダ自体には、印がないようです。
それが証拠に別ユーザのCookiesは「制限付きサイトゾーン」になりません。
きっとレジストリでCookiesと指定したフォルダだけなんでしょう。:-(
※Cookiesは何故「制限付きサイトゾーン」なのでしょう?
理由はさておき、使えれば占めたもの。:-p
Cookiesの下にサブフォルダを作っても、「制限付きサイトゾーン」に
なります。このフォルダのリンクなり、ショートカットを使えば、
任意のフォルダを「制限付きサイトゾーン」にするのと変わりません。:-)
※Cookiesを削除したときどうなるかは未検証。
>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%
また、つまづいてしまいました・・・(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)
>Nomuさん
Split関数ですね。
有難うございます。今調べてみました。
これだと行単位データをカンマ部分で分割し、配列へ格納できそうです。
やってみます(^^)
>ReadLineだと1行全部一気に読み込んでしまいます。
>各項目毎のデータを読み込むのにはどうしたらいいのでしょうか?
CSVでもダブルクオーテーション囲みのCSVとか、
途中に項目区切り以外のカンマがあったらどうします?の話が
ありますが、
一応、そういう問題がないCSVだとして、
Splitを使用します。
つい最近、VBScriptとなるものを知ったばかりです。
OutlookVBAに書いているコードがあるのですが、これを持ち運びが便利なVBScriptで書けないか勉強している最中です。
csvファイルの内容をMicrosoftOutlookの連絡先へインポートするというVBAがあります。
csvファイルは、[姓][名][姓フリガナ][名前フリガナ][電子メール アドレス][電子メール表示名]の項目とデータが存在します。
これをOutlookの連絡先の項目へ取り込みたいのですが、VBScriptの手法がわかりません。
ReadLineだと1行全部一気に読み込んでしまいます。
各項目毎のデータを読み込むのにはどうしたらいいのでしょうか?
アドバイスをお願いします。
初めまして。
今度Windows2000サーバ上でWSHを使ってファイル操作をしようと思っています。
やりたいことですが、
"とある"フォルダ上に"ある"ファイルを"とある"フォルダにコピーし、コピー後は"ある"該当ファイルを削除したいということです。
ここで書いた"とある"フォルダは固定です。
"とある"フォルダ内には、複数ファイルが存在する可能性があります。
"ある"ファイルは最新日付若しくは当日のファイルが選択させたい。
バッチファイルではできないと思い、WSHを用い対応したいと考えました。
WSHで実装可能でしょうか。
また、参考になるソースを教えて頂ければ、非常に助かります。
以上、ご教示のほど、宜しくお願いします。
>管理人むたぐち さん 2004年 06月 14日 17時 50分 37秒
>余談ですが、Win2000用に作った、folder.htt(htt2000)の機能の一つに、
>表示したフォルダの履歴をcookieに保存し、常時フォルダ内にリンク表示させる
>というのがあったんですけど、これをXPでWSHを使って再現できないか
>考え中だったりします。自分で言うのも何ですが、どうにもあの機能は捨てがたい…。
この機能のニーズですが、
ファイルの履歴なら、「履歴」や「スタート」−「最近使ったファイル」で
見れるのに、フォルダの履歴は見れない、ということでしょうか?
「最近使ったファイル」を見ると、フォルダのリンクも存在するので、
「スタート」−「最近使ったファイル」でフォルダも表示する設定が
どこかにありそうな気がします。
それは扨措き、「最近使ったファイル」の隠しファイル属性を外して、
「フォルダのショートカット」(リンクでないほう)を「リンク」に置くと、
こっちからだと、フォルダも表示されます。
ただ、名前順なので、ちょっと使いにくい。
日時降順に表示できないものでしょうか。
右クリックすると、「名前順で並び替え」なんてありますが、
そうする前から、既に名前順です。
それから、「最近使ったファイル」を見ると、同じ名前+(n)がいっぱい
ありますが、これは、どういう意味/目的があるのでしょう。
「リンク」から見ると、(n)なしだけが見えます。
元に戻って、Explorerの代わりにIEを使って、DocumentCompleteで
フォルダの履歴を採ることは可能でしょうが、Explorerの起動契機が
いろいろあって、それら全部を置き換えるのは無理そう。
なら、常時監視して、Explorerが立ち上がったら、止めて、
代わりにIEを起動する。なんてね。
デスクトップで、アイコンの順序は↓↓なのに、
アイコンを複数選択するとき、シフトキーで複数選択すると、
→
→
の順序なのです。変。というか、使えない。:-<
>ちゃっぴ さん 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
初めまして。いつも参考にさせて頂いてます。
質問なのですが、「タスクバーとスタートメニューのプロパティ」にある
「クリア」ボタンの機能をWSHで実現することは可能でしょうか?
(このサイトを参考し、最近使ったファイルの削除は実装できました。)
何か参考になるソースを教えていただけたらありがたいです。
よろしくお願い致します。
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日 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設定を下げるよりも、必要なものは
「信頼済みサイト」とか「イントラネット」に加えてやるほうを
お勧めしますがね。
私なりに整理してみました。
まず、用語が紛らわしいので、同じものと、違うものを区別します。
値型バリアント型、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)
「参照渡し」は、「ポインタ渡し」でないと出来ませんが、
「ポインタ渡し」でも、「値渡し」は可能。
「参照渡し」は連邦保安官が両者のスタック間でコピーバックしてます。
コピーバックしなければ、「ポインタ渡し」でも「値渡し」になります。
――――――――――――――――――――――――――――――――――――――
インターネットゾーンのセキュリティレベルを一時的に下げて、
戻すのを忘れると、とっても危険です。
セキュリティレベルをチェックする方法はないものでしょうか。
レジストリはなんか複雑です。
そこで、手っ取り早く確認する方法。
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 -->
の末尾に空白があると駄目です。
-->の直後を改行にしてください。
>ばんのしゃーによかばんたさん
ありがとうございます。
そういった方法もあるのですね(^^;
しかしまぁ・・・ネットワーク周りの変更とかのスクリプトを組んでますが
微妙なオプションによっての挙動やら、細かい点に悩まされております。
なかなかに、Windowsは曲者だと痛感してます(^^:
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月 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時間を計測したら
ぐちゃぐちゃで、物理スレッド(?)を割り付けたことがありました。
To: ばんのしゃーによかばんた さん
そうなんですけど、スクリプトを見ていただければわかるように、
現在はサービスモードではなく、アプリケーションモードで動作させていますので、httpd自体は比較的安定してるんです。
ただ、なぜか設定画面を開くと強制終了することがあるのは、
まだ治ってないんですけど(汗
httpd自体が死ぬ頻度が増えたら、その対策もしようと思います。
>管理人むたぐち さん 2005年 02月 10日 19時 01分 39秒
>AnHTTPDのCGIが落ちている(500エラーを返す)ときに、AnHTTPDを再起動するスクリプトです。
これだと、
ハングってるときは、再起動されますが、
死んでるときは、エラーになって、再起動されないのでは?