VBScript,JScript,Wscript ......哦,我的

时间:2009-10-02 19:11:09

标签: windows batch-file vbscript scripting jscript

我需要为WinXP编写一些脚本来支持Big Financial Corp.的一些分析师。请帮我确定哪种类型的Windows脚本最符合我的需求。

我的需求似乎很简单(无论如何对我来说)

  1. 在WinXP Pro SP2(2002版)上运行
  2. 不要求我的用户安装任何东西(所以Powershell已经出局了。同样是Perl,Python,以及关于stackoverflow的这些类型问题的其他常见建议)
  3. 以非编译语言编写(因此用户将来有机会对其进行修改)
  4. 相当完整的语言功能(特别是日期/时间操作功能。我也希望有子程序,递归等现代概念)
  5. 启动和控制其他程序的能力(在命令行)
  6. 从我对我的选择的匆忙审查中,看起来我的选择是

    1. 的VBScript
    2. WScript的
    3. 的JScript
    4. 我没有时间学习或深入研究这些(或者其他任何可用的标准WinXP安装)。我迫切需要尽快选择和破解一些东西。

      (目前的危机是需要运行一个给定的应用程序,传递几个日期参数)。

      一旦目前的危机结束,会有更多这样的要求。

      帮帮我欧比万 Stackoverflow ......你是我唯一的希望。

      [edit]我目前的技能包括Perl,Javascript和Java,所以我最喜欢使用类似这些的东西

      [编辑]好的。我将尝试在JScript中编写WSH文件。谢谢大家......一旦事情在这里安定下来,我会告诉你它是怎么回事(并想出一个接受答案)。

      [编辑]这一切最终都成功了。感谢快速响应的人们。 这是我给用户的内容

      <job id="main">
          <script language="JScript">
      // ----- Do not change anything above this line ----- //
      
      var template = "c:\\path\\to\\program -##PARAM## --start ##date1## --end ##date2## --output F:\\path\\to\\whereever\\ouput_file_##date1##.mdb";
      
      // Handle dates
      // first, figure out what they should be
      dt = new Date();
      var date1 = stringFromDate(dt, 1);
      var date2 = stringFromDate(dt, 2);
      
      // then insert them into the template
      template = template.replace(new RegExp("##date1##", "g"), date1);
      template = template.replace(new RegExp("##date2##", "g"), date2);
      
      // This application needs to run twice, the only difference is a single parameter
      var params = ["r", "i"]; // here are the params.
      
      // set up a shell object to run the command for us
      var shellObj = new ActiveXObject("WScript.Shell");
      
      // now run the program once for each of the above parameters
      for ( var index in params )
      {
          var runString = template; // set up the string we'll pass to the wondows console
          runString = runString.replace(new RegExp("##PARAM##", "g"), params[index]); // replace the parameter
          WScript.Echo(runString);
      
          var execObj = shellObj.Exec( runString ); 
          while( execObj.Status == 0 )
          {
              WScript.Sleep(1000); //time in milliseconds
          }
          WScript.Echo("Finished with status: " + execObj.Status + "\n");
      }
      
      
      // ----- supporting functions ----- //
      
      // Given a date, return a string of that date in the format yyyy-m-d
      // If given an offset, it first adjusts the date by that number of days
      function stringFromDate(dateObj, offsetDays){
          if (typeof(offsetDays) == "undefined"){
              offsetDays = 0;
          }
          dateObj.setDate( dateObj.getDate() + offsetDays );
      
          var s = dateObj.getYear() + "-";     //Year
          s += (dateObj.getMonth() + 1) + "-"; //Month (zero-based)
          s += dateObj.getDate();              //Day
      
          return(s);
      }
      
      // ----- Do not change anything below this line ----- //
          </script>
      </job>
      

      显然它可能会更好......但它完成了工作,并且很容易让我的用户理解和扩展自己。

7 个答案:

答案 0 :(得分:27)

