- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我正在开发一个delphi应用程序。我需要从 delphi 应用程序运行 perl 脚本。更清楚地说,我们在 unix 窗口中手动执行 perl 脚本。现在我需要从应用程序自动执行该 perl 脚本。
我尝试使用 ShellExecute:
ShellExecute(Handle, 'open', PChar('C:\loaderperl.bat'), nil, nil, SW_SHOW);
窗口闪烁一秒钟然后关闭。我不知道脚本是否执行了。
您好,感谢您的所有回答,对于我迟到的回复深表歉意。我仍然在与这种自动化斗争。现在我将清楚地解释该过程,目前我打开putty窗口,连接到远程计算机并执行perl脚本。 Perl 脚本依次调用存储过程并更新表。现在我想通过单击按钮自动执行上述过程。因此,当我单击按钮时,它应该调用一个连接到远程计算机的函数,然后执行 perl 脚本。我说清楚了吗???请帮忙解决这个问题。我需要 delphi 中的这段代码
最佳答案
(根据下面的评论进行编辑。)
这需要几个步骤:首先,实际运行脚本;其次,检查它是否成功运行(它设法启动一个新进程并且该进程成功。)
第 1 部分,运行脚本:
要从 Delphi 应用程序运行脚本,请使用 ShellExecuteEx
使用“open
”动词应该可以工作(更多详细信息请参阅下面的标志。)如果脚本与 Perl 可执行文件关联,则可以执行脚本本身,或者使用脚本作为命令行参数来运行 Perl exe。
This article看起来是使用这个 API 及其更简单的表兄弟的一个很好的起点 ShellExecute
.
ShellExecute[Ex]
函数通常期望您的应用程序随后运行消息循环。您的应用程序不太可能不是,只要用户单击按钮启动此应用程序后,您的应用程序就会处于空闲状态,但如果由于某种原因它不会空闲,您应该传递 SEE_MASK_NOASYNC
旗帜。 MSDN 有很多信息。
第 2 部分,检查它是否成功执行并成功完成其任务:
要查看脚本是否执行,您应该获取已启动进程的进程句柄,如果有新进程,请检查该进程的退出代码。您应该修改脚本,以便在任务失败时返回非零代码。 (我不熟悉 Perl,所以我不能具体告诉你如何操作,但通常它是“main”函数或其他第一个/启动函数的返回值。)你可以通过以下方式执行此操作:
SEE_MASK_NOCLOSEPROCESS
标记为ShellExecuteEx
。这将填充 hProcess
您通过进程句柄传入的结构体的成员,如果它成功启动了一个进程(如果没有,请检查 GetLastError
以找出原因。)如果这就是您需要知道的全部(只是它是否启动,则无需了解它是否启动)成功了)那么你就完成了。WaitForSingleObject(YourParamStruct.hProcess, INFINITE)
等待进程结束(当然,如果你有一个有效的 hProcess)GetExitCodeProcess
找到退出代码。 (检查它是否返回 STILL_ACTIVE
,如果它仍在运行,请等待并重试。)通常,它应该以 0
退出。以表明成功。您应该修改脚本,以便在出现问题时返回非零值。您可以根据需要使代码简单或复杂 - 例如,返回 1
对于任何错误,或者按错误类型划分多个代码。 (避免使用 259
,因为这是 STILL_ACTIVE
的值 - 这样做可能会导致您的 Delphi 代码进入无限循环,具体取决于它的编码方式,认为它仍在等待获取退出代码,因为 Perl 脚本仍在运行事实并非如此。)然后,您的 Delphi 应用程序可以检查此代码以查看 Perl 脚本是否有效,并在失败时执行某些操作 - 记录消息、告诉用户等。
另一件事 - 你说你只是想知道脚本是否执行,上面应该提供这一点。鉴于它是 Perl 脚本并在命令行上运行,您可能想要做的另一件事是获取其输出,如果不返回错误代码则扫描错误,或者记录或向用户显示。您可以通过 CreateProcess
运行它来完成此操作和 capturing the output 。不过,根据您的说法,这对于您所追求的目标来说可能有点过分了!
关于perl - 如何在Delphi中自动化perl脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1720455/
我是一名优秀的程序员,十分优秀!