2008年7月 4日 (金)

window.close()で警告ダイアログを出さないで閉じる。

いろいろ方法があるようですが、

window.close()

の代わりに、

window.open("about:blank","_self").close()

同様に、

window.parent.close()

window.top.close()

の代わりに、

window.open("about:blank","_parent").close()

window.open("about:blank","_top").close()

2008年7月 3日 (木)

バッチで、複数のコマンドを並列実行して、直後に一括して待ち合わせる。

コマンドライン1 >&2 | コマンドライン2 >&2 | コマンドライン3
とします。

標準出力がないなら >&2 は不要です。

notepad.exe | notepad.exe | notepad.exe
みたいに。

2008年7月 2日 (水)

バッチから非同期に起動したアプリの終了を待ち合わせる。

start notepad.exe >running.1
で、非同期に起動し、

del running.1
if exist running.1 (echo 実行中) else echo 終了済
で、実行中か終了済かを判定し、

:wait
del running.1
if exist running.1 sleep.exe 1 & goto :wait
で、待ち合わせます。

複数の場合は、running.1の数字を変えて。

sleep.exeがないときは、ping.exe localhost -n 2 で代替して。

2008年7月 1日 (火)

現在のセキュリティ設定では、このファイルをダウンロードできません。

ダウンロードできないとき、
---------------------------
セキュリティの警告
---------------------------
現在のセキュリティ設定では、このファイルをダウンロードできません。
---------------------------
OK   
---------------------------
というダイアログが出ます。

このとき、そのダイアログの後ろに、もうひとつ、
---------------------------
0% / URL - ファイル名 完了しました
---------------------------
ファイルの情報を取得しています...
URL - ファイル名
---------------------------
というダイアログが出ていることがあります。

後ろのダイアログがないときは、そのセキュリティゾーンのセキュリティレベルで、
「ファイルのダウンロード」を「無効にする」→「有効にする」
後ろのダイアログがあるときは、前者の設定に加えて、
「アプリケーションと安全でないファイルの起動」を「無効にする」→「ダイアログを表示する」

つまり、アプリケーションと安全でないファイルのダウンロードには二重に鍵が掛かっているということです。

2008年6月27日 (金)

IEをデザインモードに変える。

なぜか、IEのメニューにないので、コンテキストメニューを拡張します。

DesignMode.htm

<script>
external.menuArguments.top.document.designMode='On';
</script>

レジストリ

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\デザインモードに変更(&D)]
@="C:\\どこか\\DesignMode.htm"

逆の「ブラウズ表示」に戻すほうは、IEのコンテキストメニューにあります。

2008年6月25日 (水)

XP + IE7 で、Microsoft Internet Controls の参照設定が変です。

XP + IE6 では、Microsoft Internet Controls の参照先は、
C:\WINDOWS\system32\shdocvw.dll
ですが、IE7を入れると、
C:\WINDOWS\system32\ieframe.dll
に変わります。

ところが、その状態では、いろいろ問題が出るようです。

例えば、IE7のShell/IE分離に対応して、Shellを起こそうと、
Dim ie As SHDocVw.ShellBrowserWindow
Set ie = New SHDocVw.ShellBrowserWindow
とすると、エラーになります。

その場合、一度、Microsoft Internet Controls の参照設定を外して、
C:\WINDOWS\system32\shdocvw.dll
を参照設定し直します。

2008年6月24日 (火)

テキストファイルの行数を調べる。

よくあるのは、FSOで追加書き込みでオープンして、Lineプロパティを見るものです。

Function NumberOfLines(File)
Const forAppending=8
Dim TStream
Set TStream=CreateObject("Scripting.FileSystemObject").OpenTextFile(File,forAppending)
NumberOfLines=TStream.Line
End Function

しかし、このやり方には以下の問題があります。
出力オープンがエラーになることがある。
行数に1行の誤差が出ることがある。

なら、FSOでReadオープンしてSkipLineで数えれば、そういう問題はありません。

