【发布时间】:2018-04-30 02:52:55
【问题描述】:
我正在尝试使用 Window 10 WMIC 远程调用一些代码。
rem command prompt, machine 1 (main computer)
WMIC /node:"MACHINE_2" process call create "cmd.exe /k "%USERPROFILE%\test.vbs" "
这个电话似乎正确地通过了。它从 test.vbs 产生部分输出(如下所示),这意味着文件被调用并执行。
' test.vbs, machine 2 (MACHINE_2, in above code)
Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile="%USERPROFILE%\out.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write "test1" & vbCrLf
objFile.Close
MsgBox("hi")
' CreateObject("WScript.Shell").Run "cmd /c ""nircmd.exe sendkey 0xB3 press"" ", 0
' Set WshShell = Nothing
outFile="%USERPROFILE%\out.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write "test2" & vbCrLf
objFile.Close
预期行为:脚本应将“test1”写入 out.txt。然后它应该打开一个 MsgBox。在 Machine_2 上关闭 MsgBox 后,它应该用“test2”覆盖 out.txt 的内容。
MsgBox 下面的两行注释代码可以替换 MsgBox 代码,并且具有相同的行为。
在本地执行 vbs 文件时,会发生预期的行为。但是,当使用 WMIC 调用时,会打印“test1”,然后执行似乎会停止。 MsgBox 永远不会显示,“test2”永远不会覆盖 out.txt 的内容。
我不知道为什么会发生这种情况,以及我可能会采取哪些步骤来使它发挥作用。在这一点上,我已经用尽了我的 google-fu。
【问题讨论】:
-
您不应该在任何可能需要自动化或自动运行的代码上显示消息框。谁在那里按确定按钮?无论如何...我假设 MY_SERVER 是您的本地计算机?要进行故障排除,请将环境特定值(如
%USERPROFILE%)替换为硬编码值,并查看它是否按预期工作。使用它来隔离问题。如果您的整个脚本无法正常运行,那么您的下一步就是找到无法正常运行的 行。最后,在 windows 事件日志中查看线索 -
哦,还有....为了运行 VBS,您需要针对
CScript.EXE,而不是CMD.exe运行它。这里有一个例子:gist.github.com/cornfred/6678466 -
感谢您的评论回复。为了清楚起见,我编辑了这个问题。 MY_SERVER 是第二台机器,我试图在上面运行 vbs 代码。 %USERPROFILE% 工作正常,因为 1.调用了 vbs 脚本并且 2.out.txt 确实包含输出。我已经用硬编码值替换了它,没有任何变化。不起作用的 行 是 MsgBox 行(或它下面的两个注释行)。
-
使用 cscript.exe 似乎没有什么不同。
"cscript "%USERPROFILE%\test.vbs" " -
第二台机器是不同的机器?您不会在另一台机器上看到弹出消息框。
标签: cmd vbscript wmi wmic nircmd