>シロウト さん 2005年 04月 14日 11時 07分 34秒
>ペイントで印刷すると、めちゃいっぱい用紙を食うのですよ...。
>印刷結果を見てビックリするような細切れ状態です。
>できればIEで印刷するように、一枚とかにまとめて欲しいんですよねぇ。
さて次は、イメージを印刷する場合です。
printHTML.HTAでそのまま出来そうなものですが、なぜか駄目です。
表示は出来るのに、印刷は駄目。なぜなんだ?
なので、これならどうだ!こっちはいいみたい。なぜだか、よく分かりません。
MSHTA.EXE printIMG.HTA imagefile
printIMG.HTA
――――――――――――――――――――――――――――――――――――――
<html><head><hta:application id="hta"><script language="VBScript">
Sub dhtmled_DocumentComplete()
argv=split(hta.commandline,"""")
If UBound(argv)>2 Then src=argv(3) Else src=Trim(argv(2))
dhtmled.DOM.body.innerHTML="<img src="""&src&"""></img>"
dhtmled.printDocument
setTimeout "close",10000
End Sub
</script></head><body>
<object id="dhtmled" classid="clsid:2D360200-FFF5-11D1-8D03-00A0C959BC0A">
</object></body></html>
――――――――――――――――――――――――――――――――――――――
>ばんのしゃーによかばんた さん 2005年 05月 19日 16時 48分 41秒
><html><head><script language="VBScript">
すんません。訂正。
アップするときに手を入れると、必ずと言ってよいほど、ミスりますね。
<html><head><hta:application id="hta"><script language="VBScript">
さらに、印刷待ち合わせを「プリンタとFAX」フォルダのドキュメント数の変化で
代替してみました。まだ不正確です。
printHTML.HTA
――――――――――――――――――――――――――――――――――――――
<html><head><hta:application id=hta><script language="VBScript">
Set Folder=CreateObject("Shell.Application").NameSpace(4)
Dim Jobs
Sub window_onload()
argv=split(hta.commandline,"""")
If UBound(argv)>2 Then src=argv(3) Else src=Trim(argv(2))
dhtmled.loadDocument src
End Sub
Sub dhtmled_DocumentComplete()
Jobs=GetJobs()
dhtmled.printDocument
setTimeout "printComplete",100
End Sub
Sub printComplete()
If GetJobs()=Jobs Then
setTimeout "printComplete",100
Else
close
End If
End Sub
Function GetJobs()
Dim k,n
For k=1 To Folder.Items.Count-1
Set FolderItem=Folder.Items.Item(k)
n=n+Folder.GetDeTailsOf(FolderItem,1)
Next
GetJobs=n
End Function
</script></head><body>
<object id="dhtmled" classid="clsid:2D360200-FFF5-11D1-8D03-00A0C959BC0A">
</object></body></html>
――――――――――――――――――――――――――――――――――――――
ところで、デフォルトプリンタ名を知る方法ってなかったでしょうか?
SetDefaultPrinterがあるのに、GetDefaultPrinterがありません。なんで?
それが分かればもう少し精度が上がるのですが。。。
To:管理人様
>へろ さん 2002年 10月 02日 21時 26分 10秒 でも同じ質問が出ていますが、回答は得られていないようですね。
そうなんです。一応だいぶ調べてみたのですが、ひっかかったのはへろさんのだけで、回答はなかったです。
色々調べてみたのですが、どうしても問題の切り分けができないのです。
追伸:windows2000でも同じソースで動作するPCを見つけたのですが、dllのバージョンも同じなのに。。。
今の環境ではエラーになってしまいます><
To: シーズー大好き さん
> リモートで実行するスクリプトを作成しています。
> 以下のスクリプトをWindows2000で走らせると問題なく実行できるのですが、
> WindowsXPで実行すると132行目、
>
> set objRemote = objController.CreateScript(strScript, strComputer)
>
> の行頭で"致命的なエラーです。コード:8000FFFF ソース:(null)"と言われ、終了してしまいます。
@IT:運用 Windows管理者のためのWindows Script Host入門 第9回 WshControllerオブジェクトの詳細
http://www.atmarkit.co.jp/fwin2k/operation/wsh09/wsh09_02.html
によると、
> なお、以上はセキュリティを確保するための仕様だが、マイクロソフトが同社のサポート技術情報として公表している情報によれば、Windows XPでは、リモート・スクリプトのセットアップが初期状態では正常に行われていないバグがあり、リモート・スクリプトを実行するには、コマンドプロンプトであらかじめ「wscript -regserver」コマンドを実行しておかなければならない。従ってWindows XPについては、何らかの方法であらかじめコマンドを実行しておく必要がある。
ということらしいです。これをやってみてはいかがでしょうか。
To: bia さん
へろ さん 2002年 10月 02日 21時 26分 10秒 でも同じ質問が出ていますが、回答は得られていないようですね。
# ADSIの質問に強いコミュニティってどこかあったかなぁ?
すいません、VBSではなくVBAなのですがどうしても問題解決せず、何かしらの情報を得れればと思い書き込ませていただきます。
現在、ADSIを利用してクライアントからActiveDirectoryのドメインユーザパスワードをリセットするツールを作成しています。
LDAPで接続はするのですが、どうしてもSetPasswordにてエラーが発生してしまいます。
ChangePasswordでは処理が通るのですが、元パスワードがわからない状況を考えるとSetPasswordで行う必要があります。
対処法など知ってる人がいれば御教え願えないでしょうか。
ちなみに、WindowsXPの環境では同じもので問題なく動作します。
上記のことから、環境によって影響を受けているのではないかと推測しているのですが、切り分けができません。
どうか、よろしく御願いいたします。
環境
サーバ windows server2003
クライアント windows 2000SP4
office2000のVBAを使用
エラー
-2147023570 オートメーション エラーです。
ユーザー名を認識できないか、またはパスワードが間違っています。
To: endless さん
アドホックな解法になりますが、こんなのはどうでしょう。
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run "notepad.exe"
sPass="Password999"
For I=1 To Len(sPass)
WshShell.AppActivate "メモ帳"
WScript.Sleep 100
WshShell.SendKeys Mid(sPass,I,1)
Next
To ちゃっぴ様
ご指摘の通りXP SP2の展開をSampleとして書きました
ちょっとだけ環境を説明させてもらうと
SUSは導入されていてDomainにも参加していますが
LAN回線が細いためCDからの適用を検討中なのです
また同時に適用しようとしているプログラムが5つくらいあるので
ローカルで処理を完了させたいのです
To endless さん 2005年 05月 20日 00時 44分 41秒
よくみたら、XPSP2の展開を行っているようですが・・・
SUSとかSMSを導入すれば、そもそもこういったScriptを
作る必要すらないと思いますが・・・
もっとも、Domainに参加していない場合、SUSの設定(Registry)の展開を
Script等で行ってやる必要がありますが・・・
あと、WMI使ってRemoteからCallしてやったほうが楽でしょう。
(GUIが絡むとダメですが・・・)
To ちゃっぴ様
>Taskに登録しておいて、実行とか?
>SendKeyでは安定動作は無理でしょう。
アドバイスありがとうございます。
Taskに登録ですか?勉強不足で具体的にイメージできませんが
いろいろ調べてみます。
Sample等、ご教授いただければ幸いですが...
宜しくお願いします。
To ばんのしゃーによかばんた さん 2005年 05月 19日 16時 48分 41秒
> 問題は、印刷の待ち合わせ方法がないことです。
> 上では、10秒待ってますが、いい方法はないものでしょうか?
WMIでPrinterJob StatusのEventを取得するってのはどうでしょう?
With GetObject("winmgmts:\\.\root\cimv2").ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent" & _
" WITHIN .5 WHERE TargetInstance ISA 'Win32_PrintJob'")
.NextEvent 30000
End With
> ばんのしゃーによかばんた さん 2005年 05月 18日 16時 11分 26秒
なるほど、その手がありましたね。
> endless さん 2005年 05月 19日 22時 46分 20秒
Taskに登録しておいて、実行とか?
SendKeyでは安定動作は無理でしょう。
はじめまして
ご助力の程、お願いします
WindowsXPでの話です
RunasとSendKeysを使用してPowerUserでローカルのアドミン権限を使用し
プログラムを実行したいのですが以下の記述では安定稼動しません
5回に1回くらいしか正しくパスワードが入力されません
と言うかSendKeysのEnter処理の前にDOS窓が閉じてしまいます
DOS窓にメッセージが表示されているようですが速くて読み取れません
Senkeysを使用せずに手入力すれば安定動作するのですが...
安定動作もしくは他の手立ては無いでしょうか?
Dim WshSHell
Set WshShell = Wscript.CreateObject("Wscript.Shell")
Dim objWshNetwork
Set objWshNetwork = WScript.CreateObject("WScript.Network")
Dim PC_Name
PC_Name = ObjWshNetwork.computername
WshShell.Run "Runas /User:" & PC_Name & "\Administrator ""E:\Package\Xpsp2.exe /q /n /f"
Wscript.Sleep 3000
WshShell.SendKeys "Password999"
Wscript.Sleep 3000
WshShell.SendKeys "{ENTER}"
>シロウト さん 2005年 04月 18日 12時 23分 39秒
>WshShell.Run("rundll32.exe c:\WINNT\system\MSHTML.DLL,PrintHTML
""D:\p.html"" ""Canon LASER SHOT LBP-1210""")
>と実行しているんですが、
>どうしても印刷ダイアログが出てきます。
以下なら、印刷ダイアログも出ず、ウィンドウのない環境で印刷できました。
MSHTA.EXE PrintHTML.HTA htmlfile
PrintHTML.HTA
――――――――――――――――――――――――――――――――――――――
<html><head><script language="VBScript">
Sub body1_onload()
argv=split(hta.commandline,"""")
If UBound(argv)>2 Then src=argv(3) Else src=Trim(argv(2))
dhtmled.loadDocument src
End Sub
Sub dhtmled_DocumentComplete()
dhtmled.printDocument
setTimeout "close",10000
End Sub
</script></head><body onload="body1_onload()">
<object id="dhtmled" classid="clsid:2D360200-FFF5-11D1-8D03-00A0C959BC0A">
</object></body></html>
――――――――――――――――――――――――――――――――――――――
DHTMLEDのPrintDocumentを使用します。
問題は、印刷の待ち合わせ方法がないことです。
上では、10秒待ってますが、いい方法はないものでしょうか?
管理人により削除
>ちゃっぴ さん 2005年 01月 12日 02時 04分 47秒
>> XP Home Editionユーザは、Logoff/Shutdownスクリプトの
>> 恩恵を受けられないってことですね。:-<
>WMIにWin32_ComputerShutdownEvent Classというのがあったので
>それがつかえないかな〜と思ってTryしてみたんですけど
>Event取得できませんでした・
上ではうまく捕捉できなかったのですが、下で捕捉できるようです。
Set fso=CreateObject("Scripting.FileSystemObject")
Set Events=GetObject("winmgmts:{impersonationLevel=impersonate,(security)}") _
.ExecNotificationQuery("SELECT * FROM " & _
"__instancecreationevent WHERE " & _
"targetinstance isa 'Win32_NTLogEvent' " & _
"and targetInstance.EventIdentifier= '538' " )
Set NTEvent = events.NextEvent
Set File=fso.OpenTextFile("log.txt",8,True)
File.WriteLine Now()
File.WriteLine NTEvent.TargetInstance.ComputerName
File.WriteLine NTEvent.TargetInstance.message
ただ、この動作環境と通知のタイミングが問題です。
やりたいことは、logoffスクリプトのように、
logoff時にその環境でlogoff完了前に処理をしたいのですが、
この場合は別セッションでlogoff後です。なのでShutdown時は駄目です。
一方、.NETのSystemEvents.SessionEnding イベントが使えそうに思うのですが、
コードのサンプルがなく、使い方が分かりません。
どうすれば、このSystemEvents.SessionEndingが拾えるのでしょう?
>KEN さん 2005年 05月 11日 09時 59分 03秒
>同様にごみ箱を即空に出来るようなショートカットを作るにはどのように指定すればいいのでしょうか?
>VBSで以下、見つけました
>Set Win = CreateObject("Shell.Application")
>Win.namespace(10).items.item.invokeverb "ごみ箱を空にする(&B)"
>ただし、これですと削除確認のダイアログが出てしまいます
>ダイアログも出さずに一発で空にしたいです
こういう方法もあります。
――――――――――――――――――――――――――――――――――――――
Set wShell=CreateObject("WScript.Shell")
wShell.Run "MSHTA.EXE vbscript:Execute(""CreateObject(""""Shell.Application"""").NameSpace(10).Items.Item.InvokeVerb """"ごみ箱を空にする(&B)"""":close()"")"
Do While Not wShell.AppActivate("の削除の確認")
WScript.Sleep 100
Loop
wShell.SendKeys "y"
――――――――――――――――――――――――――――――――――――――
この方法は他にも色々と応用が効きそうです。
以下はファイル等をごみ箱に送ります。
――――――――――――――――――――――――――――――――――――――
Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
For Each arg In WScript.Arguments
arg=fso.GetAbsolutePathName(arg)
Call RemoveFile(fso.GetParentFolderName(arg),fso.GetFileName(arg))
Next
WScript.Quit
Sub RemoveFile(FolderName,FileName)
wShell.Run "MSHTA.EXE vbscript:Execute(""CreateObject(""""Shell.Application"""").NameSpace("""""&FolderName&""""").Items.Item("""""&FileName&""""").InvokeVerb """"削除(&D)"""":close()"")"
Do While Not wShell.AppActivate("の削除の確認")
WScript.Sleep 100
Loop
wShell.SendKeys "y"
End Sub
――――――――――――――――――――――――――――――――――――――
管理人により削除
こんにちわ、ハッキングしてpassを調べたいんです!!
実は、僕が作っていたサイトが乗っ取られてしまって、passを変えられてしまったんです・・・。
お願いです、passのハッキングの仕方を教えてください。
管理人むたぐち様、ありがとうございます(^^)
成程、空の変数同士を代入させていただけだったんですね。
型の指定がなくdim宣言だけだったので、そのあたりを無意識にやっていました。お蔭様で任意の結果を得ることができました。
初心者ながら少し恥ずかしい質問をしていたかもしれませんね。
To: 秋穂 さん
> 何度試行錯誤しても、"失敗"を含まない行を読んでもflag=failedが成立してしまいます。
saccessfulもfailedも単なるEmptyな変数なので、
flag = saccessful = failed = Empty が常に成立してしまうわけです。
正しくは、
flag = "saccessful"
flag = "failed"
If flag = "failed" Then
のように文字列を代入するか、あるいはTrue/Falseのようにブール型変数を使います。
ファイルから一行ずつ読み込んで、当日日付を含む行に"失敗"の文字列を見つけたときにフラグをfailedにするスクリプトを組んだのですが、なぜか正しい値が返りません。何度試行錯誤しても、"失敗"を含まない行を読んでもflag=failedが成立してしまいます。
'今日の日時にセット
dim x,today,flag
x = now()
today = year(x) & "-0" & month(x) & "-" & day(x)
flag = saccessful
'"失敗"検索オブジェクト用意
Set regEx1 = New RegExp
srhStr1 = "失敗"
regEx1.Pattern = srhStr1
regEx1.Global = True
'日付検索オブジェクト用意
Set regEx2 = New RegExp
srhStr2 = today
regEx2.Pattern = srhStr2
regEx2.Global = True
'エラーログの内容読み込み処理
Set TextFile = fso.OpenTextFile("c:\ERRORLOG.txt")
Do Until TextFile.AtEndOfStream
tmpLine = TextFile.ReadLine ' 1行読み込み
If regEx1.Test(tmpLine) Then ' 指定の文字列を含むか?
If regEx2.Test(tmpLine) Then ' 指定の文字列を含むか?
flag = failed
End If
End If
Loop
If flag = failed Then
'失敗時の結果の記入
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\kekka.txt", 8, True)
objFile.WriteLine ""
objFile.WriteLine "---------【バックアップ実行結果】---------"
objFile.WriteLine hostname.computername & ":" & today & " 01:00実行分 スケジュールバックアップに失敗しています!"
objFile.WriteLine "リトライにより成功したかもしれませんが、実機を確認してください!"
objFile.WriteLine ""
objFile.Close
TextFile.close
Set kesu1 = fso.GetFile("c:\ERRORLOG.txt")
kesu1.delete true
Set ochell = CreateObject("Wscript.Shell")
ochell.Run "cmd.exe /c copy C:\kekka.txt \\192.168.1.10\pwrchute /y"
WScript.Echo "done"
End If
ご助言いただけますでしょうか。
管理人により削除
リモートで実行するスクリプトを作成しています。
以下のスクリプトをWindows2000で走らせると問題なく実行できるのですが、
WindowsXPで実行すると132行目、
set objRemote = objController.CreateScript(strScript, strComputer)
の行頭で"致命的なエラーです。コード:8000FFFF ソース:(null)"と言われ、終了してしまいます。
---TFS-3002_main.vbs------------------------------------------------
120 Const HKEY_LOCAL_MACHINE = &H80000002
121 strComputer = "TFS-3002"
122 strScript = "TFS-3002_sub.vbs"
123
124 Set objRegProv = GetObject("winmgmts:{impersonationLevel=Impersonate}" & _
125 "!\\" & strComputer & "\root\default:StdRegProv")
126
127 strKeyPath = "SOFTWARE\Microsoft\Windows Script Host\Settings"
128 objRegProv.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,"Remote","1"
129
130
131 set objController = WScript.CreateObject("WshController")
132 set objRemote = objController.CreateScript(strScript, strComputer)
133 Wscript.ConnectObject objRemote, "Remote_"
--------------------------------------------------------------------
Windows2000では動いているのでCreateObject()は問題ないと思いますし、
XPにはWSHの構文に制約等があるでしょうか?
環境はWindows2000、WindowsXPともにIE6.0 SP1です。
よろしくお願いいたします。
管理人により削除
管理人により削除
ばんのしゃーによかばんたさんに私信があります。
お手数ですが、トップページに記載のメールアドレスに、連絡をいただけないでしょうか?
よろしくお願いします。
>ばんのしゃーによかばんた さん 2005年 05月 02日 15時 06分 45秒
>つまり、Windowsでは、
>「一般に、ファイルの削除やリネームはタイミングにより失敗することがある。」
>というのが「仕様」なのです
しかし、こんな実装(できちゃった)「仕様」は、やはり迷惑千万です。
きっと、多重処理の何たるかを理解してないシェル開発担当者が見た目だけ考えて、
影響/副作用を考えずに作ったのでしょう。
で、正しい実装は?と言うと、
シェルがメタを読むのと、アプリがファイルを読むのを同列に扱うのが誤り。
ファイルの削除やリネーム側が、なんらかの方法で、シェルがメタを読んでいるのを
認識して、その間、待ち合わせをする。
>ばんのしゃーによかばんた さん 2005年 05月 04日 14時 55分 15秒
>リンク先を該当フォルダの子フォルダにしておきます。
>開いたところで、親フォルダに戻れば、「+」が付いてます。
親フォルダへの移動方法ですが、
ツールバーのアイコンまでマウスを移動するのが面倒とか、
BSキー押すのが面倒とか、
DOSのように(?)、..があれば便利、というひとに。
「...VBS」
CreateObject("WScript.Shell").SendKeys "{BS}"
フォルダビューが名前の昇順なら先頭に表示されます。
「...VBS」という名前はGUIでは付けられないようなので、
コマンドプロンプトでリネームしてください。
勿論、個別でよければ、親フォルダへのショートカットを作って、
コマンドプロンプトで「...lnk」や「...url」にリネーム、という手もあります。
見た目はこっちのほうがよいかも。
だったら、上記VBSへのショートカットを作ればよいわけですね。
これも「無意味良品」かも。:-p
ところで、
このアイコンをフォルダに上向きの矢印の付いたものに変えようとしたのですが、
その所在が分かりません。shell32.dllには見当たらない。
アイコン探しはいつも苦労します。:-<
>管理人むたぐち さん 2005年 05月 11日 10時 46分 43秒
>Shellオブジェクトのメソッドの同期・非同期は複雑で嫌になります。
全くです。
大概の仕様はなんとなく設計思想とか傾向が仄見えてくるものですが、
こればっかりは、設計思想なし(行き当たりばったり)が設計思想かと。
>管理人むたぐち さん 2005年 05月 11日 10時 35分 58秒
>FolderItemオブジェクトのInvokeVerbは同期、
>FolderItemsオブジェクトのInvokeVerbExは非同期で実行されるのがポイントです。
何のオブジェクトか、やVerbに依っても変わるので、大変です。
ごみ箱フォルダのInvokeVerbは同期ですが、
ごみ箱フォルダ内のごみのInvokeVerbは非同期ですね。
過去記事の
>管理人むたぐち さん 2000年 03月 18日 18時 24分 44秒
を参照。
なので、
>あるいはSendKeysを併用するとこんな感じでしょうか。
Set Shell=CreateObject("Shell.Application")
Set wShell=CreateObject("WScript.Shell")
For Each FolderItem In Shell.NamesPace(10).Items
k=k+1
FolderItem.InvokeVerb "削除(&D)"
Do While Not wShell.AppActivate("の削除の確認")
WScript.Sleep 100
Loop
wShell.SendKeys "y"
Do While wShell.AppActivate("の削除の確認")
WScript.Sleep 100
Loop
Next
WScript.Sleep 100
MsgBox k & " 個のファイル/フォルダを削除しました。"
WScript.Quit
なかなかスペクタクルです。
もし、ループ中削除の禁忌に引っ掛かった場合は降順に変更してください。
For Each FolderItem In Shell.NamesPace(10).Items
↓
For j=Shell.NamesPace(10).Items.Count-1 To 0 Step -1
Set FolderItem=Shell.NamesPace(10).Items.Item(j)
>管理人むたぐち さん 2005年 05月 11日 11時 13分 47秒
>コンボボックスの隣にボタンを配置して、それを押したときにコンボボックスの
>中身を読んでイベント発生、ってのが常道じゃないかと。
>もちろん、ワンクリック以上の手間が増えますが、私が作るならそうします。
>コンボボックスだけだと、何が起こったかわかりづらいですので。
私も、それは考えましたが、やっぱり手間が。。。
軽快さが命みたいなツールなので。。。
そこで、
<select onchange='Selected(Me)' onfocus='Me.options(0).selected=True' style="width:100%;">
<option selected value=""></option>
<option value="Clear">クリアします</option>
として、これに合わせて、
Sub Selected(Item)
If Item.value="Clear" Then
clipboardData.clearData
ElseIf Item.value<>"" Then
clipboardData.setData "text",Item.value
End If
としてみました。
つまり、onfocusで「未選択」に初期化して、「未選択」以外を選択するとonchangeが発生。
「未選択」のonchangeは無視。
これがなかなか良さそうです。:-)
ここに至るまでonblurも試しましたが駄目でした。:-(
管理人により削除
>KEN さん 2005年 05月 11日 09時 59分 03秒
>同様にごみ箱を即空に出来るようなショートカットを作るにはどのように指定すればいいのでしょうか?
>VBSで以下、見つけました
>Set Win = CreateObject("Shell.Application")
>Win.namespace(10).items.item.invokeverb "ごみ箱を空にする(&B)"
>ただし、これですと削除確認のダイアログが出てしまいます
>ダイアログも出さずに一発で空にしたいです
はい、どうぞ。
――――――――――――――――――――――――――――――――――――――
' PurgeBin.VBS empties RecylcleBin without prompting.
' Usage: Start PurgeBin.VBS
Option Explicit
Dim fso
Dim Shell
Dim Folder
Dim FolderItem
Set fso=CreateObject("Scripting.FileSystemObject")
Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(10)
If Folder Is Nothing Then
WScript.Echo "Failed to open RecycleBin."
WScript.Quit
End If
If Folder.Items.Count=0 Then
WScript.Echo "RecycleBin is already empty."
WScript.Quit
End If
For Each FolderItem In Folder.Items
If fso.FileExists(FolderItem.Path) Then
fso.DeleteFile FolderItem.Path
ElseIf fso.FolderExists(FolderItem.Path) Then
fso.DeleteFolder FolderItem.Path
End If
Next
WScript.Quit
――――――――――――――――――――――――――――――――――――――
GUIで行番号を表示する方法。
Windiff.exeに1ファイルをドロップする。
――――――――――――――――――――――――――――――――――――――
あと、ファイルの比較は、Windiff.exeに2ファイルをドロップ、が便利ですね。
しかし、フォルダが異なると、2ファイルをドラッグできないのがなんとも不便。
1フォルダに2ファイルのリンクを作ってドラッグドロップしてみましたが、
リンクファイルを比較しやんの。まったく。:-<
Windiff.exeのGUIもファイルのドロップをサポートしてないようで、不便。
ファイルの検索結果みたいなところに、任意のフォルダのファイルをドロップして
集め、それらをまとめてドラッグして、アプリのドロップできるとよいのだけれど。
これ、昔からのテーマなんですけど、未だ実現できず。。。
CommonControlのListViewを使えばよさそう。
でも、ByRef * As * のeventがネックで、スクリプトでは、無理みたい。
以下のVBAなら動きました。やっぱ、.NETかなぁ。
新規ワークブックにファイルをインポートしてMSCOMCTL.OCXを参照設定すれば動きます。
UserForm1.frm
――――――――――――――――――――――――――――――――――――――
VERSION 5.00
Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} UserForm1
Caption = "DragDropFilesPool"
ClientHeight = 3225
ClientLeft = 45
ClientTop = 330
ClientWidth = 4710
OleObjectBlob = "filesUserForm1.frx":0000
StartUpPosition = 3 'Windows の既定値
End
Attribute VB_Name = "UserForm1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim DragBusy As Boolean
Private Sub UserForm_Initialize()
Call ListView1.ColumnHeaders.Add(, "Name", "FullName", 500)
ListView1.MultiSelect = True
ListView1.ListItems.Clear
ListView1.Width = UserForm1.InsideWidth
ListView1.Height = UserForm1.InsideHeight
End Sub
Private Sub ListView1_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)
If DragBusy Then Exit Sub
'Const ccOLEDropEffectCopy = 1
Effect = ccOLEDropEffectCopy
End Sub
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
If DragBusy Then Exit Sub
Dim k
Dim File
Dim ListItem
For k = 1 To Data.Files.Count
File = Data.Files.Item(k)
Set ListItem = ListView1.ListItems.Add()
ListItem.Text = Data.Files.Item(k)
Next
End Sub
Private Sub ListView1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
If DragBusy Then Exit Sub
If Button = vbKeyLButton Then
DragBusy = True
ListView1.OLEDrag ' Begin dragging
Else
ListView1.ListItems.Clear
End If
End Sub
Private Sub ListView1_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)
Const ccOLEDropEffectCopy = 1
Const ccOLEDropEffectMove = 2
AllowedEffects = 3 ' vbDropEffectCopy Or vbDropEffectMove
Data.SetData , 15 'vbCFFiles
End Sub
Private Sub ListView1_OLESetData(Data As MSComctlLib.DataObject, DataFormat As Integer)
Dim ListItem
Dim k
For k = 1 To ListView1.ListItems.Count
Set ListItem = ListView1.ListItems.Item(k)
Data.Files.Add ListItem.Text
Next
End Sub
Private Sub ListView1_OLECompleteDrag(Effect As Long)
DragBusy = False
End Sub
To: ばんのしゃーによかばんた さん 2005年 05月 08日 16時 21分 57秒
> onchangeだけだと、同じものを選択しても発火しないので、onclickも使いましたが、
> そうすると、今度は重複して発火します。
> なんかもっとスマートな方法はないもんでしょうか?
これなんですけど、UI的にはコンボボックス(<select><option>で作るやつですね)の
onchangeやonclickでイベントを発生させるのはどうなのかなぁ?という気もします。
コンボボックスの隣にボタンを配置して、それを押したときにコンボボックスの
中身を読んでイベント発生、ってのが常道じゃないかと。
もちろん、ワンクリック以上の手間が増えますが、私が作るならそうします。
コンボボックスだけだと、何が起こったかわかりづらいですので。
Win98だと、FolderItemsオブジェクトにInvokeVerbExメソッドが
無いんですよ。たしかWin2000以降、あるいはXP以降だったと思います。
ばんのしゃーによかばんた さん 2004年 11月 28日 16時 18分 25秒
が書かれている、FileSystemObject併用の方法はWin98でも使えませんかねえ?
もしくは、C:\Recycledをそのまま削除。これはあまりオススメできないですが。(たしか、デスクトップのごみ箱アイコンが空にならない等の問題が発生する)
いろいろとありがとうございます
参照レスいま閲覧してみました
一筋縄ではいかないようですね;
案外簡単に出来るのかと勘違いしておりました
お付き合い頂きましてありがとうございました
分かっただけでも感謝です^^
あとは、
ばんのしゃーによかばんた さん 2004年 12月 01日 17時 34分 00秒
ばんのしゃーによかばんた さん 2004年 11月 28日 16時 18分 25秒
あたりの記事も参照なさってください。
Shellオブジェクトのメソッドの同期・非同期は複雑で嫌になります。
すみません。せっかく回答頂いたのに以下のエラーが出てしまいます
当方環境記載していませんでした。WIN98SE WSH5.6 です
行: 5
文字: 1
エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。: 'oFolderItems.InvokeVerbEx'
コード: 800A01B6
ソース: Microsoft VBScript 実行時エラー
あるいはSendKeysを併用するとこんな感じでしょうか。
FolderItemオブジェクトのInvokeVerbは同期、
FolderItemsオブジェクトのInvokeVerbExは非同期で実行されるのがポイントです。
Set Shell = WScript.CreateObject("Shell.Application")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oFolderItems=Shell.NamesPace(10).Items
oFolderItems.InvokeVerbEx "削除(&D)"
For I=1 To 10
ret=WshShell.AppActivate("削除の確認")
If ret=True Then
WshShell.SendKeys "Y"
WScript.Sleep 100
Exit For
End If
WScript.Sleep 100
Next
むたぐちさま 早い返答ありがとうございます^^
>ごみ箱のプロパティを開き、「削除の確認メッセージを表示」の
>チェックボックスをオフにすれば、ダイアログは出ません。
>ただしこの場合、手動でごみ箱を空にする場合もダイアログが出なくなります。
すでにオフにしてありまして、最後『ファイルの削除の確認』で(Y)or(N)のダイアログを出さずに削除させたいです。。
わかりずらい説明ですみませんでした。
よろしくお願いします。
To: KEN さん
> Set Win = CreateObject("Shell.Application")
> Win.namespace(10).items.item.invokeverb "ごみ箱を空にする(&B)"
>
> ただし、これですと削除確認のダイアログが出てしまいます
> ダイアログも出さずに一発で空にしたいです
ごみ箱のプロパティを開き、「削除の確認メッセージを表示」の
チェックボックスをオフにすれば、ダイアログは出ません。
ただしこの場合、手動でごみ箱を空にする場合もダイアログが出なくなります。
昔々のWin98時代なんかだと、C:\Recycledを丸ごと削除という荒業も使えたんですが、
最近のXPとかではやらない方が良さそうですね。
よこからすみません。スクリプトのことはよくわかっていない初心者です。
なんとか、Windows即終了させるためにデスクトップに以下のショートカットを活用し重宝しています
C:\WINDOWS\Rundll.exe user.exe,exitwindows
同様にごみ箱を即空に出来るようなショートカットを作るにはどのように指定すればいいのでしょうか?
VBSで以下、見つけました
Set Win = CreateObject("Shell.Application")
Win.namespace(10).items.item.invokeverb "ごみ箱を空にする(&B)"
ただし、これですと削除確認のダイアログが出てしまいます
ダイアログも出さずに一発で空にしたいです
アドバイス頂けませんでしょうか
よろしくお願いします
》ヤマザキ さん 2005年 05月 10日 10時 46分 40秒
> なんと"RUNAT=Server"というアトリビュートを書かないとダメなんですね。
あるいは、こういう形でも動作しました。
=== test.txt ===
Function Test()
Test = "現在:" & CStr(Timer())
End Function
=== global.asa ===
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Session_OnStart()
Session("X") = Test()
End Sub
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server src="test.txt"></SCRIPT>
》魔界の仮面弁士 さん 2005年 05月 10日 02時 29分 31秒
ご返事ありがとうございます。
無事できました。
ちなみにIISのバージョンは5.0でもOKでした。
原因はインクルードされるファイル内の記述ミスでした。
ミス記述:<SCRIPT LANGUAGE=VBScript>
OK記述:<SCRIPT LANGUAGE=VBScript RUNAT=Server>
なんと"RUNAT=Server"というアトリビュートを書かないとダメなんですね。
こんな凡ミスではずかしい限りです・・・
ご教授ありがとうございました。
》魔界の仮面弁士 2005年 05月 10日 00時 53分 06秒
すみません、大嘘でした。global.asa中でも include は使えますね。(^^;
『ダメでした』の発言を見て、よく確認せずに答えてしまいましたが、
少なくとも IIS 5.1 環境化では、下記が動作する事を確認しました。
(それ以外の環境でも使えるのかどうかは、確認していませんが)
=== global.asa ===
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Session_OnStart()
Session("X") = Test()
End Sub
</SCRIPT><!--#include virtual="test.txt"-->
=== test.txt ===
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Function Test()
Test = "現在:" & CStr(Timer())
End Function
</SCRIPT>
=== default.asp ===
<p>[<%Response.Write Now%>]</p>
<p>[<%=Session("X")%>]</p>
なお、*.aspとglobal.asa中では、利用可能な記述に差異がありますので、
駄目だった時のインクルードファイルの内容を、もう一度確認してみては
如何でしょうか。
》ヤマザキ さん 2005年 05月 09日 10時 07分 42秒
global.asa は設定ファイルのような扱いを受けます。
*.asp とは別物であり、#include が使えるようにはなっていません。
外部機能の呼び出しがどうしても必要なら、その処理をCOM化して
<OBJECT RUNAT="Server" SCOPE="Application" ID=aaa PROGID="bbb.ccc"></OBJECT>
として呼び出すか、もしくは、スクリプトコンポーネント(*.wsc)にして、
Set oComponent = GetObject("script:c:\common\MyComponent.wsc")
のようにして利用する事で対応してください。
http://www.microsoft.com/japan/msdn/library/ja/script56/html/lettitle.asp
global.asa内の記述方法について分からない事があります。
Session_OnEnd()内で自作した関数を呼び出したいのです。
外部ファイルに定義して共通化しているので、
できればglobal.asa内に外部ファイルをインクルードしたです。
この様なことって実現可能なんでしょうか?
ちなみに、私が知っている知識の範囲で
<!-- #include file="common\file.asp" -->
のようなステートメントを使用してみましたがダメでした。
分かる方がいましたら、是非ご教授お願い致します。
>AKA さん 2004年 12月 05日 04時 39分 36秒
>2. いくつかの選択肢から選択するようなテキストボックスはどんなオブジェクトを使うのでしょ>うか?
>ワードパッドでフォントを選択する時のようなものがやりたいのですが・・・
話の序でに、
>ばんのしゃーによかばんた さん 2005年 05月 05日 15時 52分 05秒
>※まぁ、こんなの使わなくても、<SELECT><OPTION>を使ったほうが簡単ですけど。
と言ってはみたものの、まだ実際に使ったことがなかったので、使ってみました。
定型文をクリップボードに。
――――――――――――――――――――――――――――――――――――――
<html><head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<title>TClip.HTA</title>
<script language="vbscript">
resizeTo 100,72
moveTo screen.availWidth-100-15,100
source=UnEscape(location.pathname)
Sub Selected(Item)
'msgbox Item.value
If Item.value<>"" Then
clipboardData.setData "text",Item.value
Else
clipboardData.clearData
End If
End Sub
</script>
<hta:application applicationName="TClip.HTA" version="1.00"
sysmenu="no" showintaskbar="no"
maximizebutton="no" scroll="no" icon="clipbrd.exe" id="hta" >
</head>
<body topmargin=0 bottommargin=0 leftmargin=0 rightmargin=0 style="background:menu;">
<select onchange='Selected(Me)' onclick='Selected(Me)' style="width:100%;">
<option selected value=""></option>
<option value="晩(御飯)の菜(御数/御菜)によい哉">ばんのしゃーによかばんた</option>
<option value="foxfox">ほげほげ</option>
<option value="長ーい
テキスト
複数行も">長ーいテキスト</option>
</select>
<button onclick='wShell.Run "notepad.exe " & source' style="width:50%;">編集</button>
<button onclick='document.execCommand "refresh"' style="width:50%;">Refresh</button>
<object id="wShell" classid="CLSID:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B">
</object></body></html>
――――――――――――――――――――――――――――――――――――――
onchangeだけだと、同じものを選択しても発火しないので、onclickも使いましたが、
そうすると、今度は重複して発火します。
なんかもっとスマートな方法はないもんでしょうか?
「ファイル名を指定して実行」だと、
テキストボックスにファイルをドロップすると、パス名が入ります。
しかし、VBScriptのInputBoxでは、駄目です。
こういう(上)ことをやろうとすると、どうすりゃよいのでしょう。
ondropのdataTransfer.getDataでは、取れそうもありません。
MSHTML.DLLをstrings.vbs /uすると、Text,URL,Fileの文字列が見えるのですが、
Fileのコードは潰されているようです。
MS FormsのTextBoxはドロップをサポートしてないし。
<iframe>を使う代替方法があるようですが、複数ファイルは取れないし、
拡張子によってはダウンロードになったりして、使えません。
CommonControlのStatusBarなどを使って、StatusBarにドロップしたら、
<textarea>にセットするなんてことは出来そうですが、
見た目がスマートではありません。
<textarea>や<div>をStatusBarに重ねて置いてみましたが、ドロップが
うまく渡りません。
何か他に良案はありませんか?
管理人により削除