- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 HTA 应用程序中,有一些操作正在服务器上执行一些非常耗时的任务。例如,操作使用旧的 ActiveX 组件读取特定文件夹(文件夹中的 0 - ~200 个文件)中文件的某些文件属性(如主题和注释)。
最初这是通过设置间隔并逐个文件读取文件属性来完成的。当使用快速本地连接连接到服务器时,应用程序的速度减慢是可以接受的。但是现在,随着远程工作的显着增加,并且远程连接比内网连接慢很多,这个时间间隔不再适合任务了。
为了在文件属性搜索期间使应用程序更快,我将代码外包给 wsh 工作。结果存储在一个文件中,间隔(5 秒)正在观察哪个存在。但是,即使以上述 5 秒的间隔轮询文件是否存在,一些用户仍然会遇到应用程序的显着减速。
现在我想知道,是否有事件或其他一些内部机制可以用来检测 wsh 脚本何时完成其工作?如果可能的话,甚至可能有一种方法可以将结果直接从 wsh 作业发送到 HTA,而根本不使用中间时间文件?
下面是在 wsh 文件和 HTA 应用程序中执行的实际任务的一些简化代码。 HTA 具有 HTML5 DTD,它使用 IE11 在 Edge 模式下运行。 ui
是一个实用程序库,所引用的属性名希望能够足够准确地描述用法。
世界社会论坛:
<package>
<job id="getFileProps">
<script language="JScript">
(function () {
var topRoot = WScript.Arguments(0), // The starting folder <String>
fso = WScript.CreateObject('Scripting.FileSystemObject'), // Filesystem object <ActiveXObject>
fileProps = readProps(topRoot), // Fileprops, the result <Array>
file; // The result file to read in HTA <FileObject>
function readProps (root) {
var fileProperties = [];
// A bunch of code reading the fileproperties on a disk
return fileProperties;
}
file = fso.openTextFile(topRoot + '\\$fileprops$.txt', 2, true);
file.Write(fileProps.join(',');
file.Close();
WScript.Quit();
)());
</script>
</job>
</package>
脚本:
ui.winShell.Exec('WScript //Job:getFileProps ' + '"' + ui.appRoot + '"');
function fpCheck () {
var file, fileProps;
try {
file = ui.fileIO.OpenTextFile('$fileprops$.txt', 1, false);
} catch (err) {
file && file.Close();
setTimeout(fpCheck, 5000);
return;
}
// Write the fileprops to the view
}
如果有人对文件属性阅读器感兴趣,它的名字是
DSOFile.OleDocumentProperties
.它起源于深层互联网文件的某个地方,但我不记得我从哪里加载它。
最佳答案
最终你需要的是进程间通信。
HTA 或 WSH 都没有为 IPC 提供内置的东西。
所以,我将分享一个我很少使用的hacky解决方案。
诀窍是像客户端 - 服务器场景一样在两端使用共享对象。
我们将使用 Internet Explorer 对象作为 IPC 服务器,我们将使用的方法是 GetProperty和 PutProperty .
由于可以使用 Shell objects 枚举 Internet Explorer 窗口。的 Windows()方法,可以从另一个应用程序访问在 HTA 中创建的对象。
检查并创建以下两个文件,然后启动 test.hta
然后点击 Start WSF
按钮。test.hta
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title>IPC</title>
<script>
sharedObject = {
sendData: function(data){
// blocking here is not a good idea
// so we process the data within another callback
// leaving the method as soon as possible
var receivedData = data;
setTimeout(function(){alert("Data received: " + receivedData)}, 50);
}
};
shareName = "ipcShare";
serverId = createIPCServer(shareName);
function createIPCServer(shareName){
var ie = new ActiveXObject("InternetExplorer.Application");
ie.PutProperty(shareName, sharedObject);
window.onbeforeunload = function(){ ie.Quit(); };
return ie.HWND; // window handle
}
function starWSFJob() {
alert("please wait about 5 seconds...");
var wshShell = new ActiveXObject("Wscript.Shell");
wshShell.Run('wscript.exe test.wsf //Job:TestIPC /serverId:"' + serverId + '" /shareName:"' + shareName + '"');
}
</script>
</head>
<body>
<button onclick="starWSFJob()">Start WSF</button>
</body>
</html>
test.wsf
:
<package>
<job id="TestIPC">
<script language="JScript">
function getSharedObject(serverId, shareName){
var shellApp = new ActiveXObject("Shell.Application");
var windows = new Enumerator(shellApp.Windows());
for (;!windows.atEnd();windows.moveNext()){
var window = windows.item();
if(window.HWND == serverId) {
return window.GetProperty(shareName);
}
}
}
function App() {
var serverId = Number(WScript.Arguments.Named("serverId"));
var shareName = WScript.Arguments.Named("shareName");
var sharedObject = getSharedObject(serverId, shareName);
if(!sharedObject){
WScript.Echo("shared object not found.");
return 1;
}
// simulate long running job
WScript.Sleep(5000);
// send data
sharedObject.sendData("Hello from WSF Job!");
return 0;
}
WScript.Quit(App());
</script>
</job>
</package>
关于jscript - 从 wsh 脚本获取响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65291636/
我编写 JSCript 并使用 WindowsScriptHost 运行它。但是,它似乎缺少 Array.forEach()。 ['a', 'b'].forEach(function(e) {
在我的环境中,如果我使用 JScript 语法创建一个类: class test{ } 然后将其保存到名为“test.js”的文件并使用 wscript 运行它,我在第 1 行收到 Microsoft
我有一个“for”循环,它必须转换数千个相互不依赖的文件中的内容。代码是用 JScript 编写的。我想添加一些线程代码来在 CPU 之间分发文件,因为其他的似乎是空闲的。我试图在 JScript 中
大家早上好 我目前正在编写一个小的 batch/jscript/hta 程序。 在下面的程序中,我读取了一个文本输入字段,将文本传递给批处理并在那里显示: HTA Buttons windo
我无法在我的机器上的 IE8 中打开 gwt-html 页面(在 Mozila FF 中加载)。当我在我的 html 页面中调试 Js 时,我收到以下错误消息Jscript 调试器。中断 JScrip
var scriptFile = $(tempNode).attr("customJScriptSrc"); 当通过这个我得到 “Reference Error: Can’t find variabl
有没有办法使用 Windows Scripting Host 在注册表中搜索特定键? 我正在使用 JavaScript (Jscript/VBScript?) 来执行此操作,而 msdn 库未提及任何
请考虑以下WSH代码段: var query = GetObject(“winmgmts:”)。ExecQuery(“SELECT Name FROM Win32_Printer”,“WQL”,0);
我有一个用 JScript(不是 javascript)编写的函数,我需要暂停直到某个全局变量变为真。当在 ajax 响应后调用另一个函数时,全局变量更改为 true: function(req, e
var FSO = new ActiveXObject("Scripting.FileSystemObject"); var BFolder = "C:\\temp"; var XFolder
重新发布工作代码 (我试图从我的 ActiveX 组件获取数组,但没有成功。当我运行脚本时,我得到空消息框,但我知道数组在那里:) var objMain, objAdapt, lgCount, st
几年来,我一直在 EA 中广泛使用脚本。今天早上,我进入 EA 开始构建新脚本,但脚本似乎不再有效。我试着写“Hello World”,甚至写了一个有语法错误的脚本。它既不检测错误也不运行脚本。 我看
我正在尝试在我的网页中构建一个“ Accordion ”样式的可折叠 div,如 w3c 学校此处所述... accordion description 我已经完成了大部分工作 - 我的代码是这样的:
我最近注意到,我用来编译和使用 C# 文件(如我的应用程序中的脚本)的库 (CSScript) 也可以编译 VB 和 JScript。不过,我的一个应用程序使用了 await/async (C# 5)
我一直在尝试查找一些关于 jscript 编程的文档,这样我就可以自己编写它,但是找不到所需的文档.... 我的问题是:我一直在尝试编写一个 jscript,它将通过网络连接并添加打印机...。其中一
这看起来应该很容易。我以前从未使用过 JScript,我正在查看 microsoft 提供的 JScript api,但没有运气。这是我所拥有的: var fso, tf; fso = new
我可以在“Microsoft JScript”中使用什么来代替带有字符串的length()。 String类没有方法length()或者我没有找到。获取字符串长度的最佳方法是什么? 最佳答案 应该有一
在config.txt中,我有以下字符串: Dispatcher=argo Address=10.5.23.14 User=joe 在我的script.js中,我有变量: var Dispatcher
我正在尝试建立一个小型 JavaScript 实验室。在实验室中,首先我创建了一个 Animal 对象: function Animal(species, nature) { this.speci
我收到运行时错误 Microsoft JScript 运行时错误:“document.getElementById(...)”为 null 或不是对象 我正在使用母版页。 谁能帮帮我 最佳答案 发
我是一名优秀的程序员,十分优秀!