在Powershell Invoke-Command语句中针对远程计算机执行Oracle SQLPlus

我们有一个基本的powershell脚本,试图在远程机器上执行SQLPlus.exe。 远程没有安装Oracle Instant客户端,但是我们已经将所有必需的dll捆绑在一个远程文件夹中。 例如,我们在目录C:\ temp \ oracle中有sqlplus.exe和依赖关系。

如果我导航到远程服务器上的path,并执行sqlplus.exe它运行得很好。 我得到提示input用户名。

如果我走:

Invoke-Command -comp remote.machine.host -ScriptBlock { C:\temp\oracle\sqplus.exe } 

我得到以下内容:

 Error 57 initializing SQL*Plus + CategoryInfo : NotSpecified: (Error 57 initializing SQL*Plus:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError Error loading message shared library 

认为这可能是一个PATH问题我尝试了以下内容:

 Invoke-Command -comp remote.machine.host -ScriptBlock { $env:ORACLE_HOME= "C:\temp\oracle"; $env:PATH = "$env:ORACLE_HOME; C:\temp\oracle\sqlplus.exe } 

这有同样的结果。

错误代码不是很有帮助,而且是非常令人沮丧的,因为它在我login到计算机时起作用。 什么是PowerShell远程做这使这不工作?

这对我来说就像是一个环境问题。 为什么不能在远程系统上正确安装客户端?

有什么方法可以在调用SQL * Plus之前从powershell脚本中转​​储环境? 如果是这样,请在login时将其与您的环境进行比较,然后运行。 也许是这样的:

 Invoke-Command -comp remote.machine.host -ScriptBlock { $env:ORACLE_HOME= "C:\temp\oracle"; $env:PATH = "$env:ORACLE_HOME"; set > c:\temp\oracle\set.txt } 

注意:在我添加的PATH语句中似乎缺less一个双引号。我认为这是一个抄写错误。

错误57通常与内存问题有关。 尽pipe输出并不是非常有用,而使用远程处理会使问题变得复杂,但可能是远程shell可用的内存,特别是远程计算机上的MaxMemoryPerShellMB值。

这可以用来检查

 winrm get winrm/config 

结果接近尾声。 在我们的例子中,这个数字被设定为150,而对于那些没有失败的目标,则是512。 该值可以用来设置

 winrm set winrm/config @{MaxMemoryPerShellMB="512"} 

或通过在机器上设置组策略。