2013-08-29 53 views
2

看到我的代碼如下。該腳本創建變量$ backupFile。如何在下一個語句中將該變量用作New-Item表示的路徑參數的值?如何在C#中的PowerShell.AddParameter方法中使用powershell變量?

 using (var ps = PowerShell.Create()) 
     { 
      ps.RunspacePool = _runspacePool; 
      ps.AddScript("$backupFile = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(),'{0}.bak')".FormatInvariant(databaseName)); 
      ps.AddStatement(); 
      ps.AddCommand("New-Item") 
       .AddParameter("Force") 
       .AddParameter("ItemType", "File") 
       .AddParameter("Path", /* How to use $backupFile?? */)); 
      ps.Invoke(); 
     } 

回答

0

儘管Keith和Eris的回答很有幫助,但我認爲這對其他讀者來說會更有幫助,以我自己的結論撰寫自己的答案。

對我最初的問題的答案似乎是,這是不可能的(至少我們迄今沒有找到一種方法)。

因此,AddCommand(帶有AddArgument,AddParameter(s))的用例似乎是用一個或多個命令組成一個流水線,然後得到結果作爲Invoke方法的輸出。最後,只要不相互依賴,您可以添加其他管道(由AddStatement分隔)。您將在Invoke方法的輸出集合中獲得多個結果。如果你想執行2個管道,第二個依賴於第一個的結果(並且不可能通過管道傳遞結果(如我的代碼示例中),我認爲有兩個選擇:1)調用調用對於第一個管道,並在組成第二個管道時使用輸出。或者2)編寫腳本(例如使用StringBuilder)並用一個Invoke執行。

當您使用遠程連接時,後面的選項可能更可取,因爲這只是一個對遠程服務器的調用。

2

在您調用第一個腳本之前,變量將不可用。試試這個:

ps.AddScript("$backupFile = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(),'{0}.bak')".FormatInvariant(databaseName)); 
ps.Invoke(); 
ps.Commands.Clear(); 
var backupFile = ps.Runspace.SessionStateProxy.PSVariable.Get("backupFile"); 
ps.AddCommand("New-Item") 
    .AddParameter("Force") 
    .AddParameter("ItemType", "File") 
    .AddParameter("Path", backupFile)); 
ps.Invoke(); 

如果您雖然走這條路,我不認爲你可以使用RunspacePool因爲你很可能得到各Invoke()之間不同的運行空間。在這種情況下,該變量將不可用於其他運行空間。在這種情況下你真的需要使用RunspacePool嗎?如果你這樣做,爲什麼不只是做C#的第一位:

var backupFile = Path.Combine(Path.GetTempPath(), databaseName +'.bak'); 
+0

使用RunspacePool的AFAIK是遠程連接的首選方式。這就是我使用RunspacePool的原因。這也是我無法在C#中完成第一步的原因,因爲這將在本地計算機上執行。 – Jaap

+0

一個更基本的問題是,AddCommand的用例是什麼。似乎你不能把它的結果分配給一個變量。所以你只能在Invoke的輸出中捕獲它。所以在我看來,對於Powershell類,您應該一次執行一個管道。因此,具有AddCommand(),AddStatement(),AddCommand(),AddStatement,...的序列不是要走的路(可能期望它是獨立的命令)。在每個命令之後調用Invoke在我看來也不是遠程處理情況下的最佳方式。那麼只是建立一個腳本將是最好的? – Jaap

+0

AddCommand用於將命令添加到當前「正在建設中」的管道中。順便說一句,你沒有提到遠程處理,我沒有看到你的代碼中配置了遠程連接的任何地方。 :-)但是,爲了回答你的問題,是的,最好把$ backupFile邏輯和New-Item命令放在你用AddScript()添加的腳本字符串中,然後調用Invoke()。 –

相關問題