2022年5月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
無料ブログはココログ

« 2008年5月 | トップページ | 2008年7月 »

2008年6月27日 (金)

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

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

DesignMode.htm

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

DesignMode.reg

Windows Registry Editor Version 5.00

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

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

※ IE7までは、designModeを変えると自動でrefreshされましたが、IE9では、refreshが必要なようです。IE8はちょっと分かりません。

<script>
external.menuArguments.top.document.designMode='On';
external.menuArguments.top.setTimeout('location.reload()',0,'javascript');
</script>

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
を参照設定し直します。

あるいは、
Application.VBE.ActiveVBProject.References.AddFromFile("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>

frames.reg

Windows Registry Editor Version 5.00

[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月19日 (木)

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

IE7に対応。

置換確認ダイアログを出さずに置換します。

MakeExZIP.ps1 ZIPファイル ファイル...

if($args.length -lt 2){
  write-output "Arguments Missing.";
  write-output "Usage: MakeExZIP.PS1 ZIPfile files...";
  return;
}
if([System.IO.Path]::GetExtension($args[0]) -ne ".zip"){
  write-output ("Invalid Extension Name - " + $args[0]);
  return;
}
$ie = $null;
if([System.IO.File]::Exists($args[0])){
  [void][reflection.assembly]::LoadWithPartialName("'Microsoft.VisualBasic");
#  IE7以降も可
  $Shell=new-object -com Shell.Application;
  $ZIPfile=$Shell.NameSpace([System.IO.Path]::GetFullPath($args[0])).Self.Path;
  $Shell.ShellExecute("explorer.exe",$ZIPfile,$null,$null,0);
  while($true){
    foreach($ie in $Shell.Windows()){
      if($ie.Visible){}
      elseif([Microsoft.VisualBasic.Information]::TypeName($ie.Document) -like "IShellFolderViewDual*"){
        if($ie.Document.Folder.Self.Path -eq $ZIPfile){break;}
      }
      $ie=$null;
    }
    if($ie){break;}
    Start-sleep -milliseconds 100;
  }
#  $ie=new-object -com InternetExplorer.Application; #IE7以降ダメ
#  $ie=[Microsoft.VisualBasic.Interaction]::GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}"); #IE7以降も可
#  $ie.Navigate([System.IO.Path]::GetFullPath($args[0]));
  while($ie.Busy -or ($ie.ReadyState -ne 4)){
    Start-sleep -milliseconds 100;
  }
  $Shell=$ie.Document.Application;
  $zFolder=$ie.Document.Folder;
}else{
  set-content $args[0] ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18));
  $shell=new-object -com shell.application;
  $zFolder = $Shell.NameSpace([System.IO.Path]::GetFullPath($args[0]));
}
for($k=1;$k -lt $args.length;$k++){
  $File=[System.IO.Path]::GetFileName($args[$k]);
  $sFolder=$Shell.NameSpace([System.IO.Path]::GetFullPath($args[$k]+"\.."));
  $sFolderItem=$sFolder.ParseName($File);
  if(-not $sFolderItem){
    write-output ("File Not Found. - " + $File);
    break;
  }
  $zFolderItem=$zFolder.ParseName($File);
  if($zFolderItem){
    if($tFolderName -eq $null){
      $tFolderName = [System.IO.Path]::GetTempFileName();
      [System.IO.File]::Delete($tFolderName);
      [void][System.IO.Directory]::CreateDirectory($tFolderName);
      $tFolder = $Shell.NameSpace(($tFolderName));
    }
    $Count = $zFolder.Items().Count;
    $zFolderItem.InvokeVerb("cut");
    $tFolder.Self.InvokeVerb("paste");
    while($zFolder.Items().Count -ne $Count - 1){
      Start-sleep -milliseconds 1000;
    }
    $zFolderItem = $null;
  }
  $Count = $zFolder.Items().Count;
  $zFolder.CopyHere($sFolderItem);
  while($zFolder.Items().Count -eq $Count + 1){
    Start-sleep -milliseconds 1000;
  }
  $sFolderItem = $null;
}
$tFolder = $null;
$zFolder = $null;
$Shell = $null;
if($ie){$ie.Quit();}
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
while([Microsoft.VisualBasic.Information]::TypeName($ie) -eq "IWebBrowser2"){
  Start-sleep -milliseconds 1000;
}
if($tFolderName){
  [System.IO.Directory]::Delete($tFolderName,$true);
}

2008年6月18日 (水)

PowerShellでZIP展開する。

IE7に対応。

ExtractZIP.PS1 ZIPファイル [展開先フォルダ\][ファイル]...