Function NumberOfLines(File)
Dim TStream
NumberOfLines=0
Set TStream=CreateObject("Scripting.FileSystemObject").OpenTextFile(File)
Do While Not TStream.AtEndOfStream
  TStream.SkipLine
  NumberOfLines=NumberOfLines+1
Loop
End Function

でも、性能が気になります。

じゃ、一度にすべて読めば、速い?

Function NumberOfLines(File)
Dim TStream
Set TStream=CreateObject("Scripting.FileSystemObject").OpenTextFile(File)
If Not TStream.AtEndOfStream Then TStream.ReadAll
NumberOfLines=TStream.Line+(TStream.Column=1)
End Function

今度は、メモリが気になります。

そこで、すべて読み飛ばします。

Function NumberOfLines(File)
Dim TStream
Set TStream=CreateObject("Scripting.FileSystemObject").OpenTextFile(File)
Do While Not TStream.AtEndOfStream
  TStream.Skip 1073741824
Loop
NumberOfLines=TStream.Line+(TStream.Column=1)
End Function

ところで、この TStream.Line+(TStream.Column=1) の意味は?

TStream.Line は、UBound(Split(vbLf & TStream..ReadAll,vbLf)) みたいなもので、末尾の改行の有無によって、1行多く数えます。
TStream.Column は、a=Split(vbLf & TStream..ReadAll,vbLf): Len(a(UBound(a)))+1 みたいなものです。
なので、改行の後に文字がない場合(TStream.Column=1)、1を減じます(True=-1)。

2008年6月22日 (日)

フレーム構成を表示するコンテキストメニュー拡張

フレームの構成を、

親フレームのURL
子フレームのURL
孫フレームのURL

みたいに、インデントを付けて新規のウィンドウに表示します。

frames.htm

<script language=jscript defer>
var win=window.open("about:blank","_blank");
var doc=win.document;
doc.open("text/html");
doc.writeln('<'+'dl>');
doc.writeln('<'+'dt>'+external.menuArguments.top.location+'<'+'/dt>');
subframes(external.menuArguments.top)
doc.writeln('<'+'/dl>');
doc.close();
doc.title="フレーム構成";

function subframes(frm){
  doc.writeln('<'+'dl>');
  try{
    for(var i=0; i<frm.frames.length; i++){
      doc.writeln('<'+'dt>'+frm.frames(i).location+'<'+'/dt>');
      subframes(frm.frames(i));
    }
  }catch(e){}
  doc.writeln('<'+'/dl>');
}
</script>

レジストリ

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\フレーム構成]
@="C:\\どこか\\frames.htm"

2008年6月21日 (土)

IE7でIEの名前が変わりました。

IWebBrowser2.Nameが、
IE6 Microsoft Internet Explorer
から
IE7 Windows Internet Explorer
に変わりました。

もし、IEのタイトルでAppActivateしてたりすると困ります。

エクスプローラの名前は、XP SP3でも、IE6と同じで、変わってません。
ひょっとして、Vistaでは、変わってるかも知れません。。。
と言っても、エクスプローラのタイトルには現れませんが。。。

2008年6月20日 (金)

Vistaの保護モードで、CreateObject("InternetExplorer.Application")を使う。

Vistaの保護モードでは、困ったことに、

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を新規に起こすケースが駄目?
既存ならOK?

もし、そうなら、たぶん、これで行けると思うのですが、Vista環境がないので試せません。

と思ったら、新規でも既存でも駄目みたいですね。なら、これならどうだろ?

Set Shell=CreateObject("Shell.Application")
Shell.ShellExecute "iexplore.exe","-embedding"
Do
  For Each ie In Shell.Windows()
    If ie.ReadyState<>0 Then
    ElseIf LCase(Right(ie.FullName,13))="\iexplore.exe" Then
      Exit Do
    End If
  Next
  WScript.Sleep 100
Loop
ie.Visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
  WScript.Sleep 100
Loop

«PowerShellでZIP圧縮する。(その2)