在 Windows 服务器上(我已经测试了 2008 R2 和 2012 R2),我们注意到从批处理调用的 Perl 脚本的执行行为有所不同。
考虑如下的原始批处理文件:
:beginlbl
call path\script.pl
goto :beginlbl
或早或晚(有时仅执行几次脚本后,有时执行数百次后)都会出现错误消息: “Windows 无法访问指定的设备、路径或文件。您可能没有适当的权限来访问该项目。”
如果将代码的第二行修改如下:
call perl path\script.pl
(请注意脚本前的可执行文件名称。)该脚本将永远运行而不会出现问题。
在上述两种情况下,Windows 的执行有何不同?
答案1
使用文件关联会通过 shell 进程来评估文件类型(扩展名)并启动相应的进程。您可能对此感到不知所措。这类似于调用 .txt 时获取已注册的编辑器的方式。另请参阅 ShellExecute。
直接调用可执行文件可以省去中间人,因此总是首选。
Uslackr 对你原始问题的评论也是正确的,他指出系统路径上的 perl 可执行文件被调用。你最好直接用完整路径指定要运行的可执行文件,以避免意外调用另一个可执行文件。这对可靠性和安全性都有好处。可移植性会受到影响,但你可以选择你的优先级。
答案2
我把马修的回答标记为正确,因为我同意他的观点,即应该如何实现它。实际上,我们继承了我们支持的系统,而最佳解决方案并不是我们所拥有的。改变/改进它是另一回事。
今天我们知道我们的问题是由 Crowdstrike 传感器故障引起的。基本上,这个间谍软件正在对 Windows 造成严重破坏。可悲的是:a) Windows 事件日志中没有任何痕迹 b) Crowdstrike 自己的控制台中没有任何干扰痕迹。
遗憾的是,供应商希望我们解决他们自己的软件问题,而我的老板却不付钱让我这样做。