在Windows上选择什么:VBScript、JScript或Wscript?

7
我需要为WinXP编写一些脚本,以支持Big Financial Corp这里的一些分析师。我需要决定哪种类型的Windows脚本最适合我的需求。
对我来说,我的需求似乎非常简单:
  1. 在WinXP Pro SP2(版本2002)上运行
  2. 不要求用户安装任何东西(因此PowerShell是不行的。同样,Perl、Python和其他在Stack Overflow上这类问题的常见建议也不行)
  3. 使用非编译语言编写(这样用户将有机会在未来修改它们)
  4. 具有相当完整的语言特性(尤其是日期/时间操作函数。我还想拥有现代概念,如子例程、递归等)
  5. 能够启动和控制其他程序(在命令行中)
经过我匆忙的审查,看起来我的选择是:
  1. VBScript
  2. WScript
  3. JScript
我没有时间学习或深入评估这些选项(或者WinXP标准安装提供的其他内容)。我需要尽快选择一个并将其组合在一起。
(当前危机是需要运行一个给定的应用程序,传递几个日期参数)。
一旦当前危机解决,将会有更多类似的请求。

编辑

我的当前技能包括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>

显然它可以更好...但它完成了工作,而且对我的用户来说易于理解和自行扩展。


我知道一家中等规模的公司正在尽可能地从微软转向开源解决方案。为了未来的保障,JavaScript比VBScript更好。JavaScript几乎无处不在,而VBScript则不是。 - Nosredna
哪种现代脚本语言不支持内联日期格式化?JScript! - Sukotto
根据您在此处编写的内容,它可以是一个 .js 文件,而不需要使用 JOB 和 SCRIPT 标记以及警告性注释来作为 .wsh 文件。另外,正如您所知道的那样,由于 PATHEXT 环境变量的存在,您可以仅使用脚本文件名在命令行上运行它,无需脚本主机或扩展名。 - Todd
8个回答

28

这些实际上是具有不同语法的相同技术。 WScript/CScript是引擎,而VBScript和JScript则是语言。

以下仅为个人意见:我个人推荐使用JScript,因为它更像一个真正的编程语言,让我比使用VBScript更少想打自己的脸。考虑到您对JavaScript已经很熟悉,JScript是最好的选择。

关于WScript和CScript之间的区别,其他人已经详细解释过,简单介绍一下:这些都是用于Windows脚本宿主的脚本执行平台。它们基本上是相同的,其中WScript更面向GUI,而CScript更面向控制台。如果您以CScript启动脚本,则会看到一个控制台窗口,但仍可以访问GUI功能;而如果您以WScript启动,则没有控制台窗口,并且许多默认输出方法显示为窗体对象,而不是控制台中的行。


5
任何形式的 Visual Basic 都让我陷入自我伤害的状态。有时,自动打脸是不自觉的。 - snicker
1
我也喜欢JScript,因为学会如何编写Javascript比编写VB更普遍有用。尽管我从1.0版本开始使用VB,但我仍然偏爱JScript来完成这个任务,一方面是因为我想提高自己的Javascript理解能力,另一方面也是为了给别人树立更好的榜样。在我的日常工作中有一个流程,其中有十几个批处理文件复制和重命名文本文件,并调用短的PERL脚本。整个混乱的过程本可以用单个清晰文档化的JScript文件替换掉.BAT文件和业余的PERL脚本。 - Michael Dillon

4
如果您喜欢JavaScript,那么JScript可能也会适合您。它是一种不错的语言,对于复杂脚本来说比VBScript更加适用。
然而,微软1讨厌JavaScript,因此您可能会遇到一些使用VBScript非常简单但使用JScript访问时却很痛苦的API。请自行注意...
正如snicker所指出的,WScript是驱动两者的引擎。

1 拟人化用于表示一般的支持不足,不应被解释为任何官方政策的证据。


3
尽管JScript比VB Script好得多,但问题在于VB Script拥有更完整的帮助函数库,可用于日期和数字格式化等操作。因此,除非您能编写并安装自己的帮助对象库以供JScript使用,否则这并不是一种容易的选择。详情请参见此处

链接已损坏。 - Foad S. Farimani

2
我的选择会是使用 JScript 的 WSH。虽然你也可以使用 VBScript,但既然有 JScript 可用,为什么不用呢?
这里有一个关于 Windows Script Host 的参考链接:reference

2

不要忘记CScript。请注意,很多大公司都会通过组策略禁用Windows脚本宿主。如果是这种情况,唯一符合你所有条件的选择就是批处理。

如果以上方法都不适用于你,那么你最好的选择可能是一个编译后的程序,其中包含源代码。


1
CScript是什么?我认为它不是默认安装的活动脚本语言。 - snicker
@snicker:不是一种语言,而是为控制台设计的语言主机,而不是窗口系统(与WScript相对比)。 - Shog9
我知道这一点,只是想指出它不是一种语言。 - snicker
3
嘿,为什么对批处理文件感到畏惧?我们中的一些人必须使用不太流行的主题来获取声望 :-þ - Joey

2
使用JScript。在使用WScript/cscript引擎与编写浏览器中的JavaScript之间的一个关键区别是您没有浏览器安全限制。您还可以访问ActiveX/COM对象以操作应用程序、注册表等。实际上,您可能会花费更多时间阅读这些自定义对象和接口,而不是担心语言功能。当然,您也可以获得JavaScript日期、正则表达式等所有好处。 MSDN上的示例JScript应用程序可能有助于您入门。
不幸的是,Microsoft的大多数示例脚本 tend to be VBScript,但是语法很容易理解,特别是如果您只是尝试挑选COM接口细节的话。

2
WScript和CScript是用于运行VBScript(类似Visual Basic语法)或JScript(类似JavaScript语法)编写的脚本的程序。CScript从控制台窗口运行脚本,因此Echo命令会写入控制台,而WScript在没有窗口的情况下运行它们,Echo命令会写入弹出消息框。
您可以编写WSH(Windows Scripting Host)和WSC(Windows Scripting Component)脚本,通过将它们组合在基于XML的包装器中使用VBScript和JScript,如果需要合并两种语言中预先存在的代码。
您还可以编写HTA脚本,它代表“超文本应用程序”。这些是HTML文件中的脚本代码,具有HTA扩展名,可在Internet Explorer中运行,允许您使用HTML控件提供界面,但也可以在本地运行以完全访问系统。
所有这些都基于自Windows 98以来随所有Windows计算机一起提供的Windows Scripting Host和Active Scripting技术。除了相当强大的基础语言外,它们还为您提供访问WMI以获取广泛的系统和网络信息和管理以及COM功能以自动化Word、Excel等的能力。此外,即使未安装Access,您也可以使用ADO和ADOX创建和处理Access MDB文件。

0
截至2023年10月,VBScript已经悄悄地被弃用,因此您应该避免在您希望长期使用的新脚本中使用它。根据https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features
VBScript正在被弃用。在未来的Windows版本中,VBScript将作为一个可按需使用的功能提供,然后从操作系统中移除。
https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features-resources#vbscript
在未来的Windows版本中,VBScript将作为一个可按需使用的功能提供,然后被废弃。最初,VBScript的按需功能将被预安装,以便在您准备废弃VBScript之前可以无间断地使用。
如果你在旧版本的Windows上使用VBScript,或者你只是在当前的Windows 11上使用它来运行一次性脚本,那么你不必担心,因为它目前仍然可用。但是,如果你正在编写未来的脚本,请考虑使用更现代的脚本语言,比如PowerShell或Python(尽管我会怀念在VBScript中与COM的轻松集成,而不是在PowerShell中完成同样任务时的冗长性)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接