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

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

我们有一个基本的 powershell 脚本,它尝试在远程计算机上执行 SQLPlus.exe。远程计算机未安装 Oracle Instant 客户端,但我们已将所有必要的 dll 捆绑在远程文件夹中。例如,我们在目录 C:\temp\oracle 中有 sqlplus.exe 和依赖项。

如果我导航到远程服务器上的该路径并执行 sqlplus.exe,它就会正常运行。我得到了用户名的提示。

如果我走:

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 }

这产生了同样的结果。

错误代码没有什么帮助,而且非常令人沮丧,因为当我登录到机器时它确实有效。powershell remoting 做了什么导致它不起作用?

答案1

我觉得这像是环境问题。为什么无法在远程系统上正确安装客户端?

有没有办法在调用 SQL*Plus 之前从 powershell 脚本转储您的环境?如果是这样,请将其与您登录时的环境进行比较,它就可以正常工作了。也许是这样的:

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 语句中似乎缺少双引号。我认为这是一个转录错误。

答案2

错误 57 通常与内存问题有关。虽然输出不是很有用,并且使用远程处理会使问题复杂化,但这可能是由远程 shell 可用的内存(具体而言是远程计算机上的 MaxMemoryPerShellMB 值)引起的。

可以使用以下方法检查

winrm get winrm/config

结果接近尾声。在我们的例子中,这个值被设置为 150,而 512 对于没有失败的目标来说已经足够了。可以使用以下命令设置该值

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

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

相关内容