2012-03-22 26 views
1

遠程服務器上,我需要能夠導入通過C#運行空間駐留在遠程機器上的模塊。導入一個PowerShell模塊中的C#運行空間

要清楚我的意思是:我創建的服務駐留在服務器A上。它使用以下方法爲服務器B創建遠程運行空間。通過運行空間我試圖導入一個模塊在服務器B.

這裏是我用來進行遠程調用的方法:

internal Collection<PSObject> RunRemoteScript(string remoteScript, string remoteServer, string scriptName, out bool scriptSuccessful) 
    { 
     bool isLocal = (remoteServer == "localhost" || remoteServer == "127.0.0.1" || remoteServer == Environment.MachineName); 

     WSManConnectionInfo connectionInfo = null; 

     if (!isLocal) 
     { 
      connectionInfo = new WSManConnectionInfo(new Uri("http://" + remoteServer + ":5985")); 
     } 

     PsHostImplementation myHost = new PsHostImplementation(scriptName); 

     using (Runspace remoteRunspace = (isLocal ? RunspaceFactory.CreateRunspace(myHost) : RunspaceFactory.CreateRunspace(myHost, connectionInfo))) 
     { 
      remoteRunspace.Open(); 
      using (PowerShell powershell = PowerShell.Create()) 
      { 
       powershell.Runspace = remoteRunspace; 

       Pipeline pipeline = remoteRunspace.CreatePipeline(); 

       pipeline.Commands.AddScript(remoteScript); 

       Collection<PSObject> results = pipeline.Invoke(); 

       remoteRunspace.Close(); 

       scriptSuccessful = myHost.ScriptSuccessful; 
       return results; 
      } 
     } 
    } 

「remoteScript」設置爲PowerShell腳本我想跑步。例如:

"Import-Module Modulename;CustomCommand-FromModule -parameter(s) -ErrorAction stop" 

模塊未packedged一起它的一個PSD1,PSM1,並且位於C一堆腳本文件:所述遠程服務器(服務器B)上\\ Powershell的\模塊名和我已經測試並確保它正在調用C:\\ Powershell \ ModuleName目錄中的ModuleName.psd1文件。

裏面的ModuleName.psd1文件是行:

ModuleToProcess = 'ModuleName.psm1' 

不過,我得到一個非常奇怪的錯誤,如果我試圖通過C#的運行空間來運行它。

如果我在下面發作爲參數傳遞給 「remoteScript」:

​​

我收到以下錯誤:

System.Management.Automation.RemoteException: The module to process 'ModuleName.psm1', listed in field 'ModuleToProcess' of module manifest 'C:\Powershell\ModuleName\ModuleName.psd1' was not processed because no valid module was found in any module directory.

該模塊中的「$ ENV的一個存在: PSModulePath的位置,並確實顯示如果你運行:

get-module -listAvailable 

我也試過把完全合格的p運行到psd1文件中的ModuleName.psm1文件。當我這樣做(或者什麼是由以下x0n建議)我得到幾乎相同的錯誤:

The module to process 'C:\Powershell\ModuleName\ModuleName.psm1', listed in field 'ModuleToProcess' of module manifest 'C:\Powershell\ModuleName\ModuleName.psd1' was not processed because no valid module was found in any module directory.

在這一點上,我真的不知道哪裏去了,或者即使這實際上是可能的。我到處找,發現了一些事情,似乎有關,但它從來不是完全一樣,並往往是我已經克服或只是還沒有(據我所知)碰到尚未問題。任何幫助,將不勝感激!謝謝!

+1

嘗試在PSD1使用ModuleToProcess =聯接路徑$ psscriptroot 'modulename.psm1'。 – x0n 2012-03-23 14:09:52

+0

感謝x0n,但我仍然遇到錯誤。我在原文中增加了一些細節。 – Arangarx 2012-03-27 15:43:09

+1

你能通過命令行遠程導入模塊嗎? – 2012-04-19 03:32:34

回答

1

這是一個有點,因爲我解決了這個,所以我耽擱道歉。這個解決方案實際上相當簡單,雖然有點不可思議。

要解決這個問題,在我ModuleName.psd1註釋掉:

ModuleToProcess = 'ModuleName.psm1' 

我把它添加到嵌套模塊來代替:

NestedModules = Join-Path $psscriptroot 'ModuleName.psm1' 

坦率地說,我不知道是什麼原因讓這對模塊加載成功,但它爲我工作。

一段時間,因爲我解決了這個所以它可能有一些微小的一步,我錯過了在這裏它已經有點。如果這不適合你,讓我知道你遇到了什麼問題,然後我可以讓你知道,如果這是額外的我不得不做的。但我相當確定這只是一切。

1

我懷疑你需要做兩件事情:

  1. 使用絕對路徑.psd1文件:否則只能模塊$env:PSModulePath發現將被視爲(這並不重要的腳本做負載運行的位置)。

  2. 確保您可以加載遠程腳本。除非已簽名,否則缺省或RemoteSigned執行策略將阻止遠程腳本。

+0

感謝您的反饋。你提到的兩個步驟絕對是任何人需要做的事情(這些事情我已經確定是我的故障排除的一部分),但這些都不是最終的問題。我將發佈我的最終解決方案。 – Arangarx 2012-05-24 17:23:42

1

我發現,如果你的模塊是建立在一個新的.NET運行時(比如.NET 4.0),你試圖將其加載到PowerShell的2.0(基於.NET 3.5),這可能是一個問題。要解決此問題,您需要確保在.net 4中加載PowerShell或調用進程。0 clr。

您可以通過添加enty在* .exe.config(創建powershell.exe.config如果不存在的話)支持的運行時適用的做到這一點。

我測試了這對上述問題的偉大工程。

+0

我已經解決了這個問題(我剛剛還沒有發佈解決方案,但我的錯誤),但這聽起來像是一件好事,只要嘗試再次出現問題就可以嘗試。謝謝! – Arangarx 2012-05-24 17:26:10

相關問題