ばんのしゃーによかばんた さん 2005年 05月 20日 15時 21分 50秒

>シロウト さん 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月 20日 15時 21分 26秒

>ばんのしゃーによかばんた さん 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がありません。なんで?
それが分かればもう少し精度が上がるのですが。。。


bia さん 2005年 05月 20日 11時 36分 46秒

To:管理人様

>へろ さん 2002年 10月 02日 21時 26分 10秒 でも同じ質問が出ていますが、回答は得られていないようですね。

そうなんです。一応だいぶ調べてみたのですが、ひっかかったのはへろさんのだけで、回答はなかったです。

色々調べてみたのですが、どうしても問題の切り分けができないのです。

追伸:windows2000でも同じソースで動作するPCを見つけたのですが、dllのバージョンも同じなのに。。。
今の環境ではエラーになってしまいます><


管理人むたぐち さん 2005年 05月 20日 10時 46分 01秒

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については、何らかの方法であらかじめコマンドを実行しておく必要がある。

ということらしいです。これをやってみてはいかがでしょうか。

管理人むたぐち さん 2005年 05月 20日 10時 32分 43秒

To: bia さん
へろ さん 2002年 10月 02日 21時 26分 10秒 でも同じ質問が出ていますが、回答は得られていないようですね。

# ADSIの質問に強いコミュニティってどこかあったかなぁ?

bia さん 2005年 05月 20日 10時 12分 37秒

すいません、VBSではなくVBAなのですがどうしても問題解決せず、何かしらの情報を得れればと思い書き込ませていただきます。

現在、ADSIを利用してクライアントからActiveDirectoryのドメインユーザパスワードをリセットするツールを作成しています。

LDAPで接続はするのですが、どうしてもSetPasswordにてエラーが発生してしまいます。
ChangePasswordでは処理が通るのですが、元パスワードがわからない状況を考えるとSetPasswordで行う必要があります。

対処法など知ってる人がいれば御教え願えないでしょうか。

ちなみに、WindowsXPの環境では同じもので問題なく動作します。
上記のことから、環境によって影響を受けているのではないかと推測しているのですが、切り分けができません。

どうか、よろしく御願いいたします。

環境
サーバ windows server2003
クライアント windows 2000SP4
office2000のVBAを使用

エラー
-2147023570 オートメーション エラーです。
ユーザー名を認識できないか、またはパスワードが間違っています。


管理人むたぐち さん 2005年 05月 20日 10時 11分 02秒

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

endless さん 2005年 05月 20日 06時 49分 40秒

To ちゃっぴ様
ご指摘の通りXP SP2の展開をSampleとして書きました
ちょっとだけ環境を説明させてもらうと
SUSは導入されていてDomainにも参加していますが
LAN回線が細いためCDからの適用を検討中なのです
また同時に適用しようとしているプログラムが5つくらいあるので
ローカルで処理を完了させたいのです

ちゃっぴ さん 2005年 05月 20日 00時 55分 47秒

To endless さん 2005年 05月 20日 00時 44分 41秒

よくみたら、XPSP2の展開を行っているようですが・・・
SUSとかSMSを導入すれば、そもそもこういったScriptを
作る必要すらないと思いますが・・・

もっとも、Domainに参加していない場合、SUSの設定(Registry)の展開を
Script等で行ってやる必要がありますが・・・

あと、WMI使ってRemoteからCallしてやったほうが楽でしょう。
(GUIが絡むとダメですが・・・)

endless さん 2005年 05月 20日 00時 44分 41秒

To ちゃっぴ様
>Taskに登録しておいて、実行とか?
>SendKeyでは安定動作は無理でしょう。

アドバイスありがとうございます。
Taskに登録ですか?勉強不足で具体的にイメージできませんが
いろいろ調べてみます。
Sample等、ご教授いただければ幸いですが...
宜しくお願いします。

ちゃっぴ さん 2005年 05月 20日 00時 34分 40秒

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では安定動作は無理でしょう。

endless さん 2005年 05月 19日 22時 46分 20秒

