Выполнение Oracle SQLPlus в операторе Powershell Invoke-Command на удаленной машине

У нас есть базовый сценарий powershell, который пытается выполнить SQLPlus.exe на удаленной машине. На удаленном компьютере не установлен клиент Oracle Instant, но мы собрали все необходимые библиотеки в удаленной папке. Например, у нас есть sqlplus.exe и зависимости в каталоге C:\temp\oracle.

Если я перехожу по этому пути на удаленном сервере и запускаю 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

Думая, что это потенциально проблема ПУТИ, я попробовал следующее:

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

Это имело тот же результат.

Код ошибки не очень полезен и очень расстраивает, поскольку он работает, когда я вхожу в систему. Что делает удаленное взаимодействие PowerShell, что делает это не работает?

2 ответа

Это пахнет для меня как проблема окружающей среды. Почему вы не можете правильно установить клиент в удаленной системе?

Есть ли способ вывести свою среду из сценария powershell непосредственно перед вызовом SQL*Plus? Если это так, сравните это с вашей средой, когда вы вошли в систему, и она работает. Возможно, что-то вроде этого:

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 отсутствует двойная кавычка. Я предполагаю, что это ошибка транскрипции.

Ошибка 57 часто связана с проблемами памяти. Хотя вывод не очень полезен, а использование удаленного взаимодействия усложняет проблему, он может быть связан с объемом памяти, доступной для удаленной оболочки, в частности со значением MaxMemoryPerShellMB на удаленной машине.

Это можно проверить с помощью

winrm get winrm/config

и результат близок к концу. В нашем случае это было установлено на 150, тогда как 512 было достаточно для целей, которые не потерпели неудачу. Значение может быть установлено с помощью

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

или установив групповую политику на машине.

Другие вопросы по тегам