VBS中WScript.Shell对象的run和exec的使用及区别

本文详细比较了VBScript中的Run与Exec两种方法。Run方法用于执行外部命令或程序,返回值为整数,指示成功或失败状态。Exec方法同样执行外部命令,但返回一个对象,可通过该对象获取命令的输出信息。文章还介绍了这两种方法的参数设置及应用实例。

方法声明:
Function Exec(ByVal Command As String) As WshExec
Function Run(ByVal Command As String, [ByVal WindowStyle], [ByVal WaitOnReturn]) As Integer
区别:
 
1,返回值
run的返回值是一个整数,就是0或1成功和失败两个状态,而exec方法的返回值是一个对象,从返回对象中可以获得控制台输出信息和控制台错误信息,即StdOut和StdErr属性等。
如:
Dim oShell,exeRs
Set oShell = CreateObject("WSCript.shell")
commandLine = "xcopy.exe"
Set exeRs = oShell.Exec(commandLine)
errMsg = exeRs.StdErr.ReadAll()
stdMsg = exeRs.StdOut.ReadAll()
WScript.echo "errMsg:" & errMsg & "stdMsg:" & stdMsg
ret = oShell.run(commandLine, 0, true)
WScript.echo "run method return value:" & ret
Set oShell = Nothing
Set exeRs = Nothing
可以取道控制台错误和控制台信息。
 
附记:WshExec类具有属性ExitCode,ProcessID,Status,StdErr,StdIn,StdOut以及一个函数Terminate,这些属性和函数都很好理解。
Status属性具有三个值:
Const WshFailed   = 2
Const WshFinished = 1
Const WshRunning  = 0
 
2,执行参数
Run的后两个参数,一个是cmd窗口的风格,一个是是否等待执行完成。最后一个参数很有用,如果你希望等待本次cmd执行的程序结束后,再执行run后面的语句,设置这个参数为true,否则后面的语句将不等待cmd窗口完成,直接运行。
另外,如果你使用exec 方法的时候,如果希望等待cmd中程序执行完后,再执行后面的语句,也可以通过下面的方法: oExec.StdErr.ReadAll()或者oExec.StdOut.ReadAll(),道理上也应该好理解,要得到输出的信息,肯定要cmd执行完后才会有输出的。
 
WshShell.run函数的参数
set WshShell= CreateObject(“Wscript.Shell”)
WshShell.run       "notepad.exe",,
run函数有三个参数,第一个参数是你要执行的程序的路径,若路径中存在空格,记得要用""括起来,如 """C:\Program Files\nn.exe"""的形式或者Chr(34)&"C:\Program Files\nn.exe"&Chr(34)的形式,第二个程序是窗口的形式,0是在后台运行;1表示正常运行;2表示激活程序并且显示为最小化;3表示激活程序并且显示为最大化;一共有10个这样的参数如下表。 第三个参数是表示这个脚本是等待还是继续执行,如果设为了true,脚本就会等待调用的程序退出后再向后执行。
其实,run做为函数,前面还有一个接受返回值的变量,一般来说如果返回为0,表示成功执行,如果不为0,则这个返回值就是错误代码,可以通过这个代码找出相应的错误。
 