はじめまして
ご助力の程、お願いします

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年 05月 19日 16時 48分 41秒

>シロウト さん 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年 05月 18日 20時 45分 21秒
URL:管理人により削除

管理人により削除

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

>ちゃっぴ さん 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が拾えるのでしょう?


ばんのしゃーによかばんた さん 2005年 05月 18日 16時 10分 59秒

>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
――――――――――――――――――――――――――――――――――――――


管理人により削除 さん (管理人により削除) 2005年 05月 18日 13時 59分 54秒
URL:管理人により削除

管理人により削除

s.t さん (kanumadai1@jcom.home.ne.jp) 2005年 05月 18日 13時 55分 27秒

こんにちわ、ハッキングしてpassを調べたいんです!!
実は、僕が作っていたサイトが乗っ取られてしまって、passを変えられてしまったんです・・・。
お願いです、passのハッキングの仕方を教えてください。

秋穂 さん 2005年 05月 18日 13時 33分 54秒

管理人むたぐち様、ありがとうございます(^^)
成程、空の変数同士を代入させていただけだったんですね。
型の指定がなくdim宣言だけだったので、そのあたりを無意識にやっていました。お蔭様で任意の結果を得ることができました。

初心者ながら少し恥ずかしい質問をしていたかもしれませんね。

管理人むたぐち さん 2005年 05月 17日 18時 27分 47秒

To: 秋穂 さん

> 何度試行錯誤しても、"失敗"を含まない行を読んでもflag=failedが成立してしまいます。

saccessfulもfailedも単なるEmptyな変数なので、
flag = saccessful = failed = Empty が常に成立してしまうわけです。

正しくは、

flag = "saccessful"
flag = "failed"
If flag = "failed" Then

のように文字列を代入するか、あるいはTrue/Falseのようにブール型変数を使います。

秋穂 さん 2005年 05月 17日 16時 28分 39秒

ファイルから一行ずつ読み込んで、当日日付を含む行に"失敗"の文字列を見つけたときにフラグを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

ご助言いただけますでしょうか。

管理人により削除 さん (管理人により削除) 2005年 05月 17日 13時 52分 03秒
URL:管理人により削除

管理人により削除

シーズー大好き さん 2005年 05月 16日 17時 09分 03秒

リモートで実行するスクリプトを作成しています。
以下のスクリプトを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月 16日 11時 40分 23秒
URL:管理人により削除

管理人により削除

管理人により削除 さん (管理人により削除) 2005年 05月 15日 13時 26分 37秒
URL:管理人により削除

管理人により削除

管理人むたぐち さん 2005年 05月 13日 22時 28分 13秒

ばんのしゃーによかばんたさんに私信があります。
お手数ですが、トップページに記載のメールアドレスに、連絡をいただけないでしょうか?
よろしくお願いします。

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

>ばんのしゃーによかばんた さん 2005年 05月 02日 15時 06分 45秒
>つまり、Windowsでは、
>「一般に、ファイルの削除やリネームはタイミングにより失敗することがある。」
>というのが「仕様」なのです

しかし、こんな実装(できちゃった)「仕様」は、やはり迷惑千万です。
きっと、多重処理の何たるかを理解してないシェル開発担当者が見た目だけ考えて、
影響/副作用を考えずに作ったのでしょう。

で、正しい実装は?と言うと、
シェルがメタを読むのと、アプリがファイルを読むのを同列に扱うのが誤り。
ファイルの削除やリネーム側が、なんらかの方法で、シェルがメタを読んでいるのを
認識して、その間、待ち合わせをする。


ばんのしゃーによかばんた さん 2005年 05月 13日 17時 12分 45秒

>ばんのしゃーによかばんた さん 2005年 05月 04日 14時 55分 15秒
>リンク先を該当フォルダの子フォルダにしておきます。
>開いたところで、親フォルダに戻れば、「+」が付いてます。

親フォルダへの移動方法ですが、
ツールバーのアイコンまでマウスを移動するのが面倒とか、
BSキー押すのが面倒とか、
DOSのように(?)、..があれば便利、というひとに。

