Выполнение 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"}
или установив групповую политику на машине.