if($args.length -lt 1){
  write-output "Arguments Missing.";
  write-output "Usage: ExtractZIP.PS1 ZIPfile [folder\][file]...";
  return;
}
if([System.IO.Path]::GetExtension($args[0]) -ne ".zip"){
  write-output ("Invalid Extension Name - " + $args[0]);
  return;
}
if(-not [System.IO.File]::Exists($args[0])){
  write-output ("File Not Found. - " + $args[0]);
  return;
}
[void][reflection.assembly]::LoadWithPartialName("'Microsoft.VisualBasic");
#IE7以降も可
$Shell=new-object -com Shell.Application;
$ZIPfile=$Shell.NameSpace([System.IO.Path]::GetFullPath($args[0])).Self.Path;
$Shell.ShellExecute("explorer.exe",$ZIPfile,$null,$null,0);
while($true){
  foreach($ie in $Shell.Windows()){
    if($ie.Visible){}
    elseif([Microsoft.VisualBasic.Information]::TypeName($ie.Document) -like "IShellFolderViewDual*"){
      if($ie.Document.Folder.Self.Path -eq $ZIPfile){break;}
    }
    $ie=$null;
  }
  if($ie){break;}
  Start-sleep -milliseconds 100;
}
#$ie=new-object -com InternetExplorer.Application; #IE7以降ダメ
#$ie=[Microsoft.VisualBasic.Interaction]::GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}"); #IE7以降も可
#$ie.Navigate([System.IO.Path]::GetFullPath($args[0]));
while($ie.Busy -or ($ie.ReadyState -ne 4)){
  Start-sleep -milliseconds 100;
}
$Shell=$ie.Document.Application;
$zFolder=$ie.Document.Folder;
if($args.length -eq 1){
  $dFolder=$Shell.NameSpace(([System.Environment]::CurrentDirectory));
  $dFolder.CopyHere(($zFolder.Items()));
}elseif(($arg.length -eq 2) -and $args[1].EndsWith("\")){
  if(-not [System.IO.Directory]::Exists($args[1])){
    write-output ("Folder Not Found. - " + $args[1]);
    return;
  }
  $dFolder=$Shell.NameSpace([System.IO.Path]::GetFullPath($args[1]));
  $dFolder.CopyHere(($zFolder.Items()));
}else{
  for($k=1;$k -lt $args.length;$k++){
    $File=[System.IO.Path]::GetFileName($args[$k]);
    $Folder=[System.IO.Path]::GetDirectoryName($args[$k]);
    if($Folder -ne ""){
      if(-not [System.IO.Directory]::Exists($Folder)){
        write-output ("Folder Not Found. - " + $Folder);
        break;
      }
    }
    $dFolder=$Shell.NameSpace([System.IO.Path]::GetFullPath($args[$k]+"\.."));
    $zFolderItem=$zFolder.ParseName($File);
    if(-not $zFolderItem){
      write-output ("File Not Found. - " + $File);
      break;
    }
    $dFolder.CopyHere($zFolderItem);
  }
}
$ie.Quit();

2008年6月17日 (火)

VB.NETでZIP圧縮コマンドを作る。(その2)

IE7に対応。

置換確認ダイアログを出さずに置換します。

MakeExZIP.exe ZIPファイル ファイル...

vbc MakeExZIP.VB

Option Explicit
Imports Microsoft.VisualBasic
Imports System
Imports System.IO

Public Class Zip
Public Shared Function Main(ByVal Arguments() As String) As Integer
If Arguments.Length<2 Then
  Console.Error.WriteLine("Arguments Missing.")
  Console.Error.WriteLine("Usage: MakeExZip zipfile files...")
  Return 1
End If
If Path.GetExtension(Arguments(0).ToLower()) <> ".zip" Then
  Console.Error.WriteLine("Invalid Extension Name - " & Arguments(0))
  Return 1
End If
Try
  Dim ie As Object = Nothing
  Dim Shell As Object
  Dim zFolder As Object
  If File.Exists(Arguments(0)) Then
'IE7以降も可
    Shell = CreateObject("Shell.Application")
    Dim ZIPfile As String = Shell.NameSpace(Path.GetFullPath(Arguments(0))).Self.Path
    Shell.ShellExecute("explorer.exe",ZIPfile,,,0)
    Do
      For Each ie In Shell.Windows()
        If ie.Visible Then
        ElseIf InStr(TypeName(ie.Document),"IShellFolderViewDual") Then
          If ie.Document.Folder.Self.Path = ZIPfile Then Exit Do
        End If
      Next
      ie = Nothing
      Threading.Thread.Sleep(100)
    Loop
'    ie = CreateObject("InternetExplorer.Application") 'IE7以降ダメ
'    ie = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") 'IE7以降も可
'    ie.Navigate(Path.GetFullPath(Arguments(0))
    Do While ie.Busy OrElse ie.ReadyState <> 4
      Threading.Thread.Sleep(100)
    Loop
    Shell = ie.Document.Application
    zFolder = ie.Document.Folder
  Else
    Dim fs As FileStream = File.Create(Arguments(0))
    Dim b As Byte() = {&H50, &H4B, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    fs.Write(b,0,b.Length)
    fs.Close()
    Shell = CreateObject("Shell.Application")
    zFolder = Shell.NameSpace(Path.GetFullPath(Arguments(0)))
  End If
  Dim k As Integer
  Dim tFolderName As String = ""
  Dim tFolder As Object = Nothing
  For k = 1 To Arguments.Length-1
    Dim FileName As String = Path.GetFileName(Arguments(k))
    Dim sFolderItem As Object = Shell.NameSpace(Path.GetFullPath(Arguments(k) & "\..")).ParseName(FileName)
    If sFolderItem Is Nothing Then
      Console.Error.WriteLine("File Not Found. - " & Arguments(k))
      Exit For
    End If
    Dim Count As Integer
    Dim zFolderItem As Object = zFolder.ParseName(FileName)
    If Not zFolderItem Is Nothing Then
      If tFolderName="" Then
        tFolderName = Path.GetTempFileName()
        File.Delete(tFolderName)
        Directory.CreateDirectory(tFolderName)
        tFolder = Shell.NameSpace((tFolderName))
      End If
      Count = zFolder.Items().Count
'      tFolder.MoveHere(zFolderItem)
      zFolderItem.InvokeVerb("cut")
      tFolder.Self.InvokeVerb("paste")
      Do While zFolder.Items().Count <> Count - 1
        Threading.Thread.Sleep(1000)
      Loop
      zFolderItem = Nothing
    End If
    Count = zFolder.Items().Count
    zFolder.CopyHere(sFolderItem)
    Do While zFolder.Items().Count <> Count + 1
      Threading.Thread.Sleep(1000)
    Loop
    sFolderItem = Nothing
  Next
  tFolder = Nothing
  zFolder = Nothing
  Shell = Nothing
  If Not ie Is Nothing Then ie.Quit()
  Do While TypeName(ie) = "IWebBrowser2"
    Threading.Thread.Sleep(1000)
  Loop
  If tFolderName<>"" Then
    Directory.Delete(tFolderName,True)
  End If
Catch
  Console.Error.WriteLine("Source" & vbTab & vbTab & Err.Source & vbLf & "Number" & vbTab & vbTab & Err.Number & vbLf & "Description" & vbTab & Err.Description & vbLf & "DLL Error" & vbTab & Err.LastDLLError)
  Return 3
Finally
End Try
End Function
End Class

一部のShellのメソッドでは型変換のため、(())で変数を式にする必要があります。
一部のShellのオブジェクトでは、参照の解放(Nothingの代入)がないと、ZIP展開用の一時ファイルが残ります。

2008年6月16日 (月)

VB.NETでZIP展開コマンドを作る。

IE7に対応。

ExtractZIP.exe ZIPファイル [展開先フォルダ\][ファイル名またはフォルダ名]...

vbc ExtractZIP.VB

Option Explicit
Imports Microsoft.VisualBasic
Imports System
Imports System.IO

Public Class Zip
Public Shared Function Main(ByVal Arguments() As String) As Integer
If Arguments.Length<1 Then
  Console.Error.WriteLine("Arguments Missing.")
  Console.Error.WriteLine("Usage: ExtractZip zipfile files...")
  Return 1
End If
If Path.GetExtension(Arguments(0).ToLower()) <> ".zip" Then
  Console.Error.WriteLine("Invalid Extension Name - " & Arguments(0))
  Return 1
End If
If Not File.Exists(Arguments(0)) Then
  Console.Error.WriteLine("File Not Found. - " & Arguments(0))
  Return 1
End If
Dim ie As Object = Nothing
Dim Shell As Object
Try
'IE7以降も可
  Shell = CreateObject("Shell.Application")
  Dim ZIPfile As String = Shell.NameSpace(Path.GetFullPath(Arguments(0))).Self.Path
  Shell.ShellExecute("explorer.exe",ZIPfile,,,0)
  Do
    For Each ie In Shell.Windows()
      If ie.Visible Then
      ElseIf InStr(TypeName(ie.Document),"IShellFolderViewDual") Then
        If ie.Document.Folder.Self.Path = ZIPfile Then Exit Do
      End If
    Next
    ie = Nothing
    Threading.Thread.Sleep(100)
  Loop
'  ie = CreateObject("InternetExplorer.Application") 'IE7以降ダメ
'  ie = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") 'IE7以降も可
'  ie.Navigate(Path.GetFullPath(Arguments(0))
  Do While ie.Busy OrElse ie.ReadyState <> 4
    Threading.Thread.Sleep(100)
  Loop
  Shell = ie.Document.Application
  Dim zFolder As Object = ie.Document.Folder
  If Arguments.Length = 1 Then
    Dim dFolder As Object = Shell.NameSpace((Environment.CurrentDirectory))
    dFolder.CopyHere((zFolder.Items()))
  ElseIf Arguments.Length = 2 AndAlso Arguments(1).EndsWith("\") Then
    If Not Directory.Exists(Arguments(1)) Then
      Console.Error.WriteLine("Folder Not Found. - " & Arguments(1))
      Return 1
    End If
    Dim dFolder As Object = Shell.NameSpace(Path.GetFullPath(Arguments(1)))
    dFolder.CopyHere((zFolder.Items()))
  Else
    Dim k As Integer
    For k = 1 To Arguments.Length-1
      Dim FileName As String = Path.GetFileName(Arguments(k))
      Dim FolderName As String = Path.GetDirectoryName(Arguments(k))
      If FolderName<>"" AndAlso Not Directory.Exists(FolderName) Then
        Console.Error.WriteLine("Folder Not Found. - " & FolderName)
        Exit For
      End If
      Dim dFolder As Object = Shell.Namespace(Path.GetFullPath(Arguments(k) & "\.."))
      Dim zFolderItem As Object = zFolder.ParseName(FileName)
      If zFolderItem Is Nothing Then
        Console.Error.WriteLine("File Not Found. - " & FileName)
        Exit For
      End If
      dFolder.CopyHere(zFolderItem)
    Next
  End If
Catch
  Console.Error.WriteLine("Source" & vbTab & vbTab & Err.Source & vbLf & "Number" & vbTab & vbTab & Err.Number & vbLf & "Description" & vbTab & Err.Description & vbLf & "DLL Error" & vbTab & Err.LastDLLError)
  Return 3
Finally
  If TypeName(ie) = "IWebBrowser2" Then ie.Quit()
End Try
End Function
End Class

2008年6月15日 (日)

ZIPファイルの中身を削除するバッチファイル(その2)

IE7に対応。

DeleteExZIP.CMD ZIPファイル ファイル名...

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end
var Usage="Usage: DeleteExZIP.CMD ZIPfile files...";
if(WScript.Arguments.Count()<2){
  WScript.Echo(Usage);
  WScript.Quit();
}
var ZIPfile=WScript.Arguments.Item(0);
var fso=new ActiveXObject("Scripting.FileSystemObject");
if(fso.GetExtensionName(ZIPfile).toUpperCase()!="ZIP"){
  WScript.Echo("Invalid Extension Name -",ZIPfile);
  WScript.Quit();
}
if(!fso.FileExists(ZIPfile)){
  WScript.Echo("ZIP file not found. -",ZIPfile);
  WScript.Quit();
}
ZIPfile=fso.GetAbsolutePathName(ZIPfile);
//IE7以降も可
var Shell=new ActiveXObject("Shell.Application");
var Path=Shell.NameSpace(ZIPfile).Self.Path;
Shell.ShellExecute("explorer.exe",ZIPfile,null,null,0);
x:while(true){
  for(var k=Shell.Windows().Count;k>0;k--){
    var ie=Shell.Windows().Item(k-1);
    if(! ie.Visible && "Folder" in ie.Document && ie.Document.Folder.Self.Path==Path) break x;
  }
  WScript.Sleep(100);
}
//var ie=new ActiveXObject("InternetExplorer.Application");//IE7以降ダメ
//var ie=GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}");//IE7以降も可
//ie.Navigate(ZIPfile);
while(ie.Busy||ie.ReadyState!=4) WScript.Sleep(100);
var Shell=ie.Document.Application;
var zFolder=ie.Document.Folder;
var tFolderName=fso.BuildPath(fso.GetParentFolderName(ZIPfile),fso.GetTempName());
fso.CreateFolder(tFolderName);
var tFolder=Shell.NameSpace(tFolderName);
for(var k=1;k<WScript.Arguments.Count();k++){
  var Path=fso.GetFileName(WScript.Arguments.Item(k));
  var FileName=Path.toLowerCase();
  var zFolderItem=zFolder.ParseName(FileName);
  if(!zFolderItem){
    WScript.Echo(Path,"- Not Found.");
    break;
  }
  var Count=zFolder.Items().Count;
//  tFolder.MoveHere(zFolderItem);
  zFolderItem.InvokeVerb("cut");
  tFolder.Self.InvokeVerb("paste");
  while(zFolder.Items().Count!=Count-1){
//    WScript.Echo(zFolder.Items().Count,Count);
    WScript.Sleep(100);
  }
}
tFolder=undefined;
Shell=undefined;
ie.Quit();
fso.DeleteFolder(tFolderName);
WScript.Quit();

2008年6月14日 (土)

ZIPファイルを展開するバッチファイル

IE7に対応。

ExtractZIP.CMD ZIPファイル [ファイルまたはフォルダ名...]

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end
var Usage="Usage: ExtractZIP.CMD ZIPfile [files...]";
if(WScript.Arguments.Count()<1){
  WScript.Echo(Usage);
  WScript.Quit();
}
var ZIPfile=WScript.Arguments.Item(0);
var fso=new ActiveXObject("Scripting.FileSystemObject");
if(fso.GetExtensionName(ZIPfile).toUpperCase()!="ZIP"){
  WScript.Echo("Invalid Extension Name -",ZIPfile);
  WScript.Quit();
}
if(!fso.FileExists(ZIPfile)){
  WScript.Echo("ZIP file not found. -",ZIPfile);
  WScript.Quit();
}
ZIPfile=fso.GetAbsolutePathName(ZIPfile);
//IE7以降も可
var Shell=new ActiveXObject("Shell.Application");
var Path=Shell.NameSpace(ZIPfile).Self.Path;
Shell.ShellExecute("explorer.exe",ZIPfile,null,null,0);
x:while(true){
  for(var k=Shell.Windows().Count;k>0;k--){
    var ie=Shell.Windows().Item(k-1);
    if(! ie.Visible && "Folder" in ie.Document && ie.Document.Folder.Self.Path==Path) break x;
  }
  WScript.Sleep(100);
}
//var ie=new ActiveXObject("InternetExplorer.Application");//IE7以降ダメ
//var ie=GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}");//IE7以降も可
//ie.Navigate(ZIPfile);
while(ie.Busy||ie.ReadyState!=4) WScript.Sleep(100);
var Shell=ie.Document.Application;
var zFolder=ie.Document.Folder;
if(WScript.Arguments.Count()<2){
  var dFolder=Shell.NameSpace(fso.GetAbsolutePathName(""));
  dFolder.CopyHere(zFolder.Items());
}else if(WScript.Arguments.Count()==2 && WScript.Arguments.Item(1).charAt(WScript.Arguments.Item(1).length-1)=='\\'){
  var dFolder=Shell.NameSpace(fso.GetAbsolutePathName(WScript.Arguments.Item(1)));
  if(dFolder){
    dFolder.CopyHere(zFolder.Items());
  }else{
    WScript.Echo(WScript.Arguments.Item(1),"- Not Found.");
  }
}else{
  for(var k=1;k<WScript.Arguments.Count();k++){
    var FolderName=fso.GetParentFolderName(WScript.Arguments.Item(k));
    var FileName=fso.GetFileName(WScript.Arguments.Item(k));
    var dFolder=Shell.NameSpace(fso.GetAbsolutePathName(FolderName));
    if(!dFolder){
      WScript.Echo(FolderName,"- Not Found.");
      break;
    }
    var zFolderItem=zFolder.ParseName(FileName);
    if(!zFolderItem){
      WScript.Echo(FileName,"- Not Found.");
      break;
    }
    dFolder.CopyHere(zFolderItem);
  }
}
ie.Quit();
WScript.Quit();

2008年6月13日 (金)

ZIPファイルを作成/追加/置換するバッチファイル(その2)

IE7に対応。

MakeExZIP.CMD ZIPファイル名 ファイル...

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end
var Usage="Usage: MakeExZIP.CMD ZIPfile files...";
if(WScript.Arguments.Count()<2){
  WScript.Echo(Usage);
  WScript.Quit();
}
var ZIPfile=WScript.Arguments.Item(0);
var fso=new ActiveXObject("Scripting.FileSystemObject");
if(fso.GetExtensionName(ZIPfile).toUpperCase()!="ZIP"){
  WScript.Echo("Invalid Extension Name -",ZIPfile);
  WScript.Quit();
}
ZIPfile=fso.GetAbsolutePathName(ZIPfile);
if(fso.FileExists(ZIPfile)){
//IE7以降も可
var Shell=new ActiveXObject("Shell.Application");
var Path=Shell.NameSpace(ZIPfile).Self.Path;
Shell.ShellExecute("explorer.exe",ZIPfile,null,null,0);
x:while(true){
  for(var k=Shell.Windows().Count;k>0;k--){
    var ie=Shell.Windows().Item(k-1);
    if(! ie.Visible && "Folder" in ie.Document && ie.Document.Folder.Self.Path==Path) break x;
  }
  WScript.Sleep(100);
}
//var ie=new ActiveXObject("InternetExplorer.Application");//IE7以降ダメ
//var ie=GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}");//IE7以降も可
//ie.Navigate(ZIPfile);
  while(ie.Busy||ie.ReadyState!=4) WScript.Sleep(100);
  var Shell=ie.Document.Application;
  var zFolder=ie.Document.Folder;
}else{
  var File=fso.CreateTextFile(ZIPfile,false);
  File.Write("PK" + String.fromCharCode(5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0));
  File.Close();
  var Shell=new ActiveXObject("Shell.Application");
  var zFolder=Shell.NameSpace(ZIPfile);
}
for(var k=1;k<WScript.Arguments.Count();k++){
  var Path=WScript.Arguments.Item(k);
  var FileName=fso.GetFileName(Path).toLowerCase();
  var sFolder=Shell.NameSpace(fso.GetParentFolderName(fso.GetAbsolutePathName(Path)));
  var sFolderItem=sFolder.ParseName(FileName);
  if(!sFolderItem){
    WScript.Echo(Path,"- Not Found.");
    break;
  }
  var zFolderItem=zFolder.ParseName(FileName);
  if(zFolderItem){
    if(tFolderName==undefined){
      var tFolderName=fso.BuildPath(fso.GetParentFolderName(ZIPfile),fso.GetTempName());
      fso.CreateFolder(tFolderName);
      var tFolder=Shell.NameSpace(tFolderName);
    }
    var Count=zFolder.Items().Count;
    zFolderItem.InvokeVerb("cut");
    tFolder.Self.InvokeVerb("paste");
    while(zFolder.Items().Count!=Count-1){
      WScript.Sleep(100);
    }
  }
  var Count=zFolder.Items().Count;
  zFolder.CopyHere(sFolderItem);
  while(zFolder.Items().Count!=Count+1){
    WScript.Sleep(100);
  }
}
tFolder=undefined;
Shell=undefined;
if(ie) ie.Quit();
if(tFolderName) fso.DeleteFolder(tFolderName);
WScript.Quit();

2008年6月12日 (木)

VBAでZIP展開する。

IE7に対応。

Call ExtractZIP(ZIPファイル,[展開先フォルダ\][ファイル名またはフォルダ名]...)

Option Explicit

Sub ExtractZIP(ZIPfile As String, ParamArray Files() As Variant)
Dim fso As Object
Dim ie As Object
Dim Shell As Object
Dim zFolder As Object
Dim dFolder As Object
Dim Path As Variant
Dim FolderName As String
Dim FileName As String
Dim zFolderItem As Object

Set fso = CreateObject("Scripting.FileSystemObject")
If UCase(fso.GetExtensionName(ZIPfile)) <> "ZIP" Then
  MsgBox "Invalid Extension Name - " & ZIPfile, vbCritical
  Exit Sub
End If
If Not fso.FileExists(ZIPfile) Then
  MsgBox "ZIP file not found. - " & ZIPfile, vbCritical
  Exit Sub
End If
ZIPfile = fso.GetAbsolutePathName(ZIPfile)
'IE7以降も可
Set Shell = CreateObject("Shell.Application")
ZIPfile = Shell.Namespace((ZIPfile)).Self.Path
Shell.ShellExecute "explorer.exe", ZIPfile, , , 0
Do
  For Each ie In Shell.Windows()
    If ie.Visible Then
    ElseIf InStr(TypeName(ie.Document), "IShellFolderViewDual") Then
      If ie.Document.Folder.Self.Path = ZIPfile Then Exit Do
    End If
  Next
  Application.Wait Now + TimeSerial(0, 0, 1)
Loop
'Set ie = CreateObject("InternetExplorer.Application")  'IE7以降ダメ
'Set ie = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") 'IE7以降も可
'ie.Navigate ZIPfile
Do While ie.Busy Or ie.ReadyState <> 4
  Application.Wait Now + TimeSerial(0, 0, 1)
Loop
Set Shell = ie.Document.Application
Set zFolder = ie.Document.Folder
If UBound(Files) = -1 Then
  Set dFolder = Shell.Namespace(fso.GetAbsolutePathName(""))
  dFolder.CopyHere zFolder.Items()
ElseIf UBound(Files) = 0 And Right(Files(0), 1) = "\" Then
  Set dFolder = Shell.Namespace(fso.GetAbsolutePathName(Files(0)))
  If dFolder Is Nothing Then
    MsgBox Files(0) & " - Not Found.", vbCritical
  Else
    dFolder.CopyHere zFolder.Items()
  End If
Else
  For Each Path In Files
    FolderName = fso.GetParentFolderName(Path)
    FileName = fso.GetFileName(Path)
    Set dFolder = Shell.Namespace(fso.GetAbsolutePathName(FolderName))
    If dFolder Is Nothing Then
      MsgBox FolderName & " - Not Found.", vbCritical
      Exit For
    End If
    Set zFolderItem = zFolder.ParseName(FileName)
    If zFolderItem Is Nothing Then
      MsgBox FileName & " - Not Found.", vbCritical
      Exit For
    End If
    dFolder.CopyHere zFolderItem
  Next
End If
ie.Quit
End Sub

ZIP展開のFolder.CopyHere()は同期なので、待ち合わせは必要ないけれど、Shell.Applicationだと、展開用の一時フォルダが残るので、Explorer.exeを使います。

2008年6月11日 (水)

フォームの入力データなどが入った、そのとき実行中のソースを表示する。

フォームにデータを入力して、後で見るために、「ソースの表示」や「名前を付けて保存」をしても、取れるのはオリジナルソースで、入力データなどはありません。

そこで、IEのコンテクストメニューを拡張して、新しいウィンドウを作成し、そのとき実行中のソースをテキストとして書き込みます。

フォームの送信前に、ページ上で右クリックして、コンテキストメニューから、「実行中のソースを表示(Z)」を選択します。

ViewHTML.htm

<script language=vbscript defer>
set win=window.open("about:blank","_blank")
set doc=win.document.open("text/plain")
doc.write external.menuArguments.top.document.documentElement.outerHTML
doc.close
doc.charset=external.menuArguments.top.document.charset
doc.title=external.menuArguments.top.document.title & ".txt"
</script>

ViewHTML.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\実行中のソースを表示(&Z)]
@="C:\\どこか\\ViewHTML.htm"

このソースを表示するウィンドウで「ソースの表示」や「名前を付けて保存」すると、フォームの入力データなどが入ったソースをファイルに取り出せます。

2008年6月10日 (火)

フォームを送信して戻るとフォームの入力データが消える問題を回避する。(その2)

掲示板に書き込んだり、フォームを送信する前に、別のウィンドウにそのページを残す。

掲示板に書き込んだり、フォームを送信するとき、パラメタエラーなどで、前に戻ると入力データが消えていて、再度一から入力し直す、なんてことがあります。

フォームの送信前に CTRL+N または、 [ファイル] - [新規ウィンドウ] (IE7) または、 [ファイル] - [新規作成] - [ウィンドウ] (IE6) すると、新しいウィンドウに同じページが表示されます。
このとき、入力データがコピーされるケースもありますが、消えるケースもあります。

そこで、IEのコンテクストメニューを拡張して、人為的に新しいウィンドウを作成し、ページ内容をコピーします。

フォームの送信前に、ページ上で右クリックして、コンテキストメニューから、「ウィンドウの複製(W)」を選択します。

CopyWindow.htm

<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<script language=vbscript defer>
set win=window.open(external.menuArguments.top.document.URL,"_blank")
Do While win.document.readyState<>"complete"
'  alert win.document.readyState
Loop
win.document.body.innerHTML=external.menuArguments.top.document.body.innerHTML
win.document.title="複製:" & win.document.title
</script>
</head>

CopyWindow.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\ウィンドウの複製(&W)]
@="C:\\どこか\\CopyWindow.htm"

こうして複製したウィンドウのタイトルには、元のタイトルの前に「複製:」が付きます。
このページからデータをコピーしたり、印刷するのは構いませんが、送信は、やめておいたほうがよいでしょう。

2008年6月 9日 (月)

フォームを送信して戻るとフォームの入力データが消える問題を回避する。

掲示板に書き込んだり、フォームを送信するとき、パラメタエラーなどで、前に戻ると入力データが消えていて、再度一から入力し直す、なんてことがあります。

リンクを開くときは、シフト+クリックやコンテキストメニューで「新しいウィンドウで開く」ことができます。
しかし、フォームの送信ボタンには、「新しいウィンドウで開く」がありません。

そこで、IEのコンテキストメニューを拡張し、メモリ中のソースを<form target="_blank">のように書き換えます。
これにより、フォーム送信時、現在のページを残して、フォーム送信後を「新しいウィンドウで開く」ことができます。

フォームの送信前に、ページ上で右クリックして、コンテキストメニューから、「ターゲット変更(@)」を選択します。

TargetNew.htm

<object id=sc classid=clsid:0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC>
<param name=language value=vbscript>
<param name=allowui value=true>
</object>
<script language=vbscript defer>
sc.addcode "function messagebox(s,b,t):messagebox=msgbox(s,b,t):end function"
r=sc.run("messagebox",external.menuArguments.top.document.forms.length,vbYesNoCancel+vbDefaultButton2,"Change All Targets ? Y(all) N(prompt) Cancel(none)")
If r<>vbCancel Then
  For Each form In external.menuArguments.top.document.forms
    If r=vbYes Then
      form.target="_blank"
    Else
      Select Case sc.run("messagebox",Join(Array(form.action,form.target,form.outerHTML),vbLf),vbYesNoCancel+vbDefaultButton2,"Change Target ?")
      Case vbYes
        form.target="_blank"
      Case vbCancel
        Exit For
      End Select
    End If
  Next
  If Not IsObject(form) Then call sc.run("messagebox","更新終了",vbOkOnly,"Target Changed.")
End If
</script>

TargetNew.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\ターゲット変更(&@)]
@="C:\\どこか\\TargetNew.htm"

