Guest User

Untitled

a guest
Jul 21st, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. // WSH
  2.  
  3. function zip(zipfile, files) {
  4. var fso = new ActiveXObject("Scripting.FileSystemObject");
  5. var shell = new ActiveXObject("Shell.Application");
  6.  
  7. var process_id = get_process_id();
  8.  
  9. // create empty zip (right click -> new file -> compressed (zipped) folder)
  10. var zip = fso.CreateTextFile(zipfile, true);
  11. zip.Write("PK\5\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
  12. zip.Close();
  13.  
  14. // copy to zip (drop files to zip folder)
  15. var zipfolder = shell.NameSpace(fso.GetAbsolutePathName(zipfile));
  16. for (var i = 0; i < files.length; ++i) {
  17. var oldcount = thread_count(process_id);
  18. var f = fso.GetFile(zipfile);
  19. var oldsize = f.Size;
  20. // FIXME: Second argument will not work. Cannot hide progress bar.
  21. zipfolder.CopyHere(fso.GetAbsolutePathName(files[i]), 4 + 16);
  22. // FIXME: Wait until finish. It seems that file size is updated
  23. // when all items in the folder are finished, instead of for each
  24. // item.
  25. for (var j = 0; j < 10; ++j) {
  26. if (oldsize != f.Size) {
  27. break;
  28. } else if (thread_count(process_id) > oldcount) {
  29. // CopyHere threads are running. Wait it.
  30. break;
  31. }
  32. WScript.Sleep(1000);
  33. }
  34. // Wait until CopyHere threads are finished.
  35. while (thread_count(process_id) > oldcount) {
  36. WScript.Sleep(1000);
  37. }
  38. // If file size is not changed, compression is probably cancelled.
  39. if (oldsize == f.Size) {
  40. return false;
  41. }
  42. }
  43.  
  44. return true;
  45. }
  46.  
  47. function get_process_id()
  48. {
  49. var shell = WScript.CreateObject("WScript.Shell");
  50. var p = shell.Exec("cmd.exe");
  51. var wmi = GetObject("winmgmts://./root/cimv2");
  52. var e = new Enumerator(wmi.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = " + p.ProcessID));
  53. var process_id = null;
  54. for ( ; !e.atEnd(); e.moveNext()) {
  55. var item = e.item();
  56. process_id = item.ParentProcessId;
  57. }
  58. // Terminate() is slow.
  59. p.StdIn.Close();
  60. return process_id;
  61. }
  62.  
  63. function thread_count(process_id)
  64. {
  65. var wmi = GetObject("winmgmts://./root/cimv2");
  66. var res = wmi.ExecQuery("SELECT * FROM Win32_Thread WHERE ProcessHandle = " + process_id);
  67. return res.Count;
  68. }
  69.  
  70. function usage() {
  71. WScript.Echo(
  72. "usage: zip.js [options] zipfile file ...");
  73. WScript.Quit(1);
  74. }
  75.  
  76. function main() {
  77. var args = WScript.Arguments;
  78. var options = {
  79. "args": []
  80. };
  81. for (var i = 0; i < args.length; ++i) {
  82. if (args(i).match(/^(-r)$/)) {
  83. // Ignore. Always recursive.
  84. } else if (args(i).match(/^(-h|--help)$/)) {
  85. usage();
  86. } else {
  87. options.args.push(args(i));
  88. }
  89. }
  90. var zipfile = options.args.shift();
  91. zip(zipfile, options.args);
  92. }
  93.  
  94. main();
Add Comment
Please, Sign In to add comment