从技术上讲,这些在语法上都是一样的。实际上WScript / CScript是引擎,VBScript和JScript是语言。

个人观点仅限于:我的个人推荐是JScript,因为它让我想起了更多真正的编程语言,并且让我想要比VBScript经常打扮自己 less 。鉴于您对javascript的熟悉,最好的选择是JScript。

详细了解WScript和CScript之间的区别,就像其他人一样:这些是Windows脚本宿主脚本的执行平台。它们本质上是相同的,而WScript更面向GUI,而CScript更倾向于面向控制台。如果使用CScript启动脚本,您将看到一个控制台窗口,但您仍然可以访问GUI功能,而如果您从WScript开始,则没有控制台窗口,并且许多默认输出方法显示为窗口对象而不是控制台中的一行。

答案 1 :(得分:3)

如果你喜欢JavaScript,你可能会对JScript感到满意。它是一种不错的语言,当然比VBScript更适合复杂的脚本。

但是,Microsoft 1 讨厌 JavaScript,因此您会遇到一些与VBScript一起使用的微不足道的API,但使用JScript访问却很痛苦。考虑自己警告......

As snicker notes,WScript是驱动它们的引擎。

1 拟人化过去常常注意缺乏光泽的支持;不得被解释为任何官方政策的证据。

答案 2 :(得分:2)

我的选择是使用JScript的WSH。你可以使用VBScript,但是为什么,当JScript可用时。

这是Windows脚本宿主的reference

答案 3 :(得分:2)

不要忘记CScript。在这里要小心,因为Windows脚本主机通常被大公司的组策略禁用。如果是这种情况,那么符合所有标准的唯一选择就是(颤抖)批次。

如果 none 为您解决了这些问题,那么您最好的选择可能是编译程序,您可以使用该程序分发源代码。

答案 4 :(得分:2)

使用JScript。使用JScript与WScript / cscript引擎和在浏览器中编写JavaScript之间的关键区别在于您没有浏览器安全限制。您还可以访问ActiveX / COM对象来操作应用程序,注册表等。实际上,您可能会花费更多时间阅读这些自定义对象和界面而不是担心语言功能。当然,您可以获得JavaScript日期,正则表达式等的所有好处。

sample JScript app from MSDN可能有助于您入门。

不幸的是,微软的大部分示例脚本都是VBScript,但语法很容易理解,特别是如果你只是想挑选出COM接口的详细信息。

答案 5 :(得分:2)

为了扩展其他人的答案,WScript和CScript是用于运行用VBScript(类似Visual Basic的语法)或JScript(类似JavaScript的语法)编写的脚本的程序。 CScript从控制台窗口运行脚本,以便Echo命令写入控制台,而WScript在没有窗口的情况下运行它们,并且Echo命令写入弹出消息框。

如果需要合并两种语言的预先存在的代码,可以在基于XML的包装器中组合使用VBScript和JScript的WSH(Windows Scripting Host)和WSC(Windows Scripting Component)脚本。

您还可以编写HTA脚本,它代表“超文本应用程序”。这些是HTML文件中的脚本代码,其HTA扩展在Internet Explorer中运行,允许您使用HTML控件提供界面,但也可以完全访问您的系统,因为本地运行。

所有这些都基于自Windows 98以来所有Windows计算机都包含的Windows Scripting Host和Active Scripting技术。除了相当强大的基本语言外,它们还允许您访问WMI以获取广泛的系统和网络信息。用于自动化Word,Excel等的管理和COM功能。即使未安装Access,您也可以使用ADO和ADOX创建和使用Access MDB文件。

答案 6 :(得分:2)

虽然JScript是一种比VB Script更糟糕的语言,但问题在于VB Script有一个更完整的有用函数库,用于日期和数字格式化等内容。因此,除非您能够编写和安装自己的帮助程序库以与JScript一起使用,否则它实际上并不像第一次出现那么简单。

Some details here