2006/12/23

http://blogs.wankuma.com/mutaguchi/archive/2006/07/07/31826.aspx
の続きです。クリップボード中に複数URLが複数行に記述されている場合、それらをまとめてダウンロードするように改良しました。

Const adTypeBinary = 1
Const adSaveCreateNotExist = 1
Const adSaveCreateOverWrite = 2
 
sDLFolder = "C:\download"
 
Set Ie = WScript.CreateObject("InternetExplorer.Application")
'Ie.Visible = True
Ie.Navigate "about:blank"
Do While Ie.Busy Or Ie.ReadyState<>4
    Wscript.Sleep 10
Loop
'クリップボードの文字列を取得。
sClipBoard = Ie.Document.parentWindow.clipboardData.getData("text")  
Ie.Quit
 
If InStr(sClipBoard,vbCrLf) Then
    aURLs = Split(sClipBoard,vbCrLf)
Else
    aURLs = Array(sClipBoard)
End If
 
For Each sURL In aURLs
    If Left(sURL,5)="http:" Then
        sDest = sDLFolder & "\" & Mid(sURL,InStrRev(sURL,"/")+1)
        Set oHTTP = WScript.CreateObject("Msxml2.XMLHTTP")
        oHTTP.Open "GET", sURL, False
        oHTTP.Send
        Set Stream = WScript.CreateObject("Adodb.Stream")
        Stream.Type = adTypeBinary
        Stream.Open
        Stream.Write oHTTP.responseBody
        Stream.Savetofile sDest, adSaveCreateOverWrite
    End If
Next
 
msgbox "done"

ところがこれをIE7環境で実行すると毎回こんなダイアログがでるんですね。
このWebページがクリップボードへアクセスするのを許可しますか?
インターネットゾーンのレベルのカスタマイズで、「スクリプトによる貼り付け処理の許可」を「ダイアログを表示する」から「有効にする」に変えればダイアログは出なくなりますがお勧めしません。それよりは"about:blank"の代わりに何かローカルのファイルを指定してやったほうがいいです。ローカルのファイルはマイコンピュータゾーンで動作するのでダイアログが出ません。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2006/12/23/53018.aspx

2006/07/14

.NET Framework 2.0にはタスクトレイにアイコンを表示させるためのクラス、NotifyIconクラスがあります。これを使ってみましょう。

function CreateNotifyIconMenu()
{
 # menuItem1オブジェクトの作成
 $menuItem1 = new-object System.Windows.Forms.MenuItem("終了(&X)")
 
 # Clickイベント
 $menuItem1.Add_Click({Form_Closing})
 
 # contextMenuオブジェクトの作成
 $contextMenu = new-object System.Windows.Forms.ContextMenu
 
 # menuItemオブジェクトをcontextMenuオブジェクトのMenuItemsコレクションに追加
 [void]$contextMenu.MenuItems.Add($menuItem1)
 #↑ここの[void]を忘れるとAddメソッドの戻り値がreturnされてしまう。
 
 return ($contextMenu)
}
function Form_Closing()
{
 # フォームとシステムトレイアイコンを非表示に
 $form.Visible = $false
 $notifyIcon.Visible = $false
 
 # PowerShellの終了
 [System.Environment]::Exit(0)
}
[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Windows.Forms.Application]::EnableVisualStyles()
# notifyIconオブジェクトの作成とプロパティの設定
$notifyIcon = new-object System.Windows.Forms.NotifyIcon
# System.Drawing.Iconクラスのコンストラクタにはicoファイルのパスを指定する
$notifyIcon.Icon = new-object System.Drawing.Icon C:\script\test\a.ico
$notifyIcon.Text = "PowerShell実行中"
$notifyIcon.ContextMenu = CreateNotifyIconMenu
$notifyIcon.Visible = $true
# formオブジェクトの作成
$form = new-object System.Windows.Forms.Form
# Closingイベント
$form.Add_Closing({Form_Closing})
# フォームの表示
[void]$form.showDialog()

理論上はフォームを表示させなくても良いはずなんですが、ループをまわすいい方法が思いつきませんでした(start-sleepを使うとその間イベントが実行されない)。あと、showDialogで表示したフォームを閉じるいい方法も思いつかなかったので[System.Environment]::Exit(0)
としてPowerShell自体のプロセスを終了させています(exitとやるとエラーが出るんですよね。なんでしょうこれは)。これらに対する良い解決策をお持ちの方は教えてください。

PowerShellのfunctionって引数がなしのとき、呼び出す際()を使うとエラーになるんですよね。あと、文頭に持ってこないといけないのも気に入りません。何とかならなかったのでしょうか…。

せっかくタスクトレイが使えるのに、フォームとコンソールまで表示されてしまいます。そこでWSHを併用してごまかす方法を。

Set WshShell=CreateObject("WScript.Shell")
WshShell.Run "powershell test.ps1",0

このようなvbsファイルを作ってps1ファイルをキックしてやります。Runメソッドの第二引数に0を指定すると、コンソールおよびフォームが非表示になりますが、タスクトレイは表示されます。この手を使うとまるでタスクトレイだけが表示されているかのような状態を作り出せます。ちなみに、MessageBoxも同じようにそれだけを表示させることができます。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2006/07/14/32470.aspx

2006/07/07

IEを使って指定したURLのファイルをダウンロードしようとしても、IEで開かれてしまったりしてなかなかうまくいきません。そこでこんなスクリプトを作ってみました。クリップボードに格納されたURLのファイルをダウンロードするスクリプトです。PowerShellではなくWSHのスクリプトですが、たまにはこんなのも良いでしょう。

Set Ie = WScript.CreateObject("InternetExplorer.Application")
Ie.Navigate "about:blank"
Do While Ie.Busy And IE.readyState=4
    Wscript.Sleep 100
Loop
'クリップボードの文字列を取得。
sClipBoard = Ie.Document.parentWindow.clipboardData.getData("text")  
Ie.Quit 
If Left(sClipBoard,5)="http:" Then
    sDest = Mid(sClipBoard,InStrRev(sClipBoard,"/")+1)
    Const adTypeBinary = 1
    Const adSaveCreateNotExist = 1
    Const adSaveCreateOverWrite = 2
    Set oHTTP = WScript.CreateObject("Msxml2.XMLHTTP")
    oHTTP.Open "GET", sClipBoard, False
    oHTTP.Send
    Set Stream = WScript.CreateObject("Adodb.Stream")
    Stream.Type = adTypeBinary
    Stream.Open
    Stream.Write oHTTP.responseBody
    Stream.Savetofile sDest, adSaveCreateOverWrite
    msgbox "done"
End If
元記事:http://blogs.wankuma.com/mutaguchi/archive/2006/07/07/31826.aspx

新しい記事のページへ


Copyright © 2005-2018 Daisuke Mutaguchi All rights reserved
mailto: mutaguchi at roy.hi-ho.ne.jp
プライバシーポリシー

Twitter

Books