intWindowStyle 说明
0 隐藏一个窗口并激活另一个窗口。
1 激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。第一次显示该窗口时,应用程序应指定此标志。
2 激活窗口并将其显示为最小化窗口。
3 激活窗口并将其显示为最大化窗口。
4 按最近的窗口大小和位置显示窗口。活动窗口保持活动状态。
5 激活窗口并按当前的大小和位置显示它。
6 最小化指定的窗口,并按照 Z 顺序激活下一个顶部窗口。
7 将窗口显示为最小化窗口。活动窗口保持活动状态。
8 将窗口显示为当前状态。活动窗口保持活动状态。
9 激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。还原最小化窗口时,应用程序应指定此标志。
10 根据启动应用程序的程序状态来设置显示状态。
<think>首先,用户的问题是如何在Unreal Engine 4 (UE4)中实现或执行一个脚本,该脚本使用WScript.Shell对象来执行SCP命令并输入密码。用户提供了一个脚本示例: ``` Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "scp file.txt user@192.168.1.100:/home/user/" WScript.Sleep 2000) WshShell.SendKeys "你的密码" WshShell.SendKeys "{ENTER}" ``` 用户引用了几个外部引用,这些引用涉及使用VBScript(.vbs文件)通过WScript.Shell对象执行SCP命令、登录SSH等操作。引用提到了一些问题,比如在长时间操作时cmd窗口挂起,以及runexec方法的区别。 用户要求是基于这些引用回答如何在UE4中实现类似功能。UE4是用C++或蓝图脚本编写的游戏引擎,不是直接支持VBScript的环境。所以我需要思考如何在UE4的上下文中执行外部脚本或集成这个功能。 关键点: - 用户想复制文件到远程服务器使用SCP(Secure Copy Protocol),需要自动输入密码。 - 脚本是VBScript,依赖于Windows的WScript组件。 - UE4本身不运行VBScript,所以我需要通过其他方式在UE4中触发或执行这个脚本。 可能的解决方案: 1. **在UE4中调用外部脚本**:UE4可以使用System Library(在C++中)或Execute Console Command(在蓝图中)来执行外部命令。我可以让用户创建一个.vbs文件,然后从UE4调用它。 2. **使用UE4的插件或内置功能**:UE4有HTTP网络功能,但SCP是基于SSH的,UE4不直接支持SCP。可能需要集成第三方库或使用系统命令。 3. **避免使用SendKeys**:引用中指出了密码输入的问题安全风险。建议使用SSH密钥对免密码登录,而不是hardcoding密码在脚本中。 4. **替代方法**:在UE4中,可以使用Platform File模块或第三方库进行文件传输。 结构化我的回答: - **步骤清晰**:用户要求结构清晰,逐步解决问题。 - **使用中文**:系统指令指定用中文回答。 - **添加引用标记**:在回答中引用时末尾添加引用标识,如[^1]。 - **生成相关问题**:在末尾添加相关问题。 回答步骤: 1. **理解需求**:解释用户想在UE4中自动执行SCP文件传输。 2. **分析脚本**:简述提供的VBScript脚本的工作原理。 3. **UE4实现方法**: - 选项1:创建外部脚本并从UE4执行。 - 选项2:使用UE4 C++调用系统命令。 - 选项3:集成SSH库或使用蓝图。 4. **推荐最佳实践**:建议使用SSH密钥免密码登录,避免安全风险。 5. **代码示例**:提供如何在UE4中调用脚本的简单例子。 6. **注意事项**:讨论安全性潜在问题。 相关问题: - 基于用户引用问题,生成相关问题。 最终输出: - 使用Markdown格式。 - 确保内容真实可靠。 </think>### 在UE4中实现SCP文件传输并自动输入密码 在Unreal Engine 4 (UE4)中实现类似VBScript的SCP文件传输功能(涉及自动输入密码)需要间接方法,因为UE4不直接支持运行VBScript或Windows Script Host对象(如`WScript.Shell`)。UE4主要使用C++或蓝图脚本,但其API提供了执行外部命令的方式。以下是基于您的需求(执行SCP命令并输入密码)的分步实现方案,参考了提供的引用(如SSH免密、脚本执行问题等)[^1][^3]。 #### 步骤1: 理解需求限制 - **用户脚本功能**:您的VBScript示例通过`WScript.Shell`运行SCP命令,并使用`SendKeys`发送密码。这在Windows命令行中可行,但存在安全风险(密码明文存储)稳定性问题(如长时间操作时cmd挂起)[^4][^5]。 - **UE4限制**:UE4无法直接调用VBScript或`WScript.Shell`对象。但UE4提供: - `FPlatformProcess::CreateProc()`(C++)或`Execute Console Command`节点(蓝图)用于执行外部程序。 - 推荐使用SSH密钥免密登录代替密码输入,避免安全漏洞脚本可靠性问题[^1][^3]。 - **安全建议**:在UE4中避免硬编码密码。优先使用密钥对认证(如OpenSSH),如引用[^1]所述。 #### 步骤2: 推荐实现方法 在UE4中执行SCP文件传输有两种主流方式:**执行外部脚本**或**集成SSH库**。以下是具体步骤: ##### 方法1: 创建并执行外部脚本(简单易行) 此方法创建一个独立的脚本文件(如.bat或.vbs),然后从UE4调用它。优点:快速实现;缺点:依赖外部文件。 1. **创建脚本文件**: - 编写一个VBScript文件(如`scp_transfer.vbs`),内容基于您的示例但优化为SSH密钥方式(免密码): ```vbs ' scp_transfer.vbs: 使用SCP传输文件(推荐密钥免密) Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "scp -i D:/ssh/id_rsa file.txt user@192.168.1.100:/home/user/", 0, True ' -i指定密钥路径,隐藏窗口 ``` 如果必须使用密码(不推荐),保留`SendKeys`但添加错误处理: ```vbs Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "cmd /c scp file.txt user@192.168.1.100:/home/user/", 1 WScript.Sleep 2000 WshShell.SendKeys "your_password{ENTER}" ``` **注意**:密码明文存储不安全,且`SendKeys`可能不稳定(如引用[^5]所述)。优先改用密钥免密[^1]。 2. **在UE4中执行脚本**: - **使用C++**:在您的UE4模块中调用`FPlatformProcess::CreateProc()`运行脚本。 ```cpp // 在C++类中(例如Actor或GameInstance) #include "Runtime/Core/Public/HAL/PlatformProcess.h" void RunSCPScript() { FString ScriptPath = TEXT("C:/path/to/scp_transfer.vbs"); // 替换为脚本路径 FString CommandLine = TEXT(""); // VBScript无需额外参数 FPlatformProcess::CreateProc(*ScriptPath, *CommandLine, true, false, false, nullptr, 0, nullptr, nullptr); } ``` - **使用蓝图**:通过`Execute Console Command`节点调用命令行。 - 添加一个`Blueprint Function Library`节点或直接在蓝图序列中使用: ``` Execute Console Command: cmd /c cscript "C:/path/to/scp_transfer.vbs" ``` 隐藏命令行窗口添加参数`/b`(如引用[^3]示例)。 3. **测试与调试**:确保UE4项目有权限访问脚本SCP命令。在打包游戏中,脚本路径需绝对或相对安装目录。 ##### 方法2: 集成SSH库到UE4(更可靠安全) 直接使用C++第三方库(如libssh2)处理SCP,避免外部脚本。优点:内置在UE4中;缺点:需编译插件。 1. **添加SSH库**: - 下载libssh2库(开源SSH客户端)。 - 集成到UE4作为插件(在项目Plugins目录创建新插件)。 2. **编写C++函数**:实现SCP传输逻辑。 ```cpp // 示例代码片段(需适配您的UE4项目) #include "libssh2.h" void UMySCPHelper::TransferFile() { LIBSSH2_SESSION *session; LIBSSH2_CHANNEL *channel; const char *username = "user"; const char *password = "your_password"; // 推荐使用密钥代替 const char *hostname = "192.168.1.100"; const char *source = "file.txt"; const char *dest = "/home/user/file.txt"; // 初始化会话SCP传输 session = libssh2_session_init(); if (libssh2_session_handshake(session, socket) != 0) { UE_LOG(LogTemp, Error, TEXT("SSH handshake failed")); return; } libssh2_userauth_password(session, username, password); // 或使用libssh2_userauth_publickey_fromfile免密 channel = libssh2_scp_send(session, dest, 0644, size); // 文件传输代码... libssh2_session_disconnect(session, "Normal shutdown"); } ``` **关键优化**:使用`libssh2_userauth_publickey_fromfile`替代密码(SSH密钥免密)[^1][^3]。 3. **在蓝图中调用**:暴露此函数为Blueprint Callable。 #### 步骤3: 注意事项最佳实践 - **安全风险**:避免在UE4代码或脚本中硬编码密码。引用[^5]显示`SendKeys`不稳定,推荐改用SSH密钥对(生成密钥对:`ssh-keygen -t rsa`,复制公钥到服务器)[^1]。 - **稳定性**:长时间文件传输可能失败(如引用[^4][^5]所述)。使用`Run`方法而非`Exec`,并添加超时处理。 - **跨平台兼容**:上述方法适用于Windows;Linux/macOS需调整(如使用bash脚本)。 - **性能**:大型文件传输时,测试在编辑器模式打包游戏中的行为。 #### 相关问题 1. 如何在UE4中实现安全的SSH免密登录?(引用[^1][^3]) 2. UE4执行外部脚本时如何避免cmd窗口挂起?(引用[^4][^5]) 3. 有哪些适用于UE4的第三方网络传输库?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值