「...VBS」
CreateObject("WScript.Shell").SendKeys "{BS}"

フォルダビューが名前の昇順なら先頭に表示されます。

「...VBS」という名前はGUIでは付けられないようなので、
コマンドプロンプトでリネームしてください。

勿論、個別でよければ、親フォルダへのショートカットを作って、
コマンドプロンプトで「...lnk」や「...url」にリネーム、という手もあります。
見た目はこっちのほうがよいかも。
だったら、上記VBSへのショートカットを作ればよいわけですね。

これも「無意味良品」かも。:-p

ところで、
このアイコンをフォルダに上向きの矢印の付いたものに変えようとしたのですが、
その所在が分かりません。shell32.dllには見当たらない。
アイコン探しはいつも苦労します。:-<


ばんのしゃーによかばんた さん 2005年 05月 12日 17時 28分 53秒

>管理人むたぐち さん 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月 12日 17時 28分 35秒

>管理人むたぐち さん 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も試しましたが駄目でした。:-(


管理人により削除 さん (管理人により削除) 2005年 05月 12日 17時 24分 57秒
URL:管理人により削除

管理人により削除

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

>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
――――――――――――――――――――――――――――――――――――――


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

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



管理人むたぐち さん 2005年 05月 11日 11時 13分 47秒

To: ばんのしゃーによかばんた さん 2005年 05月 08日 16時 21分 57秒

> onchangeだけだと、同じものを選択しても発火しないので、onclickも使いましたが、
> そうすると、今度は重複して発火します。
> なんかもっとスマートな方法はないもんでしょうか?

これなんですけど、UI的にはコンボボックス(<select><option>で作るやつですね)の
onchangeやonclickでイベントを発生させるのはどうなのかなぁ?という気もします。

コンボボックスの隣にボタンを配置して、それを押したときにコンボボックスの
中身を読んでイベント発生、ってのが常道じゃないかと。
もちろん、ワンクリック以上の手間が増えますが、私が作るならそうします。
コンボボックスだけだと、何が起こったかわかりづらいですので。

管理人むたぐち さん 2005年 05月 11日 11時 00分 58秒

Win98だと、FolderItemsオブジェクトにInvokeVerbExメソッドが
無いんですよ。たしかWin2000以降、あるいはXP以降だったと思います。

ばんのしゃーによかばんた さん 2004年 11月 28日 16時 18分 25秒
が書かれている、FileSystemObject併用の方法はWin98でも使えませんかねえ?
もしくは、C:\Recycledをそのまま削除。これはあまりオススメできないですが。(たしか、デスクトップのごみ箱アイコンが空にならない等の問題が発生する)

KEN さん 2005年 05月 11日 10時 56分 03秒

いろいろとありがとうございます
参照レスいま閲覧してみました
一筋縄ではいかないようですね;
案外簡単に出来るのかと勘違いしておりました
お付き合い頂きましてありがとうございました
分かっただけでも感謝です^^

管理人むたぐち さん 2005年 05月 11日 10時 46分 43秒

あとは、
ばんのしゃーによかばんた さん 2004年 12月 01日 17時 34分 00秒
ばんのしゃーによかばんた さん 2004年 11月 28日 16時 18分 25秒

あたりの記事も参照なさってください。
Shellオブジェクトのメソッドの同期・非同期は複雑で嫌になります。

KEN さん 2005年 05月 11日 10時 46分 26秒

すみません。せっかく回答頂いたのに以下のエラーが出てしまいます
当方環境記載していませんでした。WIN98SE WSH5.6 です

行:     5
文字:     1
エラー:     オブジェクトでサポートされていないプロパティまたはメソッドです。: 'oFolderItems.InvokeVerbEx'
コード:     800A01B6
ソース:      Microsoft VBScript 実行時エラー

管理人むたぐち さん 2005年 05月 11日 10時 35分 58秒

あるいは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    

KEN さん 2005年 05月 11日 10時 33分 42秒

むたぐちさま 早い返答ありがとうございます^^

>ごみ箱のプロパティを開き、「削除の確認メッセージを表示」の
>チェックボックスをオフにすれば、ダイアログは出ません。
>ただしこの場合、手動でごみ箱を空にする場合もダイアログが出なくなります。

すでにオフにしてありまして、最後『ファイルの削除の確認』で(Y)or(N)のダイアログを出さずに削除させたいです。。

わかりずらい説明ですみませんでした。
よろしくお願いします。


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

To: KEN さん

> Set Win = CreateObject("Shell.Application")
> Win.namespace(10).items.item.invokeverb "ごみ箱を空にする(&B)"
>
> ただし、これですと削除確認のダイアログが出てしまいます
> ダイアログも出さずに一発で空にしたいです

ごみ箱のプロパティを開き、「削除の確認メッセージを表示」の
チェックボックスをオフにすれば、ダイアログは出ません。
ただしこの場合、手動でごみ箱を空にする場合もダイアログが出なくなります。

昔々のWin98時代なんかだと、C:\Recycledを丸ごと削除という荒業も使えたんですが、
最近のXPとかではやらない方が良さそうですね。

KEN さん 2005年 05月 11日 09時 59分 03秒

よこからすみません。スクリプトのことはよくわかっていない初心者です。
なんとか、Windows即終了させるためにデスクトップに以下のショートカットを活用し重宝しています
C:\WINDOWS\Rundll.exe user.exe,exitwindows

同様にごみ箱を即空に出来るようなショートカットを作るにはどのように指定すればいいのでしょうか?

VBSで以下、見つけました
Set Win = CreateObject("Shell.Application")
Win.namespace(10).items.item.invokeverb "ごみ箱を空にする(&B)"

ただし、これですと削除確認のダイアログが出てしまいます
ダイアログも出さずに一発で空にしたいです
アドバイス頂けませんでしょうか
よろしくお願いします




魔界の仮面弁士 さん 2005年 05月 11日 03時 15分 43秒

》ヤマザキ さん 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日 10時 46分 40秒

》魔界の仮面弁士 さん 2005年 05月 10日 02時 29分 31秒
ご返事ありがとうございます。
無事できました。
ちなみにIISのバージョンは5.0でもOKでした。

原因はインクルードされるファイル内の記述ミスでした。
ミス記述:<SCRIPT LANGUAGE=VBScript>
OK記述:<SCRIPT LANGUAGE=VBScript RUNAT=Server>

なんと"RUNAT=Server"というアトリビュートを書かないとダメなんですね。
こんな凡ミスではずかしい限りです・・・

ご教授ありがとうございました。

魔界の仮面弁士 さん 2005年 05月 10日 02時 29分 31秒

》魔界の仮面弁士 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月 10日 00時 53分 06秒

》ヤマザキ さん 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

ヤマザキ さん 2005年 05月 09日 10時 07分 42秒

global.asa内の記述方法について分からない事があります。

Session_OnEnd()内で自作した関数を呼び出したいのです。
外部ファイルに定義して共通化しているので、
できればglobal.asa内に外部ファイルをインクルードしたです。
この様なことって実現可能なんでしょうか?

ちなみに、私が知っている知識の範囲で
 <!-- #include file="common\file.asp" -->
のようなステートメントを使用してみましたがダメでした。

分かる方がいましたら、是非ご教授お願い致します。

ばんのしゃーによかばんた さん 2005年 05月 08日 16時 21分 57秒

>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も使いましたが、
そうすると、今度は重複して発火します。
なんかもっとスマートな方法はないもんでしょうか?


ばんのしゃーによかばんた さん 2005年 05月 08日 16時 21分 13秒

「ファイル名を指定して実行」だと、
テキストボックスにファイルをドロップすると、パス名が入ります。
しかし、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に重ねて置いてみましたが、ドロップが
うまく渡りません。

何か他に良案はありませんか?


管理人により削除 さん 2005年 05月 08日 14時 15分 49秒
URL:管理人により削除

管理人により削除

Return