命令行中“start / wait”的正常行为: 启动/等待services.msc / computer = localhost& <“GUI关闭时的附加命令”>
我想在HTML-> JavaScript-> ActiveXObject-> Windows Shell中使用上述命令。 为此,在Windows Shell中我必须首先调用CMD,否则它将无法工作。
问题:由“&”分隔的其他命令在GUI窗口加载后立即执行。为什么/ wait开关不等待GUI进程的终止?
示例:
function Example() {
var command = "cmd /c start /wait <GUI_process.exe> <Parameters> & <execute
some cleanup commands if GUI is closed>;
var WinShell = new ActiveXObject("WScript.Shell");
WinShell.Run(command, 1, false);
}
看起来没有办法克服start / wait命令中的错误。很久以前,微软放弃了对预定义命令的支持。
解决方法:PowerShell
只有Cmdlet命令“Start-Process -Wait”按预期的方式对调用的GUI起作用。
斗争:在某些工作站上,GPO禁用了PowerShell,因此我无法使用它。
真正的问题:在上面的例子中,有没有办法让“开始/等待”正常工作?
答案 0 :(得分:0)
[见下面的故事]
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script>
function fun(){
var fs = new ActiveXObject("Scripting.FileSystemObject");
var tmp = fs.GetSpecialFolder(2);
var cs = fs.OpenTextFile(tmp+"\\test.cs", 8, true);
cs.WriteLine("using System.Diagnostics;class test{public static void Main(string[] args){");
cs.WriteLine("ProcessStartInfo processInfo = new ProcessStartInfo(\"cmd.exe\", \"/c %TMP%\\\\test.bat\");");
cs.WriteLine("Process.Start(processInfo).Close();}}");
cs.Close();
var bat=fs.OpenTextFile(tmp+"\\test.bat", 8, true);
bat.WriteLine("echo ASDF");
bat.WriteLine("services.msc");
bat.WriteLine("echo ZXCV");
bat.WriteLine("pause");
bat.Close();
var command="cmd /c \\Windows\\Microsoft.NET\\Framework\\v3.5\\csc.exe /out:%tmp%\\test.exe %tmp%\\test.cs & %tmp%\\test.exe & pause";
var WinShell = new ActiveXObject("WScript.Shell");
WinShell.Run(command, 1, false);
}
</script>
</head>
<body>
<button onclick="fun()">Butt</button>
</body>
</html>
上面的代码将test.cs
和test.bat
创建到用户的临时文件夹中,然后使用32位.NET v3.5编译器编译C#代码,存在于所有Windows 7中安装(包括64位),然后生成的test.exe
启动test.bat
,这会导致执行正确等待MMC管理单元(此处services.msc
)完成。
var command="cmd /c echo ZXCV & calc & echo ASDF & pause";
var command="cmd /c echo ZXCV & taskmgr & echo ASDF & pause";
var command="cmd /c echo ZXCV & diskpart & echo ASDF & pause";
- &#34;通常&#34;它将要求管理员权限并在单独的窗口中运行该工具。从&#34; admin-IE&#34;开始(IE以右键单击,以管理员身份运行),它在同一窗口中有回声和diskpart
var command="cmd /c echo ZXCV & fsutil & echo ASDF & pause";
- fsutil不要求提升,&#34;正常&#34;执行会导致错误消息,&#34; admin-IE&#34;得到支持的参数列表var command="cmd /c echo ZXCV & regedit & echo ASDF & pause";
perfmon.exe
,但它确实类似于MMC,尤其是在没有任何参数的情况下启动时):<登记/>
var command="cmd /c echo ZXCV & perfmon & echo ASDF & pause";
var command="cmd /c echo ZXCV & services.msc & echo ASDF & pause";
var command="cmd /c echo ZXCV & start /wait perfmon & echo ASDF & pause";
var command="cmd /c echo ZXCV & start /wait services.msc & echo ASDF & pause";
start /wait
,也不是&#34; admin-IE&#34;。echo ZXCV
services.msc
echo ASDF
pause
start /wait
)。但是当通过IE + ActiveX执行时(包括&#34; admin-IE&#34;),var command="%USERPROFILE%\\Documents\\NetBeansProjects\\CmdTest\\test.bat";
pause
像上面所有其他尝试一样运行。 (为了完整性,它还使用cmd /c
和start /wait
进行了测试,但它们的存在无关紧要)我的下一个想法是删除一些微小的.NET代码,比如
using System.Diagnostics;
class test{
public static void Main(string[] args){
ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/c %USERPROFILE%\\Documents\\NetBeansProjects\\CmdTest\\test.bat");
Process.Start(processInfo).Close();
}
}
......然后它奏效了。
当然,所有类型的警告都适用于2018年,IE就是这样,以及ActiveX如何杀死婴儿海豹和毛茸茸的小猫等等。
此外,如果要支持非Win7操作系统,代码可以查看.NET框架的存在并使用现有的框架。另外,由于硬编码test.xy
- s可能会伤害某人的眼睛,GetTempName
可用于创建非冲突的名称(或单个名称,重复使用不同的扩展名,就像{{1}虽然扩展名必须是.cs,.exe和.bat(也许.cs可能是其他东西,我还没试过)。