« VBAでZIP展開する。 | トップページ | ZIPファイルを展開するバッチファイル »

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();

« VBAでZIP展開する。 | トップページ | ZIPファイルを展開するバッチファイル »