1

Тема: JScript: SFX на JS

Приведённый ниже скрипт является самораспаковывающимся архивом. В нем лежит hta-утилита для изготовления таких sfx'ов. Поддерживает передачу имён файлов/папок в комстроке, а при отсутствии параметров комстроки предлагает выбрать папку для упаковки. Системное ограничение: файл wsf не может быть длиннее пол-метра. МИМЕэнкоженная часть выделена форматированием - для тех, кто привык распаковывать руками.

<job id="sfx"><comment> 

 !!!  Сохраните этот текст как файл с раширением .wsf и запустите  !!! 

 </comment><object id="a" progid="Shell.Application" /> 
 <object id="f" progid="Scripting.FileSystemObject" /> 
 <object id="s" progid="ADODB.Stream" /> 
 <object id="x" progid="MSXML2.DOMDocument" /> 
 <script type="text/jscript" language="JScript"> 
 var c=getResource('b'),d=f.getBaseName(/filename="(.+)"/.exec(c)[1]), 
 r=x.createElement('root'),y=0, 
 z=f.getSpecialFolder(2)+'\\'+f.getBaseName(f.getTempName())+'.zip'; 
 r.text=c.replace(/^\s*(.+\s+){4}/,''),r.dataType='bin.base64'; 
 s.type=1,s.open(),s.write(r.nodeTypedValue),s.saveToFile(z),s.close(); 
 if(f.fileExists(z)){while(f.folderExists(d+(y?' '+y:'')))y++; 
 f.createFolder(d+(y?' '+y:'')); 
 for(var i=0;i<a.nameSpace(z).items().count;i++){ 
 a.nameSpace(f.getAbsolutePathName(d+(y?' '+y:''))).copyHere( 
 a.nameSpace(z).items().item(i),0);}f.deleteFile(z);} 
 </script><resource id="b"> 

 MIME-Version: 1.0 
 Content-Type: application/octet-stream; name="base64sfx.zip" 
 Content-Transfer-Encoding: base64 
 Content-Disposition: attachment; filename="base64sfx.zip" 

 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 

 </resource></job>

Автор Serge Yolkin

2

Re: JScript: SFX на JS

Упростил функцию fz в hta утилитке. В оригинале зачем-то отдельно получал файлы, отдельно - подпапки, хотя обрабатываются они одинаково...

  function fz(){  // готовим правильный zip
    if(y.length>2){
      t=f.getFileName(f.getParentFolderName(f.getAbsolutePathName(y[1])));
    }else{
      t=f.getBaseName(f.getAbsolutePathName(y[1]));
      if(f.folderExists(y[1])){
        var q=y[1];y.length=1;
        for(var i=0;i<a.nameSpace(q).items().count;i++){y.push(a.nameSpace(q).items().item(i).path);}
      }
    }
    with(f.OpenTextFile(z=f.GetSpecialFolder(2)+'\\'+t+'.zip',2,true)){
      write('PK\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'),close();
    }fy('fa()');
  }