有关在Windows应用程序上可能replacebatch file的问题?

我有一个由许多可执行文件与数据库交互组成的大型Windows遗留应用程序。 可执行程序有四个主要目的:

(a)parsing并加载数据库上的文件

(b)转换一个文件(例如,编码一个文件)。这也可能在很多部分分割一个文件。

(c)在数据库中执行某种复杂的更新

(d)生成一个文件

这些可执行文件是由batch file调用的,这些batch file可以根据它们的function分为三类:

(1)等待一个条件,从某个外部path获取一个文件,可能将其转换为(b),做(c),发送有关活动结果的通知,向数据库写入一条logging

(2)等待一个条件,做一些(c),产生一个文件,用(b)变换它,然后将它复制到一个或多个目的地(本地文件,数据库,ftp),发送有关活动结果的通知,写一个logging到数据库。

(3)协调(abcd)可执行文件的其他复杂序列,发送有关活动结果的通知,将logging写入数据库

batch file是Windows机器上的普通BAT文件(可能互相调用)。 这些文件由调度程序启动。

问题是:

– 在每个batch file中,大部分有关环境的信息(通用目录等)都是重复的,而(1)或(2)types的大部分文件都非常相似。

batch file不容易configuration为testing环境,也不能自动轻松testing

– 通知和等待起始条件的代码部分重复(如果errorA呼叫b,如果错误b呼叫c,如果错误d呼叫e)。

– 使用goto

– 您无法准确确定哪些batch file已过时,哪些通常会被调用

– 要了解哪些文件发送或接收,您需要单独打开每个批次。

它们对应用程序施加devise约束,不能将通用代码抽象出来

– 要实现水平function(例如,有一个默认的日志logging策略,计算每个作业的调用时间),需要在许多文件上写入(不可维护的)代码。

从积极的一面:

  • batch file很容易被修改,所以如果一个批处理由于某种原因失败了,那么编写一个批处理就可以使情况恢复到安全状态。

  • 他们是战斗testing的。 他们已经在生产很长一段时间了

我已经想出了这个解决scheme:

  • 编写一些提供常用function和configuration的Java库(用于通知事件的function,传输文件的function,等待条件的function等)。

  • 编写一个可以加载和执行任务类的Java“脚本引擎框架”命令行应用程序。 (任务类可以使用上述库中提供的function。)

  • 脚本可以由用户根据需要在单独的jar中提供 。

  • 脚本可以通过注释自动logging

  • 脚本引擎可以要求脚本输出自己及其参数的描述

  • 从复制中分离生成文件


我已经决定采用Java而不是脚本语言(PHP,Python),这样我就可以享受编译带来的好处,而且不必担心在公共库中写入可能触发“致命错误”的东西停止执行脚本。

我觉得这将简单地执行最标准的batch file(types1和types2),另一方面,我担心这将很难表示types3的批处理。另外,我会放置一个自动部署我担心的是编写一个不好的batch file可能会产生问题,在引擎本身中部署一些错误的代码(即使这样做可能不太可能因为编译和testing而发生),或者在configuration中可能会影响所有脚本。

请注意,系统应该是100%可靠的,并且要执行的系统任务有最后期限和“时间窗口”。

我的问题是:

你认为批量文件可以吗? 他们在这方面被广泛使用吗?

你觉得我正朝着正确的方向走吗? 有没有我没有考虑过的东西?

有没有人有更好的主意?

你知道任何框架可以帮助我吗?

你认为开发这个系统在未来有更大的灵活性是值得的吗?还是我最好保留批次?

请注意,任何要开发的新解决scheme都将与现有系统集成在一起,因此我不能在应用程序服务器中重写所有内容。

我在一个非常相似的应用程序上工作,调用OSQL的文件超过100个.cmd。 我们遇到过很多类似的问题,以及糟糕的错误处理问题。 在我看来,更好的选择是获得一个调度程序,它可以做你想做的事,而不是写一个框架来调度你的调度程序和批处理/脚本文件。 在我看来,这种类型的系统需要一个老式的Job Scheduler 。 它调用你的可执行文件的顺序,处理错误,并传递你的配置参数。 从Zena到JobScheduler有很多不同的选择。 我建议选择一个良好的图形用户界面。

我建议使用PowerShell 。

在我看来,这将是最不显眼的前进方式。 PowerShell支持所有你已经使用的shell命令,你可以开始创建PowerShell函数并获得一些代码重用,并减少逻辑重复。 Powershell脚本也很容易修改,就像批处理文件一样,并且在Window 7或Windows 2008上使用最新版本,您可以获得ISE(集成脚本环境),您可以逐步执行代码并交互式地进行调试。

如果您需要更高级的功能,您可以使用.NET框架来编写复杂的CmdLets(commandlets),并将它们用作Powershell脚本代码中的函数。

另一个好处是你不必对其他脚本环境进行精细的字符串操作,因为它们有一个对象流水线,它允许你编写复杂的命令,因此你可以使用一个命令的输出作为另一个命令的输入。

我每天使用PowerShell安装和卸载.NET程序集,部署和取消部署Microsoft BizTalk实体,运行数据库脚本以及创建,配置和删除网站。

快乐的脚本。

一个优秀的Powershell博客
http://pshscripts.blogspot.com/

维基百科页面
http://en.wikipedia.org/wiki/Windows_PowerShell

你也可以尝试Quartz( http://www.quartz-scheduler.org/ )。 它是一个开源的免费调度工具,内置Java,支持许多不同类型的任务,并且可以使用各种数据库。 到目前为止,我已经使用它与DB2。 我们已经在生产中使用了2年以上,它的作品像一个魅力。 我们必须实现java服务包装程序,以便它作为服务运行,但这很容易完成。

如果我要替换批处理文件,我会用一些.NET语言来做。 .NET包含线程库,启动应用程序和轻松处理输出。 当然你也可以使用C#作为脚本语言,甚至是PowerShell或者Python。