そのままでは、MsgBox()が使えないので、ScriptControlの小技を使います。
WScript.ShellのPopUp()も使えたり使えなかったりするので使いません。

2008年6月 8日 (日)

「テキスト ファイル (*.txt)」で「名前を付けて保存」する。

ついでに。

SaveAsTEXT.htm

<html>
<head>
<script language=jscript defer>
var title=external.menuArguments.top.document.title;
if(title==""){
  a1.href=external.menuArguments.top.document.URL;
  title=new ActiveXObject("Scripting.FileSystemObject").GetFileName(decodeURI(a1.pathname));
}
title=title.replace(/[.:\\\/*?<>|"]/g,"_");
external.menuArguments.top.document.execCommand("saveas",true,title+".txt");
</script>
</head>
<body>
<a id=a1 ></a>
</body>
</html>

SaveAsFILE.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\テキスト ファイル(&-)]
@="C:\\どこか\\SaveAsFILE.htm"

document.execCommand("SaveAs")で、ファイル名に*.txtを指定しても、
ie.ExecWB(OLECMDID_SAVEAS)で、タイトルに*.txtを指定しても、どちらでもできます。

2008年6月 7日 (土)

ファイル名で「名前を付けて保存」する。

IEで、「名前を付けて保存」すると、デフォルトでタイトル名で保存されます。
これを、ファイル名で保存することはできない?

IE7でShell.Windows().Item()が使えなくなったので、コンテキストメニュー拡張に変更します。

SaveAsFILE.htm

<script language=vbscript defer>
external.menuArguments.top.document.execCommand "saveas"
</script>

SaveAsFILE.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Web ページ、ファイル名(&L)]
@="C:\\どこか\\SaveAsFILE.htm"

document.execCommand("SaveAs") は、旧ダイアログ「HTML ドキュメントの保存」です。
これでファイル名を指定しないと、「名前を付けて保存」と違って、URLからファイル名を生成します。

2008年6月 6日 (金)

「Web アーカイブ、単一のファイル (*.mht)」で「名前を付けて保存」する。

IE7では、「名前を付けて保存」のデフォルトが「Web アーカイブ、単一のファイル (*.mht)」なので、わざわざ作る意味がありませんが、IE6用に。

とは言っても、IE6なら、わざわざコンテキストメニュー拡張にする必要はないのですが。。。

SaveAsMHTML.htm

<html>
<head>
<object id=ShellWindows classid=clsid:9BA05972-F6A8-11CF-A442-00A0C90A8F39></object>
<object id=fso classid=clsid:0D43FE01-F093-11CF-8940-00A0C9054228></object>
<script language=jscript defer></script>
<script language=vbscript defer>
For Each ie In ShellWindows
  If TypeName(ie.Document)="HTMLDocument" Then
    If ie.Document.parentWindow Is external.menuArguments.top Then Exit For
  End If
Next
title=ie.Document.title
If title="" Then
  a1.href=ie.LocationURL
  title=fso.GetFileName(decodeURI(a1.pathname))
End If
Select Case LCase(fso.GetExtensionName(title))
Case "mht","mhtml"
Case Else
  title2=ie.Document.title
  ie.Document.title=title & ".mht"
End Select
ie.ExecWB 4,1
If Not IsEmpty(title2) Then ie.Document.title=title2
</script>
</head>
<body>
<a id=a1 ></a>
</body>
</html>

SaveAsMHTML.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Web アーカイブ、単一のファイル(&M)]
@="C:\\どこか\\SaveAsMHTML.htm"

※ Vista IEの「保護モード:有効」のページでは使えません。

2008年6月 5日 (木)

「Web ページ、完全 (*.htm;*.html)」で「名前を付けて保存」する。

IE7で「名前を付けて保存」のデフォルトが「Web ページ、完全 (*.htm;*.html)」から「Web アーカイブ、単一のファイル (*.mht)」に変わりました。

そのため、IE7で「Web ページ、完全 (*.htm;*.html)」で保存しようとしても、デフォルトが「Web アーカイブ、単一のファイル (*.mht)」なので、これをいちいち変更しなければなりません。面倒臭。

IE7でShell.Windows().Item()が使えなくなったので、コンテキストメニュー拡張に変更します。

SaveAsFILES.htm

<html>
<head>
<object id=ShellWindows classid=clsid:9BA05972-F6A8-11CF-A442-00A0C90A8F39></object>
<object id=fso classid=clsid:0D43FE01-F093-11CF-8940-00A0C9054228></object>
<script language=jscript defer></script>
<script language=vbscript defer>
For Each ie In ShellWindows
  If TypeName(ie.Document)="HTMLDocument" Then
    If ie.Document.parentWindow Is external.menuArguments.top Then Exit For
  End If
Next
title=ie.Document.title
If title="" Then
  a1.href=ie.LocationURL
  title=fso.GetFileName(decodeURI(a1.pathname))
End If
Select Case LCase(fso.GetExtensionName(title))
Case "htm","html"
Case Else
  title2=ie.Document.title
  ie.Document.title=title & ".htm"
End Select
ie.ExecWB 4,1
If Not IsEmpty(title2) Then ie.Document.title=title2
</script>
</head>
<body>
<a id=a1 ></a>
</body>
</html>

SaveAsFILES.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Web ページ、完全(&K)]
@="C:\\どこか\\SaveAsFILES.htm"

document.execCommand("SaveAs") は、旧ダイアログ「HTML ドキュメントの保存」です。
これには、「Web アーカイブ、単一のファイル (*.mht)」や「Web ページ、完全 (*.htm;*.html)」がありません。
ie.ExecWB(OLECMDID_SAVEAS)でも、ファイル名を指定すると、旧ダイアログになります。
なので、ファイル名を指定しないで、ie.ExecWB(OLECMDID_SAVEAS)を使います。
すると、新ダイアログ「Web ページの保存」になります。
新ダイアログは、タイトルからファイル名を生成します。
ここで、もし、タイトルの末尾が.mhtや.htmだと、生成されるファイル名もそうなって、それに応じて「ファイルの種類(T)」が「Web アーカイブ、単一のファイル (*.mht)」や「Web ページ、完全 (*.htm;*.html)」になります。
これを利用します。
ie.ExecWB(OLECMDID_SAVEAS)を使うために、ShellWindowsコレクションの中から自分のIEオブジェクトを探します。

※ Vista IEの「保護モード:有効」のページでは使えません。

2008年6月 4日 (水)

「Web ページ、HTML のみ (*.htm;*.html)」で「名前を付けて保存」する。

IEで「Web ページ、HTML のみ (*.htm;*.html)」で保存しようとしても、デフォルトが、IE7は「Web アーカイブ、単一のファイル (*.mht)」、IE6は「Web ページ、完全 (*.htm;*.html)」なので、これをいちいち変更しなければなりません。面倒臭。

IE7でShell.Windows().Item()が使えなくなったので、コンテキストメニュー拡張に変更します。

SaveAsHTML.htm

<html>
<head>
<script language=jscript defer>
var title=external.menuArguments.top.document.title;
if(title==""){
  a1.href=external.menuArguments.top.document.URL;
  title=new ActiveXObject("Scripting.FileSystemObject").GetFileName(decodeURI(a1.pathname));
}
title=title.replace(/[.:\\\/*?<>|"]/g,"_");
external.menuArguments.top.document.execCommand("saveas",true,title);
</script>
</head>
<body>
<a id=a1 ></a>
</body>
</html>

SaveAsHTML.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Web ページ、HTML のみ(&H)]
@="C:\\どこか\\SaveAsHTML.htm"

document.execCommand("SaveAs") は、旧ダイアログ「HTML ドキュメントの保存」です。
これでファイル名を指定しないと、「名前を付けて保存」と違って、URLからファイル名を生成します。
なので、コードのほとんどは、「名前を付けて保存」を真似て、タイトルからファイル名を生成するのに苦労しているだけです。:-(
なお、この場合、ie.ExecWB(OLECMDID_SAVEAS)を使っても結局は同じことです。

※ Vista IEの「保護モード:有効」のページでも使えます。

2008年6月 3日 (火)

IEで表示中のページのタイトルとURLをクリップボードにコピーする。

IE7でShell.Windows().Item()が使えなくなったので、コンテキストメニュー拡張に変更します。

location2clip.htm

<script language=jscript defer>
clipboardData.setData("text",external.menuArguments.top.document.title + "\r\n" + external.menuArguments.top.document.URL);
</script>

location2clip.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\URLとタイトルをコピー(&U)]
@="C:\\どこか\\location2clip.htm"

2008年6月 2日 (月)

MSDNのドキュメントエクスプローラの「ソースの表示」エディタを「メモ帳」からエクスプローラに変える。

この設定はIEとは別です。

レジストリの初期状態は以下の設定になっています。

[HKEY_CURRENT_USER\Software\Microsoft\MSDN\7.0\WebBrowser]
"ExtEditor"="%SYSTEMROOT%\\system32\\notepad.exe"

ここを前述のファイルのパスに書き換えます。

ドキュメントエクスプローラには、「~で編集」がないので、IEのように「メモ帳」とエクスプローラの使い分けができません。

そこで、バッチファイルの中身を
explorer /e,/select,%*
notepad.exe %*
の2行にすれば、「メモ帳」とエクスプローラの両方が開きます。

2008年6月 1日 (日)

IEの「ソースの表示」エディタを「メモ帳」からエクスプローラに変える。

「メモ帳」では、サポートしてない文字コードが文字化けするし、さらに「名前を付けて保存」するのも面倒です。
「メモ帳」の代わりにエクスプローラを開いて、キャッシュファイルに位置付ければ、文字化けの心配なく、直にファイルをコピーできます。

そのためには、以下のいずれかのファイルを作成します。

ショートカットファイル
explorer /e,/select,

バッチファイル
explorer /e,/select,%*

そして、レジストリの

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name]
@="C:\\WINDOWS\\system32\\notepad.exe"

を上記のファイルのパスに書き換えます。初期状態は、このキーがありません。

ここには、直接、コマンドラインが書けないので、どこかに上記のファイルが必要です。

なお、IE5.0以降のファイルメニューの「~で編集(D)」やツールバーの「~で編集」ボタンは、「ソースの表示」とは別です。
なので、「~で編集」は「メモ帳」、「ソースの表示」はエクスプローラと使い分けができます。

« 2008年5月 | トップページ | 2008